程序加壳后的脱壳方法主要包括手动和自动两种方式。以下是详细的手动脱壳步骤:
使用动态调试工具
使用OllyDbg等动态调试工具打开加壳后的程序。
运行程序,直到遇到加壳工具的预处理块,即程序原始代码块的解压或解密操作之前。
在运行完程序自脱壳模块后,程序会停留在加壳之前的OEP(入口点)位置。
在真实OEP处下int3断点,捕捉到程序代码段完全恢复的状态。
单步跟踪法
用OD载入程序,不进行代码分析。
单步向下跟踪F8,跟随程序的执行流程。
遇到程序往回跳的(包括循环),在跳转的下一句代码处按F4(或右健单击代码,选择断点——运行到所选)。
观察跳转是否实现,绿色线条表示跳转未实现,红色线条表示跳转已实现。
如果刚载入程序,在附近就有一个CALL的,就跟进去,很快就能到程序的OEP。
在跟踪过程中,如果运行到某个CALL程序就运行的,就在这个CALL中F7进入。
ESP定律法
在OD的寄存器中,观察ESP寄存器的值。
在命令行下,使用dd命令设置硬件断点,例如:`dd 0012FFA4`(0012FFA4指在当前代码中的ESP地址),按回车。
运行程序,当程序在断点处停下来时,ESP寄存器的值会显示当前代码中的ESP地址。
通过这个地址,可以找到程序的OEP。
自动脱壳
使用一些脱壳工具,如UPX Unpacker,对已加壳的程序进行脱壳。
这些工具会自动解析加壳算法,将加壳后的代码还原为原始代码。
建议
手动脱壳:需要一定的汇编语言和软件调试知识,适合有一定经验的逆向工程师。
自动脱壳:方便快捷,适合初学者和需要快速脱壳的情况。
选择哪种方法取决于具体情况和需求。对于复杂的加壳程序,可能需要结合多种方法进行脱壳。