软件脱壳主要有以下几种方法:
硬脱壳
定义:硬脱壳是指找出加壳软件的加壳算法,并编写逆向算法来还原程序到原始形态。
难点:由于加壳软件可能包含加密、变形、虚拟环境等复杂特性,硬脱壳通常非常困难,尤其是当壳代码每次生成都不同的情况下。
动态脱壳
定义:动态脱壳是指在加壳程序运行时,通过调试工具跟踪到程序的OEP(Original Entry Point,原始入口点),然后抓取内存中的镜像并重新构建成标准的执行文件。
方法:
单步跟踪法:使用调试器(如OD)载入程序,通过单步跟踪(F8)和断点(F4)来找到OEP。这种方法适用于大多数情况,但可能需要一些时间来手动跟踪和调试。
ESP定律法:利用ESP寄存器的特性,在命令行下设置ESP的硬件访问断点,直接跳转到OEP。这种方法在遇到无法向下跟踪的大跳转时特别有效。
自动脱壳
定义:自动脱壳使用专门的脱壳工具来自动完成脱壳过程。这些工具通常针对特定类型的加壳软件,如UPX、ASPACK等。
工具:
UPX:使用UPX自身来脱壳,通过命令行参数`-d`。
ASPACK:可以使用UNASPACK或CASPR来脱壳。UNASPACK适用于早期版本的ASPACK壳,而CASPR适用于所有版本的ASPACK壳,但需要在命令行下运行。
PROCDUMP:一个万能脱壳工具,可以对付各种压缩软件的压缩档,但可能不如专门工具高效。
其他方法
文件分析工具:如Fi、GetTyp、peid、pe-scan等,用于侦测壳的类型。
OEP入口查找工具:如SoftICE、TRW、ollydbg、loader、peid等,用于查找OEP。
dump工具:如IceDump、TRW、PEditor、ProcDump32、LordPE等,用于抓取内存中的镜像。
PE文件编辑工具:如PEditor、ProcDump32、LordPE等,用于修复脱壳后的文件。
重建Import Table工具:如ImportREC、ReVirgin等,用于修复脱壳后的导入表。
建议
选择合适的工具:根据加壳软件的类型选择合适的脱壳工具。例如,UPX壳可以用UPX自身脱壳,ASPACK壳可以用UNASPACK或CASPR。
手动与自动结合:对于复杂的壳,可以结合手动和自动的方法,先通过手动跟踪找到OEP,然后使用自动工具进行脱壳。
更新工具:加壳软件不断更新,脱壳工具也需要不断更新以应对新的加壳技术。定期检查并更新脱壳工具是必要的。
掌握这些方法可以帮助你更有效地进行软件脱壳,从而更好地进行软件汉化或其他逆向工程任务。