前面几天过年去了,直接他妈摆了小半个月,要死,最近继续之前的进度。
警告窗口
Nag的意思是烦人。Nag窗口是软件设计者用来不时提醒用户购买正式版本的窗口。
去除Nag窗口常用的办法有三个:1.修改程序的资源2.静态分析3.动态分析
使用资源修改工具去除窗口是不错的方法。可以通过将可执行文件中警告窗口的属性改成透明或者不可见来变相去除警告窗口。若要完全去除警告窗口,只需要找到创建该窗口的代码并跳过。
以下为一个实例。
这里使用的方法也可以理解为直接关闭对话框。
时间限制
时间显示程序分为两类,一类是限制每次运行的时间,一类是不限制单次,限制总时间,比如使用三十天。
1.计时器
在Dos中,应用程序通过接管系统的计时器中断来维护一个计时器(int 8h或者int 1Ch)。每55ms发生一次(18.2次/秒)。
setTimer()函数
在初始化时调用这个API函数,会向系统申请一个计时器并指定计时器的时间间隔,并获得一个处理计时器超时的回调函数。若超时,系统会向申请该计时器的窗口过程发送消息WM_TIMER或者调用回调函数。
因为通过Windows消息的方式工作,因此精度有一定的限制。
高精度的多媒体计时器
精度可以达到1ms。
GetTickCount()函数
精度取决于系统的设置。
timeGetTime()函数
一般不用。
2.时间限制
安装时就已经获取了当前的系统日期并记录在某个地方,也许是注册表中某个不起眼的位置等等。解除这种限制也比较容易。到期后重新调整日期就可以。而与此相对加密者最好将这个时间值存在多个地方。
另一个时间值就是软件最后一次的日期。这个是为了防止用户将机器日期改回去而存在的。如果这个日期早于系统日期就是用户修改了机器日期。
用来获取时间的API函数也有很多,程序一般不直接获取,而是通过采用高级语言中封装好的类来操作系统时间等。
需要注意的是采用时间限制的软件必须能防范regmon,filemon之类的监视软件。
3.拆解时间限制保护。
菜单功能限制
用来限制菜单的某些功能。
1.相关函数
2.拆解菜单限制保护
KeyFile保护
就是利用文件来注册软件的一种方式,KeyFile一般是一个小文件,可以是纯文本文件也可以是不显示字符的二进制文件。
软件作者可以加入一些垃圾信息来干扰解密者,或者分散开来并且通过算法来计算出秘钥。
1.相关API函数
2.拆解KeyFile保护
1.拆解KeyFile一般思路
①用监视软件来监视文件的操作,找到keyfile的文件名
②伪造一个keyfiile,用编辑软件。
③调试器里使用creatfileA设断,查看打开的文件名指针并记下返回的句柄。
④用ReadFile设断,分析传递给ReadFile函数的文件句柄和缓冲区地址。
以上是大致步骤,有的程序判断Keyfile会先判断文件大小,属性,移动指针等。
总之,对keyfile的分析深入与否取决于API编程水平。
2.监视文件的操作
3.分析过程
网络验证
是一种很流行的保护技术,优点是可以将一些关键数据放到服务器上,软件必须从服务器中得到这些数据才能运行。拆解它的思路就是拦截服务器返回的数据包,分析程序是如何处理数据包的。
1.相关函数
有send(),recv(),前者是发,后者是收。
2.一般思路。
如果网络验证的数据包固定,可以将数据包抓取,写一个本地服务端来模拟服务器
如果验证的数据包不固定,则必须分析结构找出算法。
实际操作中难以接触到服务端,所以要从客户端入手,利用一组正确的账号来击破网络验证保护机制。
1.分析发送的数据包
2.分析接受的数据包
3.解除网络验证
光盘验证
最简单也最常见的是程序在启动时看看光盘里是否有特定的文件,一般是用getlogicaldrivestrings或者getlogicaldrives函数得到所有驱动表,再用函数检查每个驱动器。
这样的方法是比较容易被破解的。解密者只要在上面的api函数设断就可以找到判断指令。
有一种增强型是把程序运行时需要的关键数据放在光盘中,这样的话即使解密者能够强行跳过程序启动的检查,但由于没有关键信息,就无法运行。应对方法是利用刻录等技术将光盘复制多份。
1.相关函数
2.拆解
只运行一个实例
有实际与安全性的考虑,要求程序只能运行一个实例。
1.实现方法
实现方法有很多,在此列出常见几种。