这是我的步骤:
我首先分析IDA中的主程序和dll,以了解逻辑。 。然后,我切换到OllyDBG进行修补。好吧,问题在于,由于Olly动态加载dll(与IDA中的静态独立分析相反),所以偏移量是不同的,而且我不知道如何找到我在IDA中检查过的偏移量。 >是否有一些简单的方法可以“重新发现” dll中的偏移量?
预先感谢!
#1 楼
如果仅更改了基数,但偏移量是恒定的(我猜是这样),则可以在IDA中重新设置程序的基数。您可以通过编辑->段->重新设置程序...菜单来实现。在IDA中指定与Olly中相同的起始基础应该会有所帮助。基地可能由于多种原因而有所不同,其中之一可能是ASLR。
评论
我通常使用感觉很笨拙的calc计算它。必须有比手动执行此类操作或来回调整基础更好的方法。根据我的经验,重新设置基准后,您会在IDA中遇到一些符号错误。
–彼得·安德森(Peter Andersson)
13年4月17日在15:29
我想我遇到了同样的问题,有时我会来回计算地址,这很容易出错而且很乏味。也希望看到更好的解决方案。
–0xea
13年4月17日在20:41
#2 楼
是否有一些简单的方法可以“重新发现” dll中的偏移量?
是的,这是算法:
Target_Address_in_OllyDbg = Source_Address_in_IDA - Base_Address_in_IDA + Base_Address_in_OllyDbg
这是定义:
Target_Address_in_OllyDbg
:OllyDbg中的目标地址。Source_Address_in_IDA
:IDA中的源地址。Base_Address_in_IDA
:IDA中反汇编模块的基地址。您可以通过在IDA菜单栏中转到编辑->细分->重新设置程序...来找到该值。该对话框中的Image base的值是Base_Address_in_IDA
。Base_Address_in_OllyDbg
:OllyDbg中目标模块的基地址。您可以通过在OllyDbg中按Alt-E(或转到OllyDbg菜单栏中的查看->可执行模块)找到此值。在“可执行模块”窗口中找到目标模块;最左边的字段(基本)是Base_Address_in_OllyDbg
。#3 楼
如果有人发现它有用,我就为自己准备了一个小计算器,以使用上述相同的算法轻松获取反汇编程序中的位置地址。当前默认为二进制忍者的基址,但这很容易在代码中更改。
https://github.com/scrapbird/OffsetCalc
#4 楼
我使用这个小的IDC脚本我设置了一次基准,然后使用AskAddr输入地址地址
auto olbase , oladdr , rva;
olbase = 0x20000;
oladdr = AskAddr(0,"enter address as seen in olly");
Jump( MinEA() + oladdr - olbase);
#5 楼
我通常在IDA中将其重新设置为0
。然后使用StrongOD的Adv Ctr + G
选项,您只需将IDA中的地址作为RVA放入所需的模块即可。
评论
您修补实时程序还是在磁盘上?为什么不在IDA中全部使用呢?我猜实际的偏移量是相同的,但是基数已更改?
直接在IDA(Pro 6.1)中运行补丁程序?怎么样?我可以在IDA中使用“汇编”功能,然后导出diff。但是直接运行更改后的代码吗?此外,由于更改是在dll中进行的,并且我一次只能打开一个文件,所以我想知道这应该如何工作...
@Caroline:您知道IDA有一个调试器。