提取NTLDR文件,分解Osloader.exe;pe文件找e_lfanew、IMAGE_EXPORT_DIRECTORY->AddressOfFunctions

1.1找出NTLDR文件。

NTLDR文件位于xp操作系统c盘的根目录下,不过要先设置可以查看隐藏的系统文件。

将这一栏去掉,之后就找到了。


1.2分解osloader.exe

将NTLDR文件放入winhex;


然后找到MZ段;


在此处添加alt+1,文件尾部添加alt+2,此部分就是osloader.exe。

然后右键'edit'->'copy block'->'into a new file'

不过因为我的winhex没有激活,所以会winhex用的不是很痛快。


只要在网上找一个破解版的winhex就行了。

然后成功导出Osloader.exe。



2.1找e_lfanew

在博客上看的一篇论文介绍PE头的,下图是DOS头的数据结构,在结构里面的最后一行,发现了我们要找的e_lfanew,发现它是long型,占用4个字节,所以找到的e_lfanew的值为000000D0。


下图是截取的DOS头,以及截取的e_lfanew的值。


2.2IMAGE_EXPORT_DIRECTORY

IMAGE_OPTIONAL_HEADER32:

其定义如下: 

typedef struct _IMAGE_OPTIONAL_HEADER { 
        WORD    Magic; 
        BYTE    MajorLinkerVersion; 
        BYTE    MinorLinkerVersion; 
        DWORD   SizeOfCode; 
        DWORD   SizeOfInitializedData; 
        DWORD   SizeOfUninitializedData; 
        DWORD   AddressOfEntryPoint; 
        DWORD   BaseOfCode; 
        DWORD   BaseOfData; 
        DWORD   ImageBase; 
        DWORD   SectionAlignment; 
        DWORD   FileAlignment; 
        WORD    MajorOperatingSystemVersion; 
        WORD    MinorOperatingSystemVersion; 
        WORD    MajorImageVersion; 
        WORD    MinorImageVersion; 
        WORD    MajorSubsystemVersion; 
        WORD    MinorSubsystemVersion; 
        DWORD   Win32VersionValue; 
        DWORD   SizeOfImage; 
        DWORD   SizeOfHeaders; 
        DWORD   CheckSum; 
        WORD    Subsystem; 
        WORD    DllCharacteristics; 
        DWORD   SizeOfStackReserve; 
        DWORD   SizeOfStackCommit; 
        DWORD   SizeOfHeapReserve; 
        DWORD   SizeOfHeapCommit; 
        DWORD   LoaderFlags; 
        DWORD   NumberOfRvaAndSizes; 
        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; 
    } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

这是IMAGE_OPTIONAL_HEADER32定义的结构,我们要找的导出表就在这其中。

·  typedef struct _IMAGE_DATA_DIRECTORY {  
·      DWORD   VirtualAddress;  
·      DWORD   Size;  
·  } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

这是datadirectory的数据目录,里面包括地址(VA)和大小(Size),数组定义的是一个区域,数组每项都有被定义的值,不同项目对应不同的数据结构,有导入表和导出表等。。。

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory 
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory 
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory 
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory 
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory 
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table 
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory 
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage) 
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data 
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP 
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory 
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory 
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers 
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table 
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors 
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor

上图中标记的就是我们要找export表。

这里我用的PE文件是matlab的可执行文件,即matlab.exe,不可用快捷方式,它并不是一个真正的exe。

1.用winhex打开。


2.下面这一段就是IMAGE_OPTIONAL_HEADER32定义的结构。


下图是一篇博客上标出的信息。


特别困惑的地方,我用了好几个exe,包括qq、matlab、自己用c编写的小程序,里面的导出表那一段都00…..,看了很多资料,说明是这个exe的导出表是没有的。。

我直接将osloader放入了winhex,发现osloader的导出表竟然给出了非零地址和大小


上图红框内就是导出表的信息,所以RVA是000357B0h,Size是000006AFh

3.下面我用lordpe查看它的区段。

尝试了好几个lordpe,刚下载完就被立刻拦截了,最后找到一个可以用的,附上链接:https://down.52pojie.cn/Tools/PEtools/


4.发现导出表的RVA是000357B0h,是大于00031000h,小于00036000h所以在.rdata区段表中。


接下来计算导出表在文件中的偏移:

         文件偏移=RVA-VOffset+ROffset

                       =000357B0h-00031000+0002F000

                 =000337B0h

5.下面用010editor使用ctrl+G转到000337B0,如下图,我们取40个字节


剪头指向的那一栏是AddressOfFunctions,左边是 AddressOfNames,右边是 AddressOfNameOrdinals


AddressOfFunctions:000357D8h  :   000357D8h-00031000+0002F000=000337D8h

看了好多篇博客,不够都是在介绍PE文件的结构以及一些结构的作用,只有理解了才能操作起来,参考的比较有用的博客:http://www.freebuf.com/articles/system/86596.html#

http://blog.csdn.net/oBuYiSeng/article/details/50231677





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值