首页
社区
课程
招聘
[求助]第二章求助
2012-3-9 04:47 4701

[求助]第二章求助

2012-3-9 04:47
4701
我用的Win7+VS2010。使用/GS-(无缓冲去安全检查)/DYNAMICBASE:NO(固定基址)/NXCOMPAT:NO(无数据执行保护)后生成类似于随书文件中的exe。我的问题在于按照书中的方法得出来的messageboxa地址不对。通过depends.exe,读出user32.dll的Preferred Base为0x77d10000,其中messageboxa的相对偏移为0x0005ea11,这样计算实际地址应为0x77d6ea11。但这个地址是不对的。

我尝试直接在源程序中调用messageboxa,反编译得到实际地址为0x760fea11。我尝试过这个地址能达到书中的目的。

我想问下这个怎么解释。我知道depends.exe读出的是preferred base。

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

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kenikehan 2012-3-9 10:12
2
0
depends.exe读出的是preferred base,早先win平台将按照preferred base加载dll,但后来为了部分的提升安全性,dll往往不会按照preferred base加载(既然用到了那些编译选项,你应该明白啊),你得自己获得dll实际加载地址再加上函数的RVA偏移才能获得函数真实的地址。即preferred base+RVA是参考情况,actural base+RVA才是实际情况
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ccqmpux 2012-3-9 13:23
3
0
谢谢了!

补充下,我又实验了下,发现同一个程序运行时其dll加载位置始终相同,不同程序的确是不同的。是说dll加载位置在链接是就已经决定了吗?
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kenikehan 2012-3-9 14:57
4
0
从编写动态链接库代码到生成dll的过程中,仅仅是其编译过程与dll加载顺序稍带联系(编译过程影响到prefetch base),连接过程只是将该dll的不同obj实现文件和def文件组合成完整pe文件,这些都不能直接决定dll加载位置,而应该由windows加载dll的算法来决定。
"同一个程序运行时其dll加载位置始终相同,不同程序的确是不同的"我估计是因为dll加载算法受其加载的各个dll影响(各个dll大小不同 ,不同dll见可能又有相互依赖性,子dll先于主dll加载等等,未曾深入研究这些)时并不引入随机数,否则同一个程序运行时其dll加载位置也会不同。这样,因为是同一个程序,同一个dll加载算法,那么程序运行时其dll加载位置始终相同,不同程序是不同的
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ccqmpux 2012-3-10 15:56
5
0
多谢了~
游客
登录 | 注册 方可回帖
返回