1.1找出NTLDR文件。
将这一栏去掉,之后就找到了。
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