begin process at 2012 05 28 19:52:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Systeme

 > 

Décompiler un exe en MFC


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Décompiler un exe en MFC

dimanche 9 avril 2006 à 02:24:45 | Décompiler un exe en MFC

jibus

Salut à tous,
Je suis en train de faire un débuggeur en MFC et j'aimerai savoir comment il est possible d'obtenir et d'afficher le code assembleur d'un exe. En gros comment je peux desassembler un exe quoi
Merci d'avance ;)
@++

InsectS
dimanche 9 avril 2006 à 08:57:18 | Re : Décompiler un exe en MFC

platon179

Membre Club
Salut :)

Tu dois étudier le format des instructions de la machine sur laquelle tu travailles (Intel/AMD je suppose)... Sache que c'est pas simple du tout, mais une fois qu'on a compris le fonctionnement de base, ca va tout seul... Va aussi falloir étudier le format des exécutables Win32, il y a quelques codes sur ce sujet sur cppfrance... Il existe toute une floppée de sites aussi, en voici l'un ou l'autre :

Format des instructions Intel :
   www.sandpile.org
   www.x86.org (pour les manuels Intel techniques officiels, en 3 volumes, le dernier est le plus intéressant pour toi ;) )

Format PE (.exe de windows) :
   www.wotsit.org
   www.xbdev.net


Bonne journée
@+
dimanche 9 avril 2006 à 13:17:25 | Re : Décompiler un exe en MFC

Taron31

Membre Club
En addition à ce que Platon a dit, voici un petit code pour te donner une idée de démarrage (j'espère que ça peut aider). il s'agit d'une comparaison d'opcodes dans une DLL, je pense 'donc pas sûr) que ça doit être a peu de choses près le même esprit lorsque tu désassemble un .exe :

#include <Windows.h>
#include <stdio.h>

void usage();
DWORD GetRegNum(char *reg);
void findjmp(char *dll,char *reg);
/*
    This finds useful jump points in a dll.  Once you overflow a buffer, by
    looking in the various registers, it is likely that you will find a
    reference to your code.  This program will find addresses of suitible
    addresses of eip that will return to your code. 

*/
int main(int argc, char **argv)
{
    char dll[512], //holder for the dll to look in
         reg[512]; // holder for the register

    if(argc<2) usage();
    strncpy(dll,argv[1],512);
    strncpy(reg,argv[2],512);
    findjmp(dll,reg);
}

/*
    This prints the usage information. 
*/

void usage()
{
    printf("FindJmp usage\nfindjmp DLL reg\nEx: findjmp KERNEL32.DLL esp\n");
}

/*
    findjmp is the workhorse.  it loads the requested dll, and searches for
    the specific patterns for jmp reg, push reg ret, and call reg

  */

void findjmp(char *dll,char *reg)
{
    /* patterns for jmp ops */
    BYTE jmppat[8][2]=        {{0xFF,0xE0},{0xFF,0xE3},{0xFF,0xE1},{0xFF,0xE2},
                            {0xFF,0xE6},{0xFF,0xE7},{0xFF,0xE4},{0xFF,0xE5}};
    /* patterns for call ops */
    BYTE callpat[8][2]=        {{0xFF,0xD0},{0xFF,0xD3},{0xFF,0xD1},{0xFF,0xD2},
                            {0xFF,0xD6},{0xFF,0xD7},{0xFF,0xD4},{0xFF,0xD5}};
    /* patterns for pushret ops */
   
    BYTE pushretpat[8][2]=    {{0x50,0xC3},{0x53,0xC3},{0x51,0xC3},{0x52,0xC3},
                            {0x56,0xC3},{0x57,0xC3},{0x54,0xC3},{0x55,0xC3}};

    /*base pointer for the loaded DLL*/
    HMODULE loadedDLL;

    /*current position within the  DLL */
    BYTE *curpos;

    /* decimal representation of passed register */
    DWORD regnum=GetRegNum(reg);

    /*accumulator for addresses*/
    DWORD numaddr=0;

    /*check if register is useable*/
    if(regnum == -1)
    {
        /*it didn't load, time to bail*/
        printf("There was a problem understanding the register.\n"\
            "Please check that it isa correct IA32 register name\n"\
            "Currently supported are:\n "\
            "EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP\n"\
            );

        exit(-1);
    }

    loadedDLL=LoadLibraryA(dll);

    /* check if DLL loaded correctly*/
    if(loadedDLL == NULL)
    {
        /*it didn't load, time to bail*/
        printf("There was a problem Loading the requested DLL.\n"\
            "Please check that it is in your path and readable\n" );
        exit(-1);
    }
    else
    {
        /*we loaded the dll correctly, time to scan it*/
        printf("Scanning %s for code useable with the %s register\n",
            dll,reg);
        /*set curpos at start of DLL*/
        curpos=(BYTE*)loadedDLL;

        __try
        {
            while(1)
            {
                /*check for jmp match*/
                if(!memcmp(curpos,jmppat[regnum],2))
                {
                    /* we have a jmp match */
                    printf("0x%X\tjmp %s\n",curpos,reg);
                    numaddr++;
                }
                /*check for call match*/
                else if(!memcmp(curpos,callpat[regnum],2))
                {
                    /* we have a call match */
                    printf("0x%X\tcall %s\n",curpos,reg);
                    numaddr++;
                }
                /*check for push/ret match*/
                else if(!memcmp(curpos,pushretpat[regnum],2))
                {
                    /* we have a pushret match */
                    printf("0x%X\tpush %s - ret\n",curpos,reg);
                    numaddr++;
                }
                curpos++;
            }
        }
        __except(1)
        {
            printf("Finished Scanning %s for code useable with the %s register\n",
                dll,reg);
            printf("Found %d usable addresses\n",numaddr);
        }
    }

}


DWORD GetRegNum(char *reg)
{
    DWORD ret=-1;
    if(!stricmp(reg,"eax"))
    {
        ret=0;
    }
    else if(!stricmp(reg,"ebx"))
    {
        ret=1;
    }
    else if(!stricmp(reg,"ecx"))
    {
        ret=2;
    }
    else if(!stricmp(reg,"edx"))
    {
        ret=3;
    }
    else if(!stricmp(reg,"esi"))
    {
        ret=4;
    }
    else if(!stricmp(reg,"edi"))
    {
        ret=5;
    }
    else if(!stricmp(reg,"esp"))
    {
        ret=6;
    }
    else if(!stricmp(reg,"ebp"))
    {
        ret=7;
    }
    /*return our decimal register number*/
    return ret;
}

Avec ce code tu peux reconnaître des instructions ASM dans une DLL, donc si ça peut t'être utile...
Source : la source n'est pas de moi, elle est tirée du livre Stratégies Anti-Hackers (Eyerolles)
___________________
MVS
- Most Valuable Student ( Microsoft)
dimanche 9 avril 2006 à 17:17:02 | Re : Décompiler un exe en MFC

jibus

Merci pour vos réponses ;)
Le format PE j'avais déjà regardé et implémenter dans mon application une vue qui me décrivait tout le header.
Sinon pour le reste de vos infos et bien je vais me pencher dessus et voir ce que je peux en tirer
A bientot ++

