Reverse Nandpro


Ac_K
 Share

Messages recommandés

Bonjour,

Donc suite aux tests de maxgwen j'ai donc commencé un peu à travailler de mon coté!

Je pense qu'à plusieurs on pourrait reverser le code source du NandPro et donc pouvoir modifier et ajouter ce que l'ont veux dans celui-ci (Voir en faire une version avec interface en .NET / C#).

J'ai donc mis un coup de IDA + Hex-Rays sur l'executable de NandPro v2.0e ce qui m'a sorti ce code là:

http://pastebin.com/raw.php?i=phteiaQE (Ou ici pour la coloration syntaxique: http://pastebin.com/phteiaQE)

Donc pour le moment je commence par m'intéresser à la fonction main():

Si on regarde la plupart des textes écrit, sub_412BE5 correspond donc à printf(), donc déjà on peut remplacer tout les appels du sub par cette fonction et supprimer le sub (cela dans tout le code)!

Ensuite, au début, nous avons:

v3 = GetCommandLineA();  v4 = GetModuleHandleA(0);  if ( !sub_40641D(v4, 0, v3, 0) )  {	v6 = sub_403FE0((int)&dword_475F40, "Fatal Error: MFC initialization failed");	sub_4041F0(v6, 0xAu);	sub_403E30((void *)v6);	return 1;  }

En cherchant un peu j'ai trouvé cette fonction:

// initialize MFC and print and error on failure	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))	{		// TODO: change error code to suit your needs		ErrorHandler("Fatal Error: MFC initialization failed",0);		return 1;	}

Si on regarde bien, ca concorde pas trop mal, maintenant quand on regarde à quoi correspond AfxWinInit on voit que cette fonction correspond à la création de fenêtre, donc on peut très certainement supprimer cette partie car c'est le compilateur qui s'occupera de cela!

Voila ou j'en suis pour le moment, je posterai au fur et à mesure de mes découvertes, si bien sûr j'ai des réponses!

Si quelqu'un à envie de m'aider, il a juste à mater les sources et puis à faire ses petites recherches et en faire part ici.

++

Lien vers le commentaire
Partager sur d'autres sites

Salut à toi Ac_K.

J'vais droit au but. L'individu qui a crée ce fameux NandPro semble utiliser les MFC pour se "facilité" la tache dans sa programmation au détriment de l'optimisation du code par derrière.

Cette MFC propose donc au programmeur différents Objet qui lui permette une gestion simple d'un peu pres tout, comme la librairie Qt tres connu pour Linux.

Il l'initialise donc au début de son code dans la fonction Main, ce que tu as découvert n'est donc pas étrange mais tout naturel =P

Je me suis un peu penché sur le Sujet. Et en effet, il semble utiliser la MFC à grande échelle. Pour la manipulation de ses fichiers par exemple.

Bout de Code :

.text:004043ED				 call	sub_412DC6.text:004043F2				 add	 eax, 40h.text:004043F5				 push	eax	; FILE *.text:004043F6				 call	_fprintf

Avant chaque utilisation du fichier de log, il semble appeler une fonction, la sub_412DC6, qui lui retourne un résultat dans le registre eax auquel on ajoute 0x40 pour en obtenir un pointeur vers un type qu'on connais bien, le FILE.

Donc ce que nous retourne cette Fonction (sub_412DC6) doit etre une Struct ou une Class qui s'apparenterait à ceci :

struct myFile{	BYTE m_Padding01[ 0x40 ];	FILE* m_FileHandle;};

Un peu plus de recherche s'impose donc sur cette fonction, sub_412DC6...

.text:00412DC6 sub_412DC6	  proc near.text:00412DC6				 mov	 eax, offset off_439D10.text:00412DCB				 retn.text:00412DCB sub_412DC6	  endp

Elle nous retourne bel et bien un pointeur vers un espace mémoire, qui semble lui même être un pointeur d'après le nom que lui alloue notre cher IDA.

Dirigeons nous vers cet espace mémoire...

.data:00439D10 off_439D10	  dd offset unk_476240

Et la ont peut confirmer le tout, off_439D10 est bien un pointeur vers un espace de mémoire alloué dynamiquement (unk_476240).

On va s'en sortir.

Donc apres quelque recherche sur la MFC et les Fichiers...

(http://www.cppdoc.com/example/mfc/classdoc/MFC/AFX.H.html)

class CStdioFile : public CFile{	DECLARE_DYNAMIC(CStdioFile)public:// Constructors	CStdioFile();	CStdioFile(FILE* pOpenStream);	CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags);// Attributes	FILE* m_pStream;	// stdio FILE						// m_hFile from base class is _fileno(m_pStream)

On découvre ceci, notre FILE*. Il se trouve dans CStdioFile qui herite de CFile qui lui meme herite de CObject.

Malheureusement je n'ai pas Visual Studio pour tester ceci par la programmation mais on pourrait en déduire que en accumulant les différent membres de chaques classes et en ajoutant un pointeur vers une VTABLE on doit tomber sur nos 0x40 du tout début ce qui expliquerai notre padding et le fait que le compilateur ajoute 0x40 au pointeur de notre structure pour y lire le FILE*.

Ca démontre une utilisation des MFC qui d'ailleur n'apporte pas grand chose si ce n'est de l'inutilité dans le code compilé...

Cya.

Modifié par Yoa2n
Lien vers le commentaire
Partager sur d'autres sites

Merci pour votre soutient à tous les 2... Dommage qu'il n'y ai pas d'autre dev pour regarder le code de plus près!

Donc pour ce qui est de nos recherches, au cas ou vous n'aurez pas compris que Yoa2n est un ami à moi ^^, j'ai donc commencé à retaper la fonction main, en laissant les choses inutiles dedans comme la partie MFC expliqué plus haut!

Fonction qui est dispo ici http://pastebin.com/raw.php?i=iWQzPTNF (Juste pour montrer l'avancement parce que des modifs on été faite dans toute la source entière...

Mais dans un "souci" de reverse, on va retaper tous de A à Z, en modifiant un peu l'utilisation du programme, afin de pouvoir supprimer cette partie MFC qui nous chagrine, n'ayant pas de JTAG sur nos consoles (et donc encore moins de module USB). Et dans l'attente de la réception du module de TheTool, On travail sur la partie fichier, pour comprendre un peu la structure de la chose, par la suite on aura qu'a adapter le code à l'USB, et au LPT (pour peu qu'on le supporte :-°)

Voila voila...

Lien vers le commentaire
Partager sur d'autres sites

Maxgwen a fait la meme chose...

Il a reverser le code de nandpro pour comprendre comment il fonctionnait et du coup à integré les fonctions directement dans son soft.

C'est exactement ce que vous comptez faire.

Modifié par Kamse
Lien vers le commentaire
Partager sur d'autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Share