调试器中的基址和实际地址之间的区别

时间:2014-09-01 09:50:16

标签: reverse-engineering assembly debugging

我在寻找免疫调试器的immlib库中的不同功能。 我在调试器中启动了python shell并运行了以下命令:

>>>imm.assemble("jmp esp")
'\xff\xe4'

>>>imm.search("\xff\xe4")
[2090082029, 4411432, 2011716026, 2011814593, 2011483641, 2011550166, 2012419704, 1714392763, 1714402743, 2011113280, 2011241515, 2011395627, 2011399149, 2010689290, 2010819775, 2010819791, 2010819803, 2010845836, 2010849532, 2010849836, 2010851408, 2010855771, 2010855971, 2010856648, 2010856656, 2010856660, 2010857271, 2010857704, 2010857708, 2010857712, 2010857855, 2010857908, 2010857916, 2010858051, 2010859271, 2010860975, 2010863952, 2010864044, 2010864056, 2010864200, 2010864484, 2010864488, 2010864492, 2010866771, 2010866843, 2010867036, 2010882823, 2010883011, 2010890923, 2010893560, 2010897288, 2010897596, 2010903483, 2010903683, 2010904360, 2010904368, 2010904372, 2010905416, 2010905420, 2010905424, 2010905620, 2010905628, 2010906983, 2010908687, 2010911155, 2010911372, 2010911496, 2010911624, 2010911628, 2010911632, 2010911668, 2010911760, 2010911948, 2010912060, 2010912064, 2010912192, 2010912343, 2010912471, 2010914759, 2010938463, 2010938479, 2010938491]

>>>imm.findModule(2090082029)

('ntdll.dll', 2089811968)

所以第一个命令组装" jmp esp"指令。 下一个命令在存储空间中搜索汇​​编的指令。 然后最后一个命令(imm.findModule)找到包含已组装指令的所有模块。

我的查询是使用第二个和第三个命令中返回的地址。

第二个命令中返回的地址是否仅属于已调试进程的内存空间,或者调试器是否搜索整个可用内存空间以搜索已组装的指令?

如果我没错,第三个命令('ntdll.dll', 2089811968)返回的地址是模块本身的基地址?

我的下一个问题是如何识别模块是否在当前程序的内存空间?

我的上一个查询总结了这些,基地址和实际地址之间有什么区别?

1 个答案:

答案 0 :(得分:1)

  

第二个命令中返回的地址是否仅属于已调试进程的内存空间,或者调试器是否搜索整个可用内存空间以搜索已组装的指令?

前者。在一个特定流程中运行的代码只能直接"参见"记忆在同一个过程中。

  

如果我没错,第三个命令返回的地址(' ntdll.dll',2089811968)是模块本身的基地址?

你没错:)

  

我的下一个问题是如何识别模块是否在当前程序的内存空间?

如上所述,这将始终是默认值。要在另一个进程中真正访问内存'内存空间必须使用ReadProcessMemory / WriteProcessMemory。

  

我的上一个查询总结了这些,基地址和实际地址之间有什么区别?

基址通常是指模块的加载地址 - 也就是说,模块的PE头位于内存中。然后,模块的标题,代码和数据的其余部分(映射到内存的部分)遵循模块的指定页面对齐。

有点不清楚你的意思是什么'实际地址'这里 - ntdll.dll在内存中的标头的实际地址与基地址相同。这回答了这个问题吗?