begin process at 2010 03 19 15:10:30
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Windows

 > TRAINER DÉMINEUR | EXEMPLE DE WRITEPROCESSMEMORY

TRAINER DÉMINEUR | EXEMPLE DE WRITEPROCESSMEMORY


 Information sur la source

Note :
Aucune note
Catégorie :Applications Windows Classé sous :trainer, WriteProcessMemory, démineur Niveau :Débutant Date de création :30/12/2007 Date de mise à jour :31/12/2007 00:21:07 Vu / téléchargé :4 013 / 109

Auteur : Rudy3212

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • .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
.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


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

31 décembre 2007 00:21:07 :
Optimization en utilisant un peu plus les registres

 Sources de la même categorie

Source avec Zip Source avec une capture BASE DE REGISTRE ET TRANSFERE DE BMP DANS SYSTEM32 par vincent2795
Source avec Zip RÉSOUDRE LES PROBLÈMES DE VERSIONS DU SYSTÈME OU DE DLL par ToutEnMasm
Source avec Zip DEXPLORE INTERFACE HELP2 MICROSOFT DOCUMENT EXPLORER par ToutEnMasm
Source avec Zip DEXPLORE INTERFACE HELP2 MICROSOFT DOCUMENT EXPLORER par ToutEnMasm
Source avec Zip Source avec une capture ANALYSEUR DE TRAFIC (WINPCAP) par ORdream

Commentaires et avis

Commentaire de BruNews le 30/12/2007 20:08:53 administrateur CS

Tu as commencé ce SABIR il y a 2 jours, pas avec ça que tu sauras écrire un asm optimisé, c'est pourtant le seul but à avoir quand on écrit en asm.

mov pHandle, eax
et derrière tu iras combien de fois reprendre ce handle sur une adresse mémoire...
Il y a des registres à employer !!!

Commentaire de Rudy3212 le 31/12/2007 00:23:22

Voila j'ai modif un peu, une fois j'avait essayer d'utiliser directement eax dans un autre invoke sa planter j'avait du me gourrer, je croyait que c'était alors pas possible donc je stocker.

Par contre pour le PID j'y arrive pas sa plante.

Merci pour tes conseils brunews si tu a d'autres truc a dire :)

Commentaire de BruNews le 31/12/2007 01:37:40 administrateur CS

Lache toutes ces macros, .if .else et autres biniouteries et écris du vrai asm en gérant toi meme la stack.
EBX est à restaurer, tout comme ESI, EDI et EBP en sortie de bloc (fonction) sous Windows.

.if wParam == IDC_PATCH
en ASM:
cmp dword ptr[esp+12], IDC_PATCH
je LABEL
etc...

Il ne faut surtout pas voir l'ASM comme un snobisme ou une caste dont on peut faire partie. Quand on le fait c'est dans le but d'obtenir mieux que ce qu'un compilo C produirait sinon totalement inutile et donc nuisible. Je t'assure que dans ton exemple VC++ fera très nettement mieux pour un effort développeur nettement moindre.

Commentaire de Rudy3212 le 31/12/2007 13:17:16

Peut tu détailler ce que veut dire dword ptr[esp+12] ?

J'ai un autre problème
si je fait un
Push 6
sa marche mais si je met
PokeNb       db  6
dans les data et que je met
push offset PokeNb
Je n'ai pas d'erreur mais sa ne marche pas et push PokeNb marche pas non plus sa compile pas.

Pourrai tu m'expliquer quand il faut mettre offset ou pas j'ai pas car je sais jamais.

Commentaire de BruNews le 31/12/2007 13:36:27 administrateur CS

push offset xxx
met l'ADRESSE indiquée sur la stack
bien entendu on met l'adresse sur stack quand la fonction appelée attend une adresse, rien que du normal.
Sur system 32 bits, l'adressage se fait par 4 octets donc
push QuatreOctets

PokeNb db  6
xor eax, eax
mov al, PokeNb
ou alors: movzx eax, PokeNb
ou alors... tant de possibilités.
et puis: push eax

Commentaire de BruNews le 31/12/2007 13:47:06 administrateur CS

dword ptr[esp+12]
lecture ou écriture DWORD à l'adresse indiquée, ici [esp+12]
on ne lit ou écrit qu'à des adresses correctement alignées:
BYTE no prob
WORD 2
DWORD 4
xmm 8 ou 16 selon taille adressée

Commentaire de Rudy3212 le 31/12/2007 14:01:43

Si je fait un
mov al, PokeNb

et après un
push al
J'ai une erreur "byte register cannot be first operand"

Je vait allez lire quelque tuto, car bon je galère un peu.
J'ai pas compris ce que ta dit au dessus.

pk wParam vaut ptr[esp+12]

Commentaire de BruNews le 31/12/2007 14:20:06 administrateur CS

push al
alors que je venais d'écrire plus haut:
Sur system 32 bits, l'adressage se fait par 4 octets donc
push QuatreOctets !!!

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales