首页
社区
课程
招聘
[旧帖] 关于kernel32模块的加载位置 0.00雪花
发表于: 2010-8-24 13:26 5933

[旧帖] 关于kernel32模块的加载位置 0.00雪花

2010-8-24 13:26
5933
小弟在学习PE的时候看到如下:
  
Once mapped into memory, sections always start on at least a page boundary. That is, when a PE section is mapped into memory, the first byte of each section corresponds to a memory page. On x86 CPUs, pages are 4KB aligned, while on the IA-64, they're 8KB aligned. The following code shows a snippet of PEDUMP output for the .text and .data section of the Windows XP KERNEL32.DLL.
Section Table
  01 .text     VirtSize: 00074658  VirtAddr:  00001000
    raw data offs:   00000400  raw data size: 00074800
•••
  02 .data     VirtSize: 000028CA  VirtAddr:  00076000
    raw data offs:   00074C00  raw data size: 00002400
The .text section is at offset 0x400 in the PE file and will be 0x1000 bytes above the load address of KERNEL32 in memory. Likewise, the .data section is at file offset 0x74C00 and will be 0x76000 bytes above KERNEL32's load address in memory.

最后一段提及了kernel32的加载位置,难道kernek32是加载到小地址吗,也就是小于imagebase ?希望高手能解释一下,谢谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 452
活跃值: (72)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
这段话的意思是,.text节在kernel32.dll文件中的偏移量是0x400,但是加载到内存中之后,偏移量就变成了0x1000。类似地,.data节的文件偏移是0x74C00,加载到内存中之后,相对于基址的偏移是0x76000
2010-8-26 12:23
0
雪    币: 1099
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dqs
3
PE文件中的VirtualAddress是一个相对地址。是指文件加载到内存后,相对于PE文件头的偏移地址。一般在PE磁盘文件中的偏移小于加载到内存的偏移。
.text节在kernel32.dll文件中的偏移量是0x400,但是加载到内存中之后,偏移量就变成了0x1000。那么kernel32.dll的.text节在内存中的地址就是kernel32.dll的基址(0x7C800000)+0x1000=0x7C801000

因此kernel32.dll的加载地址还是它的基址(0x7C800000),.text节加载到了0x7C801000。

我是在winxp上面看的kernel32.dll的基址,这个地址不知道会不会变。
另外,对DLL来说,基址只是个建议地址,操作系统会尽量去满足,如果这个地址已经被占用了,就会重定向。不过kernel32.dll应该不会重定向吧。
2010-8-26 17:52
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
1. DLL文件映射到内存时,它的基地址是随需要而变化的。
2. 举例来说吧,例如有个可执行程序a.exe, 它有使用到user32.dll 和 kernel32.dll ;
那么如果uer32.dll 和 kernel32.dll 都建议基址是0x1000,那怎么办呢;如何先加载了user32.dll, 这时user32.dll占了0x1000,那么kernel32.dll就只好换个位了;
那么kernel32.dll 换个位后,他们里面函数的地址都需要做个相应的调整,这就是所谓的重定向

3。 在说说重定向吧
例如kernel32.dll 中有个函数 GetVersion, 这个函数的地址是相对kernel32.dll的基地址 + 200;如果 kernel32.dll的基地址是0x1000,那么函数的地址就是0x1200; 现在基地址变为0x3000了,那函数的地址就变成0x3200了,这就是所谓的重定向,就是重新找到准确的地址......,笔记本打字就是慢了
2010-8-26 21:36
0
游客
登录 | 注册 方可回帖
返回
//