装配绝对JMP / CALL到相对JMP / CALL工具/插件?

时间:2011-09-12 07:17:33

标签: assembly plugins ollydbg ida

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

CALL EAX 

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

所以我想通过对所有绝对调用进行相对调用来轻松解决这个问题。

在踩代码并让所有数学计算得出时,我得到了正确的jmp / call offset。

我没有像没有足够空间来分配补丁的问题。由于绝对调用通常使用我之前可以使用的行来解决问题

绝对呼叫,这是数学结束的地方:

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

转换为喜欢

seg000:0044F7D1                 call     3B882683h

以上当然不会起作用,因为eax已经是某种东西,但它只是一个伪代码示例

我的问题不是如何做到这一点,但有没有任何插件可以在OllyDbg或IDA Pro中为我自动执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用LoadLibrary

  

使用KERNEL32.LoadLibraryA

     

KERNEL32.GetProcAddress

     

致电eax

     

KERNEL32.FreeLibrary

当您导入标题时,所有函数地址都将保存到稳定地址。函数的地址是变化的,但是你总是将这些稳定的地址称为函数的地址。

您可以通过某些程序查看dll函数的地址,例如" pe explorer"。 enter image description here

您总是拨打00402008h,但00402008h不是您的功能地址。 值00402008是您的函数的地址。

  • FF25 08204000将调用值00402008
  • E8 05000000将拨打eip + 00000005

答案 1 :(得分:0)

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

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

很容易制作这样的插件,但它永远不会那样。 EAX可能会在代码部分中发生变化,这就是调用为“变量”的原因。想象一下,代码的一部分控制游戏中的门或者其他什么,如果你不允许通过EAX或任何其他注册会改变调用函数不让你通过,否则你被允许,因为你有一把钥匙或类似的东西,代码将EAX更改为调用执行代码打开门的地址。这只是一个例子,因为有变量调用。你想到的一个插件,必须听取所有那些可能是一个非常庞大的大规模的调用,并且会导致错误或没有概述。

所以对你来说最简单的方法是打破这个电话并阅读寄存器。 我希望这可以帮助你理解或者我没有回答正确,你的问题有点误导,因为你说了关于JMPs和dll注入的事情让我感到恼火。您可以通过私信或此处告诉我更详细的信息。