Quote:
Originally Posted by HardCore.1337
Bei Inline Assembler kannst du Assembler Code direkt in deine Programmiersprache (z.B. C++, Delphi...) einfügen. So zu sagen Assemblercode und der allgemeine Code vermischt. Bei AutoIt geht das aber nicht.
|
Quote:
Originally Posted by Akorn
Und das ist der grund warum das in Autoit nicht möglich ist weil man für Esp hacks hooks benutzt, man allerdings mit AutoIt nicht hooken kann.
|
woher habt ihr denn diese weisheiten?
wenn man sich mit sprachen nicht auskennt, sollte man nicht so schnell mit abwertenden sprüchen daherkommen.
asm ist eine einfache sprache. man kann in jeder sprache jede andere sprache einbauen.
und da autoit in der lage ist winapis zu nutzen, ist der funktionsumfang ähnlich dem von c++.
selbstverständlich müsste man sich zunächst die benötigten asm funktionen definieren, kann jedoch mithilfe der in der kernel32.dll gegebenen funktionen leicht auch kompliziertere hacks realisieren.
dazu braucht man sich nur per VirtualAllocEx im targetprocess platz für seine eigenen funktionen schaffen.
auf diese art und weise kann man leicht funktionen in den neu geschaffenen raum umleiten und dort durch eigene erweitern/ersetzn.
auch sofortiges assemblieren vom eigenem code im targetprocess ist in sprachen die in der lage sind winapis zu nutzen kein problem. als grundlage hierfür kann man die CreateRemoteThread funktion nutzen.
ich kann also in autoit wie auch in jeder anderen sprache die in der lage ist winapis zu nutzen sowohl inline assmabling als auch codecaves in anderen processen nutzen.
habe leider cod noch nie gespielt und kann nicht darüber sagen aber hier mal ein kleines beispiel wie ich zb eine funktion aus dem perfect world client nutzen kann:
Code:
Func SelectMob($id)
Local $pRemoteThread, $vBuffer, $loop, $result, $OPcode
; --- save the position of the allocated memory ---
$pRemoteMem = DllCall($kernel32, 'int', 'VirtualAllocEx', 'int', $mid, 'ptr', 0, 'int', 0x46, 'int', 0x1000, 'int', 0x40)
; --- build up the asm code ---
; 0046061D A1 6C3E9F00 MOV EAX,DWORD PTR DS:[9F3E6C]
; 00460622 57 PUSH EDI <---- EDI Contains Mob-ID
; 00460623 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20]
; 00460626 81C1 EC000000 ADD ECX,0EC
; 0046062C E8 8F961800 CALL elementc.005E9CC0
$OPcode &= '60' ; pushad
$OPcode &= 'A1'&_hex($base) ; mov eax, [base]
$OPcode &= '68'&_hex($id) ; push mob-id
$OPcode &= '8B4820' ; mov ecx, [eax+0x20]
$OPcode &= '81C1'&_hex(0xEC) ; add ecx, 0xEC
$OPcode &= 'E8'&_hex($select_call-$pRemoteMem[0]-5-StringLen($OPcode)/2) ; call select_call
$OPcode &= '61' ; popad
$OPcode &= 'C3' ; retn
; --- enter the asm code to to a dllstruct, which can be used with WriteProcessMemory ---
$vBuffer = DllStructCreate('byte[' & StringLen($OPcode) / 2 & ']')
For $loop = 1 To DllStructGetSize($vBuffer)
DllStructSetData($vBuffer, 1, Dec(StringMid($OPcode, ($loop - 1) * 2 + 1, 2)), $loop)
Next
; --- now letz write the code from our dllstruct ---
DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $mid, 'int', $pRemoteMem[0], 'int', DllStructGetPtr($vBuffer), 'int', DllStructGetSize($vBuffer), 'int', 0)
; --- now we run the asm code we've just written ---
$hRemoteThread = DllCall($kernel32, 'int', 'CreateRemoteThread', 'int', $mid, 'int', 0, 'int', 0, 'int', $pRemoteMem[0], 'ptr', 0, 'int', 0, 'int', 0)
; --- wait till the thread did his job ---
Do
$result = DllCall('kernel32.dll', 'int', 'WaitForSingleObject', 'int', $hRemoteThread[0], 'int', 50)
Until $result[0] <> 258
; --- close everything we've opened ---
DllCall($kernel32, 'int', 'CloseHandle', 'int', $hRemoteThread[0])
DllCall($kernel32, 'ptr', 'VirtualFreeEx', 'hwnd', $mid, 'int', $pRemoteMem[0], 'int', 0, 'int', 0x8000)
Return True
EndFunc
wie man sieht ist es teilweise nicht leicht funktionen wie beispielweise calls in autoit umzusetzen, da dort der hex code nicht ohne weiteres erstellt werden kann, jedoch lässt sich mit einem gewissen hintergrundwissen über asm auch dies bewerkstelligen.
habe hier jetzt mal auf das definieren der asm funktionen verzichtet und direkt die hexcodes genutzt, was das ganze etwas unübersichtlicher macht, aber auch den code deutlich kleiner hält =)