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

8 yorum:

taha dedi ki...

Sonunda.. Açıklamayı şimdi okuyacagım muhakkak takılacagımız yerler olacak buralardan ayrılma 313. :D

M. Fatih Demir dedi ki...

Basit bir soru ne derece assembly bilmek gerekiyor bunlar için?

313 dedi ki...

bu noktada bir assembly bilgisine gerek yok ama ollydbg ile çalışırken belirli bir düzeyde gerekli. ollydbg de dediğim gibi dllyi inject edicek acık ararken veya koda suanki adresleri bulurken vs kullanılıyor.

Murat Uz dedi ki...

Eline ve aklına sağlık. Şu an bu işlerle uğraşmıyorum ama boş vaktim olduğunda bakıcam.

taha dedi ki...

Peki dll inject etcez de :D dll nası hazırlıycaz? :D

Hyperion dedi ki...

Part 2 gelirse sevinirim

Adsız dedi ki...

Bu kodlar hangi dil

taha dedi ki...

Yeni makale gelmeyeli ep ey oldu..

Yorum Gönder