我目前正在尝试在RE上获得一些实践,并且需要一些修补DLL的帮助。
这是我的步骤:
我首先分析IDA中的主程序和dll,以了解逻辑。 。然后,我切换到OllyDBG进行修补。好吧,问题在于,由于Olly动态加载dll(与IDA中的静态独立分析相反),所以偏移量是不同的,而且我不知道如何找到我在IDA中检查过的偏移量。 >是否有一些简单的方法可以“重新发现” dll中的偏移量?

预先感谢!

评论

您修补实时程序还是在磁盘上?为什么不在IDA中全部使用呢?

我猜实际的偏移量是相同的,但是基数已更改?

直接在IDA(Pro 6.1)中运行补丁程序?怎么样?我可以在IDA中使用“汇编”功能,然后导出diff。但是直接运行更改后的代码吗?此外,由于更改是在dll中进行的,并且我一次只能打开一个文件,所以我想知道这应该如何工作...

@Caroline:您知道IDA有一个调试器。

#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放入所需的模块即可。