Retour


MEMORY PATCH (Partie 2)
MEMORY REVERSE ENGENEERING




Transformons notre Memory Patch pour qu'il fonctionne suivant le second principe. Cette fois-ci, c'est lui qui sera lancé le premier et c'est lui aussi qui lancera la cible pour la débugguer.

Dans cet exemple je vais utiliser une structure OPENFILENAME pour créer une de ces boîtes de dialogue qui servent spécialement à choisir un fichier ou programme. Je passe sur ce point car il ne nous concerne pas. Contentez-vous du fait que vous pourrez toujours vous en reservir où vous voulez, un bon copier fera l'affaire.



.386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\comdlg32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\user32.lib .data AppName db "Memory Patch: CreateProcess",0 ;EXPLICATION 0 ofn OPENFILENAME <> ;EXPL1 FilterString db "voici la cible",0,"win.exe",0 ;EXPL2 db "Fichiers Executables",0,"*.exe",0 db "Tous les Fichiers",0,"*.*",0,0 ProcessInfo db "Handle du Fichier: %lx ",0dh,0Ah ;EXPL3 db "Handle du Process: %lx",0Dh,0Ah db "Handle du Lien: %lx",0Dh,0Ah db "Image Base: %lx",0Dh,0Ah db "Start Address: %lx",0Dh,0Ah db "---------------------------------------",0Ah db "Offset a patcher: %lx ",0dh,0Ah db "ecriture de: %lx",0 offset1 dd 004010D8h ;EXPL4 patch1 dw 9090h .data? buffer db 512 dup(?) ;EXPL5 startinfo STARTUPINFO <> ;EXPL6 pi PROCESS_INFORMATION <> ;EXPL7 DBEvent DEBUG_EVENT <> ;EXPL8 .code start: mov ofn.lStructSize,SIZEOF ofn mov ofn.lpstrFilter, OFFSET FilterString mov ofn.lpstrFile, OFFSET buffer ;EXPL9 mov ofn.nMaxFile,512 mov ofn.Flags, OFN_FILEMUSTEXIST or \ OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY invoke GetOpenFileName, ADDR ofn ;EXPL10 .if eax==TRUE invoke GetStartupInfo,addr startinfo ;EXPL11 invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, \ ;EXPL12 DEBUG_PROCESS+ DEBUG_ONLY_THIS_PROCESS, NULL, NULL, \ addr startinfo, addr pi .while TRUE invoke WaitForDebugEvent, addr DBEvent, INFINITE ;EXPL13 .break .if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT ;EXPL14 .if DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT ;EXPL15 invoke wsprintf, addr buffer, addr ProcessInfo, \ ;EXPL16 DBEvent.u.CreateProcessInfo.hFile, \ DBEvent.u.CreateProcessInfo.hProcess, \ DBEvent.u.CreateProcessInfo.hThread, \ DBEvent.u.CreateProcessInfo.lpBaseOfImage, \ DBEvent.u.CreateProcessInfo.lpStartAddress, \ offset1, \ patch1 invoke MessageBox,0, addr buffer, addr AppName, \ ;EXPL17 MB_OK+MB_ICONINFORMATION invoke WriteProcessMemory, DBEvent.u.CreateProcessInfo.hProcess, \ offset1, addr patch1, 2, NULL ;EXPL18 .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT ;EXPL19 .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT invoke ContinueDebugEvent, DBEvent.dwProcessId, \ DBEvent.dwThreadId, \ DBG_CONTINUE .continue .endif .endif invoke ContinueDebugEvent, DBEvent.dwProcessId, \ ;EXPL20 DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED .endw .endif invoke CloseHandle,pi.hProcess ; ou DBEvent.u.CreateProcessInfo.hProcess ;EXPL21 invoke CloseHandle,pi.hThread invoke ExitProcess, 0 end start


Retour
(Par Morgatte)