begin process at 2012 02 12 08:33:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.Net

 > MEMORY PATCHER

MEMORY PATCHER


 Information sur la source

Note :
Aucune note
Catégorie :.Net Niveau :Débutant Date de création :05/07/2003 Date de mise à jour :05/07/2003 18:08:39 Vu / téléchargé :4 070 / 223

Auteur : PiXator

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

 Description

Un petit memory patcher pour modifier un exe em memoir et non le "cracker"
Afin de modifier son comportement

Il est basé sur le "crackme" de Arecibo dans le zip

Source

  • // cpp_france_mempatch.cpp : Defines the entry point for the console application.
  • //
  • #include <windows.h>
  • int main(void)
  • {
  • // On crée la structure startupinfo
  • STARTUPINFO startupinfo;
  • // On la rempli avec des 0
  • memset (&startupinfo, 0, sizeof (STARTUPINFO)) ;
  • // on indique a la structure sa taille
  • startupinfo.cb = sizeof(startupinfo);
  • // On crée la structure process
  • PROCESS_INFORMATION process;
  • // On la rempli avec des 0
  • memset (&process, 0, sizeof (PROCESS_INFORMATION)) ;
  • // La ou on va placer la portion de memoire lu
  • char memread[1];
  • // Si on passe des arguments
  • char* cmdline;
  • // on recupere les arguments
  • cmdline = GetCommandLine();
  • // Nombre de Test d'ecriture
  • // Max de test d'ecriture
  • // Temps entre chaque tests
  • int nb_test = 0,max_test=100,wait_time = 5;
  • // on crée le proces
  • if (CreateProcess("Crackme.exe", cmdline, NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS,NULL, NULL, &startupinfo, &process))
  • {
  • //on lit le memoire
  • ReadProcessMemory(process.hProcess, (LPVOID) 0x40109F, memread, 1, NULL);
  • // tant que la zone != 0x75: jne
  • while ( (memread[0] != 0x75) )
  • {
  • //incremente test
  • nb_test++;
  • // Sleep
  • Sleep(wait_time);
  • // on lit
  • ReadProcessMemory(process.hProcess, (LPVOID) 0x40109F, memread, 1, NULL);
  • // si trop de tests
  • if ( nb_test > max_test )
  • {
  • // héhé bad boy :-)
  • MessageBox(NULL,"Imposible à patcher en memoire\nMauvaise Version ou Erreur","Erreur",MB_OK|MB_ICONERROR);
  • return 0;
  • exit(-1);
  • }
  • }
  • // On ecrit dans la memoide du grog
  • WriteProcessMemory (process.hProcess, (LPVOID)0x40109F, "\x74", 1, NULL);
  • // On a plus besoin de rien faire on ferme l'handle
  • // pas le prog juste l'handle
  • CloseHandle (process.hProcess);
  • CloseHandle (process.hThread);
  • }
  • else
  • {
  • // on a pas pu l'ouvrir
  • MessageBox(NULL, "Erreur Imposible d'ouvrir Crackme.exe", "Erreur", MB_OK|MB_ICONERROR);
  • exit(-1);
  • }
  • return 1;
  • }
// cpp_france_mempatch.cpp : Defines the entry point for the console application.
//

#include <windows.h>

int main(void)
{


	
	// On crée la structure startupinfo
	STARTUPINFO startupinfo;
	// On la rempli avec des 0
	memset (&startupinfo, 0, sizeof (STARTUPINFO)) ; 
	// on indique a la structure sa taille
	startupinfo.cb = sizeof(startupinfo);
	
	// On crée la structure process
	PROCESS_INFORMATION process;
	// On la rempli avec des 0
	memset (&process, 0, sizeof (PROCESS_INFORMATION)) ;

	// La ou on va placer la portion de memoire lu
	char memread[1];
	// Si on passe des arguments
	char* cmdline;
	
	// on recupere les arguments
	cmdline = GetCommandLine();
	
	// Nombre de Test d'ecriture
	// Max de test d'ecriture
	// Temps entre chaque tests
	int nb_test = 0,max_test=100,wait_time = 5;

	// on crée le proces
	if (CreateProcess("Crackme.exe", cmdline, NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS,NULL, NULL, &startupinfo, &process))
	{

		//on lit le memoire
		ReadProcessMemory(process.hProcess, (LPVOID) 0x40109F, memread, 1, NULL);

		// tant que la zone != 0x75: jne
		while ( (memread[0] != 0x75) )
		{
			//incremente test
			nb_test++;
			// Sleep
			Sleep(wait_time);
			// on lit
			ReadProcessMemory(process.hProcess, (LPVOID) 0x40109F, memread, 1, NULL);

			// si trop de tests
			if ( nb_test > max_test )
			{
				// héhé bad boy :-)
				MessageBox(NULL,"Imposible à patcher en memoire\nMauvaise Version ou Erreur","Erreur",MB_OK|MB_ICONERROR);
				return 0;
				exit(-1);
			}
		}



		// On ecrit dans la memoide du grog
		WriteProcessMemory (process.hProcess, (LPVOID)0x40109F, "\x74", 1, NULL);

		// On a plus besoin de rien faire on ferme l'handle
		// pas le prog juste l'handle
		CloseHandle (process.hProcess);
		CloseHandle (process.hThread);

	}
	else
	{
		// on a pas pu l'ouvrir
		MessageBox(NULL, "Erreur Imposible d'ouvrir Crackme.exe", "Erreur", MB_OK|MB_ICONERROR);
		exit(-1);
	}

	return 1;

} 

 Conclusion

Un pb mailer moi

pix@laposte.net
www.pixdesign.fr.fm

 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


 Sources du même auteur

Source avec Zip AUDIO JOY V2.0.1.5
UN MENU CONTEXTUELLE DANS VOS APP
CONTROLLER WINAMP WMP9 ET MUSICMATCH JUKEBOX
SE SERVIR D'UN PAD OU JOYSTICK
AVOIR LE "STYLE XP" DANS VOS APPLICATION:

 Sources de la même categorie

Source avec Zip Source avec une capture ANALYSEUR LEXICAL par Donald180v
Source avec Zip Source avec une capture MAP_MAKER_JEU par seekplus
Source avec Zip Source avec une capture Source .NET (Dotnet) EMISSION D'UN OCTET SUR LE PORT SÉRIE - CLASSE SERIALPORT par jmchatelet01
Source avec Zip Source .NET (Dotnet) RESOLV EQU DE DEGRES N par darckangel731
Source avec Zip Source avec une capture Source .NET (Dotnet) INTEROP XCHAT / .NET : CHARGEUR DE PLUGINS MANAGÉS par TeBeCo

Commentaires et avis

Commentaire de JCDjcd le 05/07/2003 18:35: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 !

Commentaire de PiXator le 08/07/2003 15:38:05

je posé ca en speed dsl
je modifirait ca le mois prochain (g un forfait de 10 h cé just)
g pu d'heures :-)

Commentaire de vbnul le 17/10/2003 20:34:46

Comment as tu su quelle addr mémoire modifier ?

Commentaire de thebigbang le 15/11/2003 19:25:34

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 -&gt;"Registered program"
                                  |
:004010A3 6880514000              push 00405180

* Possible StringData Ref from Data Obj -&gt;"Correct registration key !
Thank "
                                        -&gt;"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

Commentaire de thebigbang le 15/11/2003 19:41:52

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

Commentaire de PiXator le 13/11/2004 11:30:50

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

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

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,702 sec (3)

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