安全中国首页 > 文章中心 > 黑客编程
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

自己写的文件分析器-PE DeCODER v1.0

更新时间:2008-4-28 0:16:06
责任编辑:池天
热 点:
在《软件加密技术》这本书里看过PE文件各部分的详细解释之后,我也有了一个自己写PE文件分析器的的想法。虽然好的分析器不在少数,但对于一堆十六进制数,有些朋友可能不明白它代表什么意思。如果在程序里就可以将这些01序列转换成可以直接看懂得信息,那至少用户可以省去以后去查表的麻烦。怀着这样的想法,我仔细的研究了书中分析器PEInfo的源代码,我发现它没有提供信息转换的功能。 

    通过研究发现,PEInfo是通过PE文件在内存中的映象来获取文件信息的,我在想是否还有别的方法可以绕过将文件映象到内存这一步,直接读取文件信息。这样的方法只有直接读取磁盘上的PE文件,在磁盘上寻找所需要的文件信息。 

    在这里暂且不说这样的做法和内存映象法有什么优劣,我在此仅仅只是想找寻另一条解决问题的道路,并实现之。看完我的分析和源程序,大家自然知道孰优孰劣。 

    为了避免引起混淆,程序中采用了与PE标准种类似变量名来定义关键的数据,如文件头,可选文件头,节表,导入表和导出表,具体名称定义细节可以在winnt.h里查到。整个程序是以面向过程的方式写的,适当结合了面向对象的特征。我将读取的PE文件信息封装在一个对象DataDump里,这样是为了方便数据的管理和最后输出分析报告。而对文件的分析则分别有一系列的子程序来完成。现将子程序说明如下: 

//------------------------------------------------------------------------------------------------------------------- 

  BOOL Is_EXE_file( ifstream& PE_file )                       //判断是否是合法的PE文件,是则返回true,否则返回false 

  BOOL OutReady( CHAR filename[], ofstream& fout )            //输出准备,包括输出流和输出文件,是则返回true,否则返回false 

  VOID WriterInfo( ofstream& fout )                           //输出程序版本信息 

  BOOL Load_EXE_Info( ifstream& PE_file )                     //读取PE文件信息,成功返回true,否则返回false 

  VOID Decode_EXE_Info(CHAR filename[], BOOL IsEXE, ifstream& PE_file, ofstream& fout)  //分析PE文件信息 

  VOID ToNumeric( LPDWORD ptr, CHAR buf[], INT start, INT size )   //将字符数组从start位开始,转换size位为数值,放入ptr指向的DWORD类型变量中 
   
  VOID ToString( LPSTR ptr, CHAR buf[], INT start, INT size)       //从字符数组从start位开始,取出其后的size位,放入一个ptr指向的的字符数组中 

//------------------------------------------------------------------------------------------------------------------- 

        class DataDump  
  { 
    private : 
    IMAGE_FILE_HEADER FILE_HEADER;                                  // IMAGE_FILE_HEADER  
    IMAGE_OPTIONAL_HEADER32 OPTIONAL_HEADER32;                      // IMAGE_OPTIONAL_HEADER32 
    PIMAGE_SECTION_HEADER SECTION_HEADER;                           // PIMAGE_SECTION_HEADER 
    IMAGE_IMPORT_DESCRIPTOR IMPORT_DESCRIPTOR;                      // IMAGE_IMPORT_DESCRIPTOR 
    PIMAGE_EXPORT_DIRECTORY EXPORT_DIRECTORY;                       // PIMAGE_EXPORT_DIRECTORY 

    DWORD ExVRk, ImVRk;                                             // 输出表和输入表在磁盘文件的偏移和RVA的差值 

    public :                                                          // You can get the functions of these member functions below by their names. 
    DataDump(); 
    ~DataDump(); 

    BOOL Set_FILE_HEADER( CHAR [], INT ); 
    BOOL Set_OPTIONAL_HEADER32( CHAR [], INT ); 
    BOOL Set_SECTION_HEADER32( CHAR [], INT ); 
    BOOL Set_EXPORT_TABLE( CHAR [],  INT ); 
     
                VOID GetReady( CHAR [] ); 
    DWORD Get_OPTIONAL_HEADER_SIZE( VOID ) const;  
    DWORD Get_SECTION_NUMBER( VOID ) const; 
    DWORD Get_EXPORT_TABLE_RAW( VOID ) const; 
    DWORD Get_IMPORT_TABLE_RAW( VOID ) const; 

    VOID Set_Export_VRk( VOID ); 
    VOID Set_Import_VRk( VOID ); 
    BOOL Export_Table_Existed( VOID ) const; 
    BOOL Import_Table_Existed( VOID ) const; 
     
    BOOL Show_FILE_HEADER( ofstream& ) const; 
    BOOL Show_OPTIONAL_HEADER32( ofstream& ) const; 
    BOOL Show_SECTION_HEADER32( ofstream& ) const; 
    BOOL Show_EXPORT_TABLE( ifstream&, ofstream& ) const; 
    BOOL Show_IMPORT_TABLE( ifstream&, ofstream& ) const; 

  };    
  DataDump pool;  
     
//------------------------------------------------------------------------------------------------------------------- 

1 2 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画