Kernel32.dll 文件的导出表的分析
一.实验目的
使用PEviews与OllyDbg分析Kernel32.dll。
二.实验原理准备
(1)PE/ELF文件格式
1、PE/ELF都是可执行文件格式。(被装载器和链接器使用的可执行文件的规
范格式,可执行,文件时二进制分析的输入。)
2、典型代表:
Unix/Linux下:Executable and Linkable Format(ELF)格式。
Windows下,Portable Executable(PE)格式。
(2)动态链接库(DLL)
(1)DLL的定义:动态链接库在程序外,是程序能够随时调用的程序库文件。
多个进程可以同时共享一个DLL文件。
(2)装载方式:显式链接与隐式链接。
(3)导入地址表(IAT:Import Address Table)
1、PE文件使用的代码由其他DLL提供时,就需要装载这个DLL。而导入地址表,
就是记录程序正在使用的DLL库中的函数实际地址。
2、位置:NT头 --> IMAGE_OPTIONAL_HEADER --> DataDirectory[1]
--> IMAGE_IMPORT_DESCRIPTOR --> FirstThunk --> IAT
(4)映射原则
1、RVA(Relative Virtual Address):进程空间中相对基地址的偏移
2、RAW:外存中数据相对于文件头的偏移量
3、RAW - RAW(section) = RVA - RAV(section)
三.实验步骤
step1: 查看 IMPORT Table 的 RVA
可以看到,IMAGE_IMPORT_DESCRIPTOR 数组的起始 RVA为:9FC98。
step2:查看RVA(section.rdata)与RAW(section.rdata)
其RVA(section.rdata) = 80000,RAW(section.rdata) = 65000。
首个IMAGE_IMPORT_DESCRIPTOR 结构的 RAW 为:
RAW = 9FC98 - 80000 + 65000 = 84C98。
step3:观察 IMPORT_Directory_Table 的 84C98 位置。
step4:可以看到,DLL 名称字符串 " api-ms-win-core-rtlsupport-1-2-0.dll " 的 Name RVA 为A18E8。其所在的 RAW = A18E8 - 80000 + 65000 = 868E8。
step5:我们再来观察一下 " api-ms-win-core-rtlsupport-1-2-0.dll " 的Import Name Table RVA = A0FE0
所以,INT 结构数组的起始 RAW = A0FE0 - 80000 + 65000 = 85FE0。
故第一个 IMAGE_IMPORT_BY_NAME 结构的 RAW = A18AC -80000 +65000 = 868AC。
易见,从" api-ms-win-core-rtlsupport-1-2-0.dll " 导入的第一个函数 RtlCaptureStackBackTrace 在 api-ms-win-core-rtlsupport-1-2-0.dll 得到处地址表中的序号为 0001。
step6:让我们看一下, api-ms-win-core-rtlsupport-1-2-0.dll 的 IAT RVA 的值= 816D4。
则 IAT 结构数组起始 RAW = 816D4 - 80000 + 65000 = 666D4。
IAT 数组的第一个元素为 A18AC,当装载到内存时,我们使用 Olldbg 看一下:
可以发现,其值发生了改变。说明当被装载器装载到内存时,原来的地址会发生改变。