MEMORY PATCHER

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 5 juil. 2003 à 18:35
PiXator Messages postés 16 Date d'inscription lundi 27 mai 2002 Statut Membre Dernière intervention 12 novembre 2004 - 13 nov. 2004 à 11:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/11054-memory-patcher

PiXator Messages postés 16 Date d'inscription lundi 27 mai 2002 Statut Membre Dernière intervention 12 novembre 2004
13 nov. 2004 à 11:30
la raison est que au lancement du prog le 0x75 n'est pas initialiser
tant que on n'a pas un 0x75 on attent et on reesaye
cs_thebigbang Messages postés 196 Date d'inscription vendredi 21 décembre 2001 Statut Membre Dernière intervention 25 juillet 2006
15 nov. 2003 à 19:41
J'ai oublié:

Pourquoi as tu mis un while ? il me parait inutile
A la limite tu vérifies si tu vas écrire au bon endroit avec un if, mais pourquoi une boucle ? De toutes facons, soit tu vas écrire au bon endroit et dans ce cas, la boucle n'est exec qu'une fois. Et si tu n'es pas au bon endroit, ca remplacerait le prochaine JNZ

Mais je ne connais pas tout en la matière, peut être qu'il y a une raison, et j'aimerais bien la connaitre

Ciao
Bigbang
cs_thebigbang Messages postés 196 Date d'inscription vendredi 21 décembre 2001 Statut Membre Dernière intervention 25 juillet 2006
15 nov. 2003 à 19:25
Il a su quelle adresse modifiée en désassemblant le crackme (avec w32dasm par exemple)

Mais moi j'ai essayé, et ca ne marche pas. On a ca :

:0040109D 85C0 test eax, eax
:0040109F 7522 jne 004010C3
:004010A1 6A40 push 00000040

* Possible StringData Ref from Data Obj ->"Registered program"
|
:004010A3 6880514000 push 00405180

* Possible StringData Ref from Data Obj ->"Correct registration key !
Thank "
->"you !"
|
:004010A8 6858514000 push 00405158
:004010AD 50 push eax

* Reference To: USER32.MessageBoxA, Ord:01BEh
|
:004010AE FF159C404000 Call dword ptr [0040409C]

Ce qu'il se passe, c'est que EAX sert à la fois :
- de vérification du pass. 0 si le bon pass, 1 si le pas bon. Donc le TEST/JNZ saute sur le bad boy si EAX=1
- et a besoin d'être a zéro pour l'affichage de la messagebox

Donc dans la source du memory patcher, ce n'est pas simplement en remplacant le JNZ par un JE qui va nous arranger. Il y a des crackmes où il suffit de faire ca, mais ici, lê même EAX est utilisé dans l'appel à MessageBox. Pour voir que ça ne marche pas, il faut se placer dans le cas où le JNZ a été remplacé par un JE et avec un pass faux ie EAX=1.
Dans ce cas, désarme ZF, on ne saute pas mais EAX=1 ! Donc erreur dans l'affichage de la MessageBox

Une solution serait non pas de patcher le JNZ en JE mais le TEST EAX, EAX en XOR EAX, EAX. Dans ce cas, EAX=0, ZF=1 et le JNZ ne fais pas sauter.

Ciao
Bigbang

PS : Dans Win32dasm, les strings ref nous donne direct le bon pass
Utilisateur anonyme
17 oct. 2003 à 20:34
Comment as tu su quelle addr mémoire modifier ?
PiXator Messages postés 16 Date d'inscription lundi 27 mai 2002 Statut Membre Dernière intervention 12 novembre 2004
8 juil. 2003 à 15:38
je posé ca en speed dsl
je modifirait ca le mois prochain (g un forfait de 10 h cé just)
g pu d'heures :-)
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
5 juil. 2003 à 18:35
Normalement quand le programme se finit bien, on retourne 0, et sinon on retourne +1,+2,+3... suivant les erreurs (les gravites !)

Serait-il possible de declarer toutes les variables en haut du block, et non en plein milieu, c'est illisible !