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

来源:互联网 发布:qt支持c语言吗 编辑:程序博客网 时间:2024/06/06 01:39

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