为什么 Olly 的分析在这个代码部分不能正常工作?

逆向工程 ollydbg 开箱
2021-06-20 08:14:15

我不确定我问这个问题是否有任何法律障碍,所以如果要求拆箱建议违反规则,我深表歉意。

我是逆向工程的新手,并尝试手动解压 PEtite 2.2/2.3 作为学习经验,并且一直在尝试遵循本指南:http : //users.freenet.am/~softland/tutorials/Petite.v2.3。 MUP.txt我正在解包的程序是原始的 PEtite 打包程序本身。

我禁用了传递异常,因为感觉像是在作弊,而且我还没有完全理解异常在这种情况下的工作原理,似乎在这里用来破坏调试器,所以我想知道为什么以及如何自己解决它。我已经来到指南中的这一部分:

and this exception program generates for jumping to exception handler, so at that line put
breakpoint on exception handler (goto to 4164E3 and press F2), then press SHIFT+F9 and
you are at the beginning of exception handle

当使用 OllyDbg 1.10(未打补丁)时,这是我在异常处理程序的地址中找到的(这个地址也是 Olly 在我尝试自动解包器 SFX 功能时所说的 OEP 所在的地址):

在此处输入图片说明

在指南中它说我应该在004164E3 CALL PETGUI.00416537这里找到这条线正如您所看到的,这里真的什么都没有,但是无论我尝试使用哪种方法(或在教程等中看到),它都是我最终到达的地址,所以我做了一个进程转储,突然我得到了这个:

在此处输入图片说明

现在让我震惊的是,由于程序是自我修改的,这自然会混淆 Olly,所以我告诉 Olly 重新分析代码(在转储进程之前),我最终得到了这个:

在此处输入图片说明

我得到了预期的结果,但是缺少一些东西......CALL可以在操作码部分看到指令,但它没有被 Olly 解析。现在我的问题:

  1. 为什么 Olly 不能CALL正确解析这条指令?
  2. 怎么会E8 4F000000神奇地变成CALL 416537416537在操作码中看不到任何内容在这里找到了答案,留作参考:https : //stackoverflow.com/questions/10376787/need-help-understanding-e8-asm-call-instruction-x86
  3. MOVS异常处理程序结束之前引发异常指令中,如果我按Shift-F7Shift-F8单步执行而不是Shift-F9我以某种方式结束了 4E3137,它充满了ADD BYTE PTR DS:[EAX], AL指令,大概是填充指令的区域,稍后将被覆盖。我怎么到了这里?如果我尝试继续踩踏,我会被告知EIP已设置为00000000无法继续。每当我选择异常单步时,情况似乎就是这样;如果我刚刚使用Shift-F9.

我在 OllyDbg 2.01 中也有同样的问题。

1个回答

因为 0x4164e3 处的代码从未在 CALL 或 JMP 指令中引用,但(可能)用作其他地方的数据(正如您所说的程序是自修改的),Olly 认为它是数据,并且没有理由假设那里有代码. 请参阅https://stackoverflow.com/questions/13812554/in-ollydbg-how-do-you-force-hint-disassembly-at-a-location了解如何确保 olly 将该地址视为代码。

(如果链接消失:右键单击 -> 分析 -> 在下一次分析期间,将选择视为 -> 命令,或者至少“从部分删除分析”以告诉 olly 不要假设数据。)

单步异常处理程序的问题是:如果你做任何一种单步,调试器会在下一条指令处放置一个断点,在当前指令处执行代码,并希望断点将控制权返回给调试器. 但是,异常会调用异常处理程序,但调试器甚至不知道该指令将引发异常,因此它无法将断点放在异常处理程序的地址处。因此,您的单步执行异常处理程序(不返回调试器),它可能会在它来自的指令之后检查断点(以主动检测调试器),如果检测到调试器,则跳转到“无处”使程序崩溃/混淆调试器用户。

互联网上有很多解释比我在简短回答中写的更彻底,谷歌搜索“异常处理程序单步”带来了一些很好的例子。