我目前正在尝试在 RE 中获得一些练习,我需要一些帮助来修补 DLL。下面是我的步骤: 我首先分析主程序和 IDA 中的 dll 试图理解逻辑。然后我切换到 OllyDBG 进行修补。好吧,问题是,由于 Olly 动态加载 dll(与 IDA 中的静态独立分析相反),偏移量不同,我不知道如何找到我在 IDA 中检查过的偏移量。是否有一些简单的方法可以“重新发现”dll 中的偏移量?
提前致谢!
我目前正在尝试在 RE 中获得一些练习,我需要一些帮助来修补 DLL。下面是我的步骤: 我首先分析主程序和 IDA 中的 dll 试图理解逻辑。然后我切换到 OllyDBG 进行修补。好吧,问题是,由于 Olly 动态加载 dll(与 IDA 中的静态独立分析相反),偏移量不同,我不知道如何找到我在 IDA 中检查过的偏移量。是否有一些简单的方法可以“重新发现”dll 中的偏移量?
提前致谢!
如果只更改了基数,但偏移量是恒定的(我猜是这种情况),您可以在 IDA 中重新设置程序的基数。您可以通过 edit->segments->Rebase program ... 菜单来实现。在 IDA 中指定与 Olly 中相同的起始基数应该会有所帮助。Base 可能因多种原因而不同,其中之一可能是 ASLR。
是否有一些简单的方法可以“重新发现”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 菜单栏中的Edit --> Segments --> Rebase program...找到该值。该值用于图像的基础在该对话框中是Base_Address_in_IDA
。
Base_Address_in_OllyDbg
: OllyDbg 中目标模块的基址。您可以通过在 OllyDbg 中按Alt-E来找到这个值(或者通过在 OllyDbg 的菜单栏中进入查看 --> 可执行模块)。在“可执行模块”窗口中找到您的目标模块;最左边的字段 ( Base ) 是Base_Address_in_OllyDbg
.
如果有人觉得它有用,我给自己做了一个小计算器,可以轻松获取使用上述相同算法的反汇编器中位置的地址。它目前默认为二进制 ninja 的基地址,但这很容易在代码中更改。 https://github.com/scrapbird/OffsetCalc
我使用这个小的 idc 脚本我设置了一次基数并使用 AskAddr 输入 olly 地址
auto olbase , oladdr , rva;
olbase = 0x20000;
oladdr = AskAddr(0,"enter address as seen in olly");
Jump( MinEA() + oladdr - olbase);