DLL-Inject (PART I)

Yazımı okuyunuz;  06 HAZIRAN 2008 CUMA
bİR KAÇ GÜN İÇİNDEMİ DEMİŞİM ? :d

Neyse işin aslı blog başıboş kalmasın dedim, birşeyler yaziyim. Madem tamamını getiremedik, parça parça part part bölük pörçük :D ekleyelim, vakti gelince part 2 3 vs de gelir inş. (Boş zamanlarımı özledim! :D)

Konumuz dll-inject. Basitçe dll-inject: o an çalışan bir process(exe) nin hafızasına bir yere kendi dllmizi kaynatmak, çaktırmadan araya sokuşturmak gibi bişey. Bu sokuşturduğumu dll de tabiki o process ile etkileşime geçmek için hazır vaziyete geliyor. Peki nedir bunun avantajı ? cidden bilmiyorum :P şaka :P bunu yapmamızın amacı şudur: ko yu örnek alarak anlatiyim basit olsn.

Xtrap diye bir icat var, ve biz ko da hile çalıştırmak istiyoruz. Xtrap ko açıkken o sıra bütün programları kontrol edecektir. Eğer sistemimizde açık olan bir program konun memorysine dokunmaya yeltenirse, 3rd party tools hack detectedı ekrana yapıştırır ve oyunu kapatır :D Burdaki mantık şudur, xTrap konun hafızasına dışarıdan gelebilecek tüm erişimleri durdurur. Ancakkkk.... Memory e erişen zaten ko nun kendisiyse bir problem olmayacaktır :) yani inject ettiğimiz dll. Anlatmak istediğim, dll yi konun memorysine soktuğumuzdan xTrap o dll yi ko ya ait sanacaktır. (yani en azından bi denemek lazım :P) eğer hile engelleme programı çok kabiliyetliyse belkide o dll nin ko ya ait olmadığını anlar ancak bunuda aşmanın yolları vardır en basitinden ko nun açtığı dll lerden biri gibi gösterilebilir. (mantıken yararlı olmayacaktır çünkü hile engelleme programı saf değilse crc-check veya header-read yapıp yine anlar) Yani bunlar bizi şuraya yönlendiriyor: burada önemli konu aslında dll yi inject etmek değildir. DLL yi inject edebilmektir. Şurdan bir örnek veriyim. Eski kohack i hatırlarsanız, o zamanlar koda HackShield koruması vardı. Ve biz karakter select ekranında koHacki açıyorduk oyuna öyle girersek çalışıyordu. Bu ne demektir ? karakter select ekranında bir açıktan faydalanılmış. Yani dll bir şekilde sokuşturulmuş demektir. (Bu açık her şekilde olabilir mantık zorlamayla beraber ollydbg yol gösterici olacaktır.) O sırada hackshield hile kontrolü yapmıyordur, veya o sırada dll inject edildiğinde ko yu kapatamıyor, hata veremiyordur veya fill with nop vs vs... 

Inject ettiğimiz dll dialogsuz olabilir, hotkeylerle çalışabilir ancak dialoglu olması (HF) tarzında daha mantıklıdır. Inject edilmiş DLL nin bir avantajı daha vardır, daha hızlı çalışacak, adreslere daha hızlı erişecektir, yani dışarıdan çalışan bir exe ye göre. (şuan kullanılan hile programları)

Neyse, bu part için bu kadar yeterli sanırım, aşşağıda verdiğim kodlar DLL-Inject UDF sidir. Önümüzdeki partda inject ettiğimiz dll yi çağırmayı ve komut yollatmayı anlatıcam. Bunu bir isimde kaydedip include vererek kullanabilirsiniz.

Şunu söyleyebilirimki bu konu şuan gözümde baya uzun görünüyor. bikaç aşama sonra ollydbg makalesi vs hazırlamam gerekicek gibi. Neyse önümüzdeki günlerde görüşürüz. Çalışmalarınızda başarılar.

