Trainer démineur | exemple de writeprocessmemory

Description

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

Codes Sources

A voir également

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.