C'est un exemple de WriteProcessMemory pour patcher un executable en mémoire.
Je n'ai pas trouver d'exemple sur ce site, donc je pense que sa peut servir au débutant.
J'ai fait ce programme pour apprendre un peu l'assembleur et disont que j'ai un peu galéré, j'ai commencer l'asm il y a 2j.
J'attend vos critiques :)
Source / Exemple :
.486
.model flat, stdcall
option casemap :none ; case sensitive
uselib MACRO libname
include libname.inc
includelib libname.lib
ENDM
include windows.inc
uselib user32
uselib kernel32
uselib comctl32
IDC_PATCH equ 1003
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
hInstance dd ?
WindCap db "Démineur",0 ;Le caption de l'application a patcher
Erreur db "Erreur !", 0 ; Le titre de la msgbox d'erreur
PasTrouver db "Erreur le Démineur n'a pas été trouver",0 ;Le contenu de la msgbox d'erreur
;En rapport avec l'application a patcher en mémoire
PID dd ? ; ID du Processus
PokeAddress dd 1002FF5h ;Adresse à Patcher
PokeValue db 090h ;Bytes à Patcher
db 090h
db 090h
db 090h
db 090h
db 090h
PokeNb db 6 ;Nombre de Bytes à Patcher
.code
start:
invoke InitCommonControls ;Pour initialiser le theme Xp
invoke GetModuleHandle, NULL ; Connaître le handle de la fenêtre
invoke DialogBoxParam, hInstance, 101, 0, ADDR DlgProc, 0 ;Affiche la fenêtre
invoke ExitProcess, eax ;Ferme la fenetre
; -----------------------------------------------------------------------
DlgProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.if uMsg == WM_COMMAND
.if wParam == IDC_PATCH
;Cherche la fenetre
invoke FindWindow, NULL, offset WindCap
;Si il y n'y a pas eu d'erreur
.If eax != NULL
;Sauvegarde le handle de la fenetre
mov ebx, eax
;Récupère le handle du processus
Invoke GetWindowThreadProcessId, ebx, offset PID
;Ouvre le processus
Invoke OpenProcess, PROCESS_ALL_ACCESS,NULL, PID
;Sauvegarde le handle du processus ouvert
mov ebx, eax
;Prépare le terrain pour ecrire
Invoke VirtualProtectEx, ebx, PokeAddress, 6, PAGE_EXECUTE_READWRITE, 00
;Ecrit dans le processus
Invoke WriteProcessMemory, ebx, PokeAddress, offset PokeValue, 6, NULL
;Se détache du processus
Invoke CloseHandle, ebx
;Fait un bip :)
invoke Beep,1000,30
; Si la fenêtre n'est pas trouver alors
.else
;on met un ptit bip :P
invoke Beep,100,30
;On affiche l'erreur
invoke MessageBox, hWin, addr PasTrouver, addr Erreur, MB_OK
.endif
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog,hWin,0
.endif
xor eax,eax
ret
DlgProc endp
end start
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.