Tek isteğim şudurki bu script yanlış ellere geçmesin, lütfen heryerde paylaşmayın...
Func _InjectDll($hWnd, $dllpath)
   ;girdilerin doğru olup olmadığı kontrolü, hwnd varmı yoqmu vs...
   If $hWnd <= 0 Then
      SetError(-1)
      Return False
   ElseIf StringLen($dllpath) <= 4 Or StringRight($dllpath, 4) <> ".dll" Then
      SetError(-2)
      Return False
   EndIf

   Local $pid, $pHandle, $pLibRemote, $modHandle, $LoadLibraryA, $hThread

   ;inject için gereken dll.
   Local $kernel32 = DllOpen("kernel32.dll")

   ;hwndmizin process id sini bulma.
   $pid = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd, "int_ptr", 0)
   If IsArray($pid) Then
      $pid = $pid[2]
   Else
      SetError(-3)
      Return False
   EndIf

   ;hwndnin memorysine erişim.
   $pHandle = DllCall($kernel32, "int", "OpenProcess", "int", 0x1F0FFF, "int", 0, "int", $pid)
   If IsArray($pHandle) And $pHandle[0] > 0 Then
      $pHandle = $pHandle[0]
   Else
      SetError(-4)
      Return False
   EndIf

   $pLibRemote = DllCall($kernel32, "int", "VirtualAllocEx", "int", $pHandle, "short", 0, "int", 0x1000, "int", 0x1000, "int", 4)
   If IsArray($pLibRemote) Then
      If $pLibRemote[0] > 0 Then
         ;konsol kontrolü, debug.
         ConsoleWrite("0x" & Hex($pLibRemote[0], 8) & @CR)
         $pLibRemote = $pLibRemote[0]
      Else
         SetError(-5)
         Return False
      EndIf
   Else
      SetError(-6)
      Return False
   EndIf

   For $i = 0 To StringLen($dllpath)
      $ret = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $pHandle, "int", $pLibRemote + $i, "int_ptr", Asc(StringMid($dllpath, $i + 1, 1)), "int", 1, "int", 0)
      If IsArray($ret) Then
         If $ret[0] = 0 Then
            SetError(-7)
            Return False
         EndIf
      Else
         SetError(-8)
         Return False
      EndIf
   Next

   $modHandle = DllCall($kernel32, "long", "GetModuleHandle", "str", "kernel32.dll")
   If IsArray($modHandle) Then
      If $modHandle[0] > 0 Then
         $modHandle = $modHandle[0]
      Else
         SetError(-9)
         Return False
      EndIf
   Else
      SetError(-10)
      Return False
   EndIf

   $LoadLibraryA = DllCall($kernel32, "long", "GetProcAddress", "long", $modHandle, "str", "LoadLibraryA")
   If IsArray($LoadLibraryA) Then
      If $LoadLibraryA[0] > 0 Then
         $LoadLibraryA = $LoadLibraryA[0]
      Else
         SetError(-11)
         Return False
      EndIf
   Else
      SetError (-12)
      Return False
   EndIf

   $hThread = DllCall($kernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $LoadLibraryA, "long", $pLibRemote, "int", 0, "int", 0)
   If IsArray($hThread) Then
      ConsoleWrite($hThread[0] & @CR)
      If $hThread[0] > 0 Then
         $hThread = $hThread[0]
      Else
         SetError(-13)
         Return False
      EndIf
   Else
      SetError(-14)
      Return False
   EndIf

   DllCall($kernel32, "int", "VirtualFreeEx", "int", $pHandle, "int", $pLibRemote, "int", 0x1000, "int", 0x8000)
   DllCall($kernel32, "int", "CloseHandle", "int", $hThread)
   DllCall($kernel32, "int", "CloseHandle", "int", $pHandle)

   DllClose($kernel32)

   Return True
EndFunc