我不确定提出这个问题是否对我有任何法律障碍,因此,如果我要求解开包装的建议违反我的道歉规则。

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

我禁用了传递异常的感觉,因为它感觉像是在作弊,而且我还没有完全掌握异常在此情况下的工作方式,似乎是在这里使用的使调试器脱轨,所以我想知道为什么以及如何自行解决。我已经在指南中介绍了这一部分:

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在这里。如您所见,这里确实没有任何内容,但是无论我尝试使用哪种方法(或在教程等中看到的),它始终是我最终的地址,所以我进行了一次进程转储,突然间我得到了: br />


现在让我吃惊的是,由于该程序是自我修改的,这自然会使Olly感到困惑,所以我告诉Olly重新分析代码(在转储进程之前) ,最后我得到了这个结果:



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


为什么Olly无法正确解析此CALL指令?
E8 4F000000怎么会神奇地变成CALL 416537?我在操作码中看不到任何416537。在这里找到答案,以供参考:https://stackoverflow.com/questions/10376787/need-help-understanding-e8-asm-call-instruction-x86。
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认为它是数据,没有理由假定那里有代码。有关如何确保olly将地址视为代码的信息,请参见https://stackoverflow.com/questions/13812554/in-ollydbg-how-do-you-force-hint-disassembly-at-a-location。

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

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

互联网上有很多解释,比我在简短的回答中所写的更为详尽,谷歌搜索“异常处理程序的单步执行”列举了几个不错的例子。

评论


很好的答案!

–ltnaisha
2014年10月1日在21:21

极好的答案...

– 51k
15年10月15日在16:08