软件脱壳入门—AsProtected Notepad 第一章
本期带来实验室逆向大牛fish翻译的经典文章AsProtected Notepad,原作者E. Labir
摘要
在我阅读那些关于进程转储(dumping)的教程时,总能发现类似这样的话: 按N次F7
嗯,这是程序的入口点(Entry Point)……
用ProcDump(或者其它工具)把进程dump出来
使用软件xxx来重建输入表####
看了这些话,我还是什么也学不到啊!我想要的不是那些只能脱某种壳的雕虫小技,那是远远不够的。我想要真正的学习!
在本文中,我会尽力展示一些软件保护者们常用的反dump或者反调试的手段。我的方法是,实地调试被保护的程序,找到那些反调试的伎俩,解决它们,然后再具体分析如何dump进程(自然还包括如何为进程dump做准备)。
作为示例,我会使用Demo版的AsProtect来保护一些常见的小程序(比如记事本或者注册表编辑器)。文中不会涉及任何商业程序(不要浪费时间来问我有关商业程序的事情)。
声明:运用本文中的知识做什么是你自己的事
关键词:逆向工程 软件保护技术 软件保护系统有效性的分析与评估
目标
在本文中,我使用AsProtect Demo(译注:本文以英文版AsProtect Demo 1.64为例)为记事本程序加壳。就像我在开头说的那样,我不会提供任何关于如何破解商业程序的信息。本文意在阐述如何让你的软件变得更安全,而不是教你破解那些收费软件。
首先,你应该到AsProtect的网站上下载Demo版,并且阅读一下帮助文档,从而大致了解AsProtect是如何保护程序的。
在加壳时,我设置了所有的保护选项:
Resource Protection = Yes
Use Max. compression = Yes
Anti-debugger = Yes
Checksum = Yes
Trial info = Limited Trial:
Number of Days = 30
Number of Executions = 10
Reminder Message = Yes
Expiration Date = 2003/12/31
按下“Protect!”按钮,日志窗口中会出现类似这样的输出:
Use CRC check protection…
Use anti-debugger protection…
Use 30 trial days limitation…
Use expiration date (31/12/03)…
Use 10 executions limitation
Use reminder
Use build-in dialogs…
Protection done.
File size: … compressed to …, Ratio: …%
介绍
AsProtect功能丰富,例如:
保护程序的特定部分;
保护导入表,防止破解者把它dump出来;
通过添加垃圾指令增大分析的难度;
提供反调试、自校验功能
隐藏OEP(Original Entry Point,原始入口点)
将使用时间限制和注册信息保存在注册表中
为程序员提供了一些特殊的API,例如GetRegistrationInformation()
本文中,我不会浪费时间来分析RSA保护(译注:AsProtect提供的注册保护是基于RSA-1024的)。就算我找到了算法中的问题,作者要解决它也是非常容易的(译注:针对AsProtect中曾经存在的关于RSA算法的问题,可以参考How to break RSA-1024? Asprotect 1.0/1.1/1.11c[Amenesia//TKM!])。
如果你在保护程序时使用了加密算法来加密程序,带来的问题显而易见:要么你将程序中的一个重要部分加密,那么没人能完整地试用你的Demo版;要么你只加密了一个简单的小功能(例如“保存”),那么破解者可以用自己写的代码替换掉你加密的部分。因此在这里加密算法其实并不重要。
你需要准备以下工具软件:
调试器。我使用OllyDbg,下面也将以它为例进行说明。
十六进制编辑器。我用hiew。(译注:其它软件,例如UltraEdit、WinHex等也都可以,看你喜好了)
Procdump,用来将程序从内存中dump成文件。(译注:OllyDbg有dump插件OllyDumpEx,LordPE也是一个不错的选择。)
你不需要准备的工具:
输入表重建工具(例如IAT Reconstructor)注意,在练习脱壳时,你可以用一些技巧使得整个过程更容易:
写一个简单的小程序,并为它加壳,试着找到入口点(在程序开头弹个对话框出来是很有帮助的)。你绝对应该在代码中适当的地方留下一些标记(例如不常见的字符串),这些标记会有助于你找到你想要的信息。如果你把调试器附加到要调试的程序上(而不是使用调试器加载目标程序),那些标记就更有用了。
为记事本加壳,然后再试试脱壳。看看你之前的结论还适用么?
用真实的带壳程序来脱壳,然后加以比较。
试着增加/去除不同的保护选项(是否使用时间限制、是否压缩附加资源等)。
从简单到复杂,一步一个脚印,脱壳对你来说就不算什么难事。这个策略同样可以说明,一个加壳软件提供演示版来给程序加壳并不是什么好主意,对不对?不过令人惊奇的是,好像没什么人遵循这个策略诶。