⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exerep.h

📁 win32 exe程序反汇编
💻 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 + -