InsectS


Cette discussion est classée dans : exe, décompiler, mfc


Répondre à ce message

Sujets en rapport avec ce message

[MFC] Comment récupérer la version de l'exe ? [ par jeff95 ] Bonjour,Je travaille avec VISUAL .NET (MFC+Visual C++), et je voudrais faire une mise à jour automatique du logiciel que je développe.Pour cela, il me DéCompiler un exe [ par Ragnarog ] Bonjour, J'ai une appli exe qui à été écrite en C++ et je voudrai pouvoir le décompiler afin d'avoir ce que contient le programme en C++. Est-ce que c probleme avec projet MFC exe et Visual c++ 6 [ par jardel ] voilà, lorsque je cré un projet MFC exe, visual c++ 6 trouve cette erreur :Cannot open precompiled header file: 'Debug/Draw.pch': No such file or dire MFC RichEdit [ par mfrai02 ] Salut , j'utilise visual studio .net 2003 et j'ai un projet C++ mfc . Dans mon application j'ai ajouté une CRichEdit (Rich Edit 2.0) . Je fais rien [MFC] Repertoire courant d'un .exe [ par lastcheper ] Bonjour, Dans mon aplli basée dialogue (appelée setup.exe) j'installe un programme et je cherche a récuperer le repertoire d'où le setup.exe a été la Changer l'icône du .exe sous MFC sur VISUAL STUDIO [ par project018 ] Bonjour , j'ai Microsoft VISUAL STUDIO 2008 et je souhaite modifier l'icône du projet.exe et mettre une image personnalisée  dans cette icône  et non Ouvrir EXE application WCE MFC 6 [ par sharingtop ] Bonjour a Tous, J'aimerais ouvrir une application .exe basée sur WCE MFC 6. J'ai essayer de l'ouvrir avec eMbedded Visual C++ 4.0. Le fichier en q Quel avenir pour les MFC ?? [ par isir ] quel avenir pour les MFC ?? Mon exécutable ne marche pas [ par Gagnantdu06 ] Bonjour, je viens poster ce message ici car je sais vraiment plus quoi faire. J'ai donc créer un jeu en C avec la librairie SDL et avec comme IDE Code Pb compilation sample drawcli MFC 9.0 [ par Flow8002 ] Bonjour , J'essaye de creer une application de dessin vectoriel pour mon projet de fin d'année. J'essaye de m'appuyer sur le sample fournit avec la


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
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 : 5,273 sec (3)

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