Retour


invoke WriteProcessMemory 	, DBEvent.u.CreateProcessInfo.hProcess	process dans lequel on écrit en mémoire 
	   			, context.regEip  addr où on commence à écrire
				, addr buffer	  adresse du buffer où on a placé nos données     
				, 2	   	nombre d'octets à écrire 
				, NULL	   nombre d'octets réellement écrits.(ici on s'en fout) 


On a déjà récupéré le context du programme cible et on la recopié dans notre structure 
'context'.

   	 	  |regEbp
		  |regEip = EIP du programme cible au moment où on s'est introduit dans la cible 
context	(de type  |regCs 
  	  	  |regFlag 
CONTEXT_CONTROL)  |regEsp 
		  |regSs 

Donc context.regEip est la valeur de la copie de EIP dans notre context donc de l'EIP de la 
cible elle-même.
addr buffer est l'endroit où on a stocké les deux 90h (les deux nop) pour pouvoir les écrire. 
Et le temps est venu.
2 Vous avez compris.
NULL on s'en fout de savoir combien de bytes ont bien été écrits.

Maintenant : DBEvent.u.CreateProcessInfo.hProcess...
On a bien trouvé a quel endroit on doit écrire et ce qu'il y a à écrire, Mais reste a savoir 
dans quel programme ou plutôt Process.


Bon ici c'est un cas simple, quelquechose que vous ne verrez jamais ailleurs, car quand on 
lance la cible, elle tourne en ronde sur son JMP. Donc EIP qui représente l'adresse de la 
prochaine instruction à exécuter est FIXE. Par la suite, quelque soit le moment où on 
lance le Memory Patch, le EIP de la cible n'a rien de hasardeux!!! Le Memory Patch récupère 
la valeur de l'EIP dans son context (regEip). Et donc on a plus qu'à écrire (WriteProcessMemory) 
ce qu'il faut à l'adresse ayant la valeur regEip soit LE EIP de la cible.


Comprenez bien que si il y avait eu un NOP au-dessus du JMP et que ce jump retournait sur NOP 
alors le EIP de la cible aurait fait un roulement entre 'EIP du nop' et 'EIP du jump', donc là, 
ça n'aurait pas pu marcher, on bien plus exactement : une chance sur deux que ça marche...

Le mieux, c'est toujours de se débrouiller à récupérer l'Image Base de la cible pour avoir un 
point d'ancrage, une base justement, et de se déplacer dans le programme à partir de ce point 
connu.


Retour