文章总结了三种随机基址解决方案:
- 关闭随机基址
- 手动转换
- ida自适应
各有优劣,需要根据实际情况使用
0x1 关于随机基址
特性:
- 默认情况下 程序的起始内存地址是
0040 0000
- 随机基址:程序起始地址不是默认值。编译器以及操作系统共同完成
- 缺陷:即使开启了随机基址,短时间内一个exe在同一环境上的内存起始地址是固定的
一共三种方案来解决随机基址的问题,推荐方案2
关闭随机基址
有的程序会依赖随机基址,直接关闭会导致意想不到的情况
手动转换
理想操作,但是很耗费时间
ida自适应
让ida自适应随机出来的内存起始地址,局限性比较大
0x2 方案一:使用工具关闭
- 利用
cff
关闭随机基址功能 - 可选头部->dll属性->dll属性(关闭即可)
0x3 方案二:计算偏移
- 首先在ida中计算出目标内存距离默认地址
00400000
的偏移 - 然后再x64中获取到 程序当前真正的内存地址
- 真正的内存起始地址+偏移=目标内存真正的地址
0x3.1 计算偏移量
首先在ida中定位目标内存
如下运算可以计算出偏移量
- 首先默认起始地址是:
00400000
- 其次ida中
hello
的地址是:00416000
- 所以
偏移地址(恒定)=00416000-00400000=16000
0x3.2 获取内存地址
- 使用x64的内存窗口功能来获取程序当前的内存起始地址
- 这里获取到的起始地址是
012F0000
0x3.3 计算
绝对地址=偏移+内存起始地址
=16000+012F0000
01306000
方案三:修改ida的基址
- 查看 运行时的 基址
- 修改ida中默认的基址