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)