如何通过函数地址获取模块全局变量的地址及偏移量?
问题
已知某函数的地址,能否获取以下模块全局变量的地址?若可以,请问如何获取它们的偏移量?
const char* BotArgs[4] bool UseBotArgs
附IDA反汇编信息:
- 截图1(mp.dll):显示全局变量
BotArgs、UseBotArgs在mp.dll中的内存地址标注 - 截图2(mp.dll & cs.so代码):展示代码中引用这些全局变量的指令逻辑
解答
可以通过已知函数地址获取这两个全局变量的地址,具体方法如下:
1. 推导模块基址
从已知函数地址反推其所属模块(此处为mp.dll)的基址:模块基址 = 已知函数地址 - 该函数在模块内的偏移量
函数的模块内偏移可在IDA的函数窗口或调试器模块信息中查看。
2. 获取全局变量的模块内偏移
- 直接读取法:从IDA截图1中可直接获取变量的模块内偏移(例如截图中
BotArgs偏移为0x001E70C0,UseBotArgs偏移为0x001E70E0,以实际标注为准)。 - 指令反推法:若没有直接标注,可通过截图2中引用变量的指令计算。比如代码中访问全局变量的
lea/mov指令会包含变量的内存地址,用该地址减去模块基址,即可得到变量的模块内偏移。
3. 计算全局变量实际地址
全局变量实际地址 = 模块基址 + 变量的模块内偏移
示例计算
假设mp.dll加载基址为0x10000000,BotArgs的模块内偏移是0x001E70C0,则BotArgs实际地址为:0x10000000 + 0x001E70C0 = 0x101E70C0
同理,UseBotArgs实际地址为模块基址 + 其对应偏移量。
此外,也可通过函数与变量的相对偏移计算:用已知函数的实际地址减去其模块内偏移得到基址,再叠加变量偏移即可得到目标地址。
内容的提问来源于stack exchange,提问作者Hattrick HKS
相关产品推荐
相关产品推荐

