📄 exerep.h
字号:
/* fichier exeRep.h : fichier header
*
* descr : classe qui represente un executable binaire et gere la memoire associee
*
* projet : PEDasm
*
* rq:
* Ce programme est libre de droits. Il peut etre distribue et/ou modifie
* selon les termes de la licence 'GNU General Public License version 2'.
*
* Ce programme est distribue sans aucunes garanties, y compris d'utilite
* ni de risques encouru, quelle que soit son utilisation.
*
* lire le fichier licence.txt fourni ou bien ecrire a :
* the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* pour recevoir une copie de la licence.
*
* Copyright (C) 1997 - 1998 Nicolas Witczak <witczak@geocities.com>
*/
#ifndef EXE_REP_H
#define EXE_REP_H
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <string>
#undef va_end
#include "Symbol.h"
class CExeRep ;
///////////////////////////////////////////////////////////////
// struct dll_fun represente 1 fct d'une dll
//: assocition nom , ordinal , existence du nom
struct dll_fun
{
const char* m_pszName ;
const char* m_pszDllName ;
int m_iOrdinal ;
bool m_bHasName ;
// fct GetName :retourne le vrai nom ou un nom decore
const char* GetName()
{
static char_buff m_psztmp ;
if( m_bHasName )
return m_pszName ;
else
sprintf( m_psztmp , "%s_ord%i"
, GetBaseName(m_pszDllName) , m_iOrdinal );
return m_psztmp ;
};
};
///////////////////////////////////////////////////////////////
/** class CSection : represente une section
*/
class CSection
{
public:
// init
/** ctor : attache une section a sa zone memoire
* param : idSection : index de section
*/
CSection( int idSection ) ;
// attributs
/** index de la section */
int m_idSection ;
/** ptr sur notre header , appartient a la classe CExeRep */
IMAGE_SECTION_HEADER* m_pHeader ;
/** donnes de la partie initialisee de cette section , appartient a la classe CExeRep */
BYTE* m_pRawData ;
/** image directory si il y a lieu */
IMAGE_DATA_DIRECTORY* m_pImageDir ;
// information
/** size , init_size : retourne taille */
unsigned int size() ;
unsigned int init_size();
/** begin end : retourne ptr memoire relle de la section ,fin ,fin initialisee */
BYTE* begin() ;
BYTE* end();
BYTE* init_end();
/** va_begin va_end va_initend : retourne debut fin, fin initialisee en adr virt de la section */
unsigned int va_begin() ;
unsigned int va_end();
unsigned int va_init_end();
/** retourne les flags de section*/
DWORD GetFlags();
/** IsCode : indique si c'est une section code */
bool IsCode();
/** IsCode : indique si c'est une section de donnee ordinaire */
bool IsData();
};
//////////////////////////////////////////////////////////////////
/** class CExeRep
* descr : representation d'un fichier binaire
* en cours de desassemblage : classe singleton
*/
class CExeRep
{
public:
// donnees fichiers
/** path de l'exe */
string m_strPath ;
/** nom sans extension */
string m_strBaseName ;
/** fichier de sortie du .asm */
string m_strOutput ;
/** header dos*/
_IMAGE_DOS_HEADER* m_pDosHeader ;
// gestion du bloc de memoire brut
/** bloc de memoire contenant tt les sections du prg */
BYTE* m_pRawData ;
/** offset V.A -> ptr memoire */
unsigned int m_vaOffset ;
// donnees image PE decortiquees
/** signature */
DWORD m_dwNTSign ;
/** header NT */
_IMAGE_FILE_HEADER* m_pNTHeader ;
IMAGE_OPTIONAL_HEADER* m_pNTOptHeader ;
/** headers des sections */
vector< IMAGE_SECTION_HEADER* > m_arSectHeader ;
/** liste des sections */
vector< CSection* > m_arRawSections ;
/** type liste de symbols */
typedef set< CSymbol* , symb_less > CSymbolColl ;
typedef CSymbolColl::iterator symb_iterator ;
/**liste des symbols */
CSymbolColl m_arSymbols ;
/**liste des symbols inutilises */
CSymbolColl m_arUnusedSymbols ;
/** table de relocation
* si l'adresse est ds du code -> rep symbol donnee
* si l'adresse est ds des donnees -> rep symbol type pointeur
*/
CSymbolColl m_arRelocSymbols;
/** liste des dll importees
* nom dll -> ( ordinal -> nom fonction )
*/
typedef vector< dll_fun > dllname_coll ;
typedef dllname_coll::iterator dllfun_iterator ;
typedef map< const char* , dllname_coll , psz_less_nocase > dll_coll ;
typedef dll_coll::iterator dll_iterator ;
dll_coll m_arDll ;
public:
// parametrage
/** m_bRawData : var de config : rajoute les donnees dans le source desassemble */
bool m_bRawData;
/** m_bLineNum : ajoute les numero de ligne dans le source desassemble */
bool m_bLineNum ;
/** m_iPassNum : specifie le nombre de passes a effectuer sur le binaire */
int m_iPassNum ;
// fonctions d'aide
// initialisation , destruction
CExeRep();
~CExeRep();
/** genere les noms de fichiers */
void SetFileName( const char* pszFileIn , const char* pszFileOut );
// etapes de traitement
/** fct ProcessExe : point d'entree: traite l'executable et produit les sources
* si pszFileOut : nom de sortie par defaut
*/
void ProcessExe( const char* pszFileIn , const char* pszFileOut = 0 ) ;
/**fct LoadBin : charge un binaire et remplit les donnees brutes
* retourne : etat de success
*/
bool LoadBin( const char* pszName ) ;
/** fct ScanConfFile : analyse le fichier passe en entree et rajoute les
* symbols correspondants dans la table des symbols
* format du fichier de config
* 0xadresse [ data | funct | ptr ] opt nom
*/
bool ScanConfFile( FILE* pFile ) ;
/** fct AddDirEntrySymb :marque comme symbols non utiles les zones
* de directory entry inclu dans les differentes sections
*/
void AddDirEntrySymb() ;
/** AddDllSymb : importe les symboles fct dll d'import
*/
void AddDllSymb();
/** AddExportSymb : ajoute les symboles exportes ds le binaire
* sert principalement pour les dll
*/
void AddExportSymb();
/** AddRelocSymb : importe les symboles trouves dans la table de relocation
* genere un fichier include des references externes
*/
void AddRelocSymb();
/** AddEntryPoint : ajoute le point d'entree du binaire
*/
void AddEntryPoint();
// fonctions d'aides
/** fct IsExeBin : retourne true si c'est un exe 0 si c'est une dll */
bool IsExeBin();
/** fct HasReloc : retourne true si le binaire a une table de relocation */
bool HasReloc();
/** GetSectFromVA : retourne la section qui contient l'adresse abs
* passee en parametre ou 0 si non trouve
*/
CSection* GetSectFromVA( unsigned int uAdresse );
/** fct de conversion ptr <-> va <-> rva
*/
BYTE* CExeRep::rva2ptr( unsigned int uRVA )
{ return m_pRawData + uRVA ; }
BYTE* CExeRep::va2ptr( unsigned int uVA )
{ return reinterpret_cast< BYTE* >( uVA + m_vaOffset ) ; }
unsigned int CExeRep::ptr2va( BYTE* p )
{ return reinterpret_cast< unsigned int >(p - m_vaOffset); }
unsigned int CExeRep::ptr2rva( BYTE* p )
{ return ( unsigned int )(p - m_pRawData ) ; }
unsigned int CExeRep::rva2va( unsigned int uRVA )
{ return uRVA + m_pNTOptHeader->ImageBase ; }
// gestion des dll d'import
/** fct LoadimpDll : charge les symbol (nom ordinal) d'une dll
*/
bool LoadImpDll(const char* pszName );
/** fct GetNameFromOrd : retourne le nom d'une dll a partir d'un ordinal
* PARAM : pszDllName : nom de la dll
* int : ordinal
* sortie pbNoName : false -> indique qu'un nom n'a pas ete trouve
* RETOUR : une chaine temporaire sur le nom de dll ou un nom genere si le nom
* n'est pas exporte , retourne 0 en cas d'echec
*/
const char* GetNameFromOrd( const char* pszDllName ,int iOrdinal,bool* pbHasName );
/** fct GetOrdFromName : retourne l'ordinal a partir du nom de fct ds une dll
* ou -1 en cas d'echec
*/
int GetOrdFromName( const char* pszDllName , const char* pszFunName );
// interface
/** GetSymbol : retourn un pointeur sur 1 symbol ou 0 si aucuns symbols
* param uVA : adresse absolue
*/
CSymbol* GetSymbol( unsigned int uVA );
/** FindSymbol : cherche le prochain symbol satisfaisant au mask
* donne par ordre d'adresse croissant a partir de l'adresse uVA incluse
* retourne 0 si non trouve
* rq : DEPRECIE
*/
CSymbol* FindSymbol( unsigned int uVA , unsigned int uMask );
/** FindSymbol : cherche le 1er symbol disponible
* donne par ordre d'adresse croissant a partir de l'adresse uVA incluse
* retourne 0 si non trouve
*/
CSymbol* FindSymbol( unsigned int uVA );
/** AddSymbol : appele par le desassembleur pour rajouter ou preciser
* un symbol
* param uVA : adresse de location du symbol
* pRefPoint : adresse mem ou a ete reference le symbol
* bTrust : niveau de confiance (ne requiert pas la table de reloc )
* SymbolCat : type reconnu
*/
void AddSymbol( unsigned int uVA,unsigned int uRefVA, bool bTrust , unsigned int SymbolCat );
/** GetSymbName : retourne le nom d'un symbol a partir de
* l'adresse virtuelle uVA ou la valeur si non trouve
* PARAM : uVA : valeur a traduire
* refVA : adresse ou a ete trouve ce symbol
* bTrust : niveau de confiance (ne requiert pas la table de reloc )
* uflags : format d'affichage
*/
const char* GetSymbName( unsigned int uVA , unsigned int refVA , bool bTrust , unsigned int uflags ) ;
/** GetValue : retourne la valeur chaine d'une cte
* param uVal : valeur a traiter
* iflags : spec de formatage
*/
const char* GetValue( unsigned int uVal , int uflags ) ;
// fonction de sorties fichier
/** genere le commentaire header du fichier asm principale */
void OutputMainHeader( FILE* pFile );
/** genere le commentaire du header de section pSection
* sortie sur le stream pFile
*/
void OutputSectionHeader( CSection* pSection , FILE* pFile );
};
/** format d'affichage de valeurs */
const unsigned int cteFmtInteger = 1 ; // format decimal, hexa sinon
const unsigned int cteFmtSign = 2 ; // format nbr signe avec sign
const unsigned int cteDecorate = 4 ; // decore avec ( [] ou offset si besoin ) , pas de decoration sinon
const unsigned int cteDecOffset = 8 ; // decore avec offset si ==1 , [] sinon
/** format de sortie de desassemblage */
const int cteMASM = 0 ;
const int cteListing = 1 ;
const int cteInlineC = 2 ;
//////////////////////////////////////////////////////////////////
// fonctions globales
/** acces au singleton exe */
extern CExeRep m_theExe ;
inline CExeRep* GetExe()
{ return &m_theExe ; }
/** GetImageSize : retourne la taille d'un binaire en mem vive */
unsigned int GetImageSize( const char* pszStr );
/** indique si un ensemble d'instructions est disponible*/
bool IsBank( const char* pszBankName ) ;
/** si bLoad == true : marque comme candidat le groupe de modele d'instructions ,
* l'enleve sinon
*/
void LoadBank( const char* pszBankName , bool bLoad ) ;
/** Genere la liste des modeles d'instruction utilisees durant la decompilation */
void InitBanks() ;
#endif //EXE_REP_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -