欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

软件脱壳入门—AsProtected Notepad 第一章

程序员文章站 2022-04-22 10:47:29
本期带来实验室逆向大牛fish翻译的经典文章AsProtected Notepad,原作者E. Labir 摘要 在我阅读那些关于进程转储(dumping)的教程时,总能发现类似这样的话:...

本期带来实验室逆向大牛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)注意,在练习脱壳时,你可以用一些技巧使得整个过程更容易:
写一个简单的小程序,并为它加壳,试着找到入口点(在程序开头弹个对话框出来是很有帮助的)。你绝对应该在代码中适当的地方留下一些标记(例如不常见的字符串),这些标记会有助于你找到你想要的信息。如果你把调试器附加到要调试的程序上(而不是使用调试器加载目标程序),那些标记就更有用了。
为记事本加壳,然后再试试脱壳。看看你之前的结论还适用么?
用真实的带壳程序来脱壳,然后加以比较。
试着增加/去除不同的保护选项(是否使用时间限制、是否压缩附加资源等)。
从简单到复杂,一步一个脚印,脱壳对你来说就不算什么难事。这个策略同样可以说明,一个加壳软件提供演示版来给程序加壳并不是什么好主意,对不对?不过令人惊奇的是,好像没什么人遵循这个策略诶。