0

我有这个程序,我正在尝试逆向工程。我不知道是编译器的优化器还是混淆器,但是现在调用其他函数的代码的某些部分是通过数学计算然后调用的,例如

CALL EAX 

它可以正常工作,直到它作为 DLL 加载到另一个程序中。基地址偏移量已更改,因此现在所有相关代码都可以正常工作,但所有数学计算的调用/jmps 都没有转到正确的区域。

所以我想我可以通过将所有绝对调用变成相对调用来轻松解决这个问题。

在单步执行代码并计算所有数学时,我得到了正确的 jmp/call 偏移量。

我没有像没有足够的空间来分配补丁这样的问题。由于绝对调用通常使用之前的行,我也可以使用它来修复问题

绝对调用,这是数学结束的地方:

seg000:0044F7D1                 add     eax, 3B882683h
seg000:0044F7D6                 call    eax

转换为喜欢

seg000:0044F7D1                 call     3B882683h

好吧,上面当然不会工作,因为 eax 已经是什么了,但这只是一个伪代码示例

好吧,我的问题不是如何做到这一点,而是在 OllyDbg 或 IDA Pro 中是否有任何插件可以自动为我做到这一点?

4

2 回答 2

1

你可以使用 LoadLibrary

使用 KERNEL32.LoadLibraryA

KERNEL32.GetProcAddress

调用 eax

KERNEL32.FreeLibrary

同样,当您导入标头时,所有函数地址都会保存到稳定地址。函数的地址是变化的,但您总是将这些稳定地址称为函数地址而不是函数地址。

您可以通过“pe explorer”等程序查看dll函数的地址。 在此处输入图像描述

你总是调用 00402008h ,但 00402008h 不是你函数的地址。00402008 的值是您的函数的地址。

  • FF25 08204000 将调用值为 00402008
  • E8 05000000 将调用 eip + 00000005
于 2015-07-29T23:05:44.557 回答
0

你想得到变量调用的计算地址,这真的很难弄清楚,因为它们不相等,你在这部分是如何解释的

seg000:0044F7D1 添加 eax,3B882683h seg000:0044F7D6 调用 eax

制作这样的插件真的很容易,但绝不会像那样。EAX 可能会在这部分代码中发生变化,这就是调用是“变量”的原因。试想一下,游戏中的一部分代码控制一扇门或其他任何东西,如果您不允许通过 EAX 或任何其他寄存器将更改为调用该函数不让您通过,否则您被允许,因为您有钥匙或类似的东西,代码会将EAX更改为调用执行代码以打开门的地址。这只是一个示例,因为存在带有变量的调用。您考虑的插件必须监听所有可能的调用,这些调用可能是一个非常巨大的质量并且会导致错误或没有概述。

所以对你来说最简单的方法是在这个调用之前中断并读取寄存器。我希望这可以帮助你理解或者我没有回答正确,你的问题有点误导,因为你说的关于 JMP 和 dll 注入的事情让我很恼火。你可以在私信或这里告诉我更详细的信息。

于 2011-10-09T19:29:36.413 回答