- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
对于一些算法复杂的软件,处于时间和精力的考虑,很多时候我们选择暴破。但软件暴破并是不简单的将JNE修改为JE,我们要想完美暴破一个软件就必须分析出软件的验证方式并做出相应的修改以达到目的。我们修改原程序的代码大多有这样几种目的:修改关键跳转后,使软件执行注册功能的代码;向系统写入某个关键信息;向内存中写入某代码以备调用;修改部分指令以跳过软件的自效检等.
常见的软件注册验证设计以及破解思路有以下几种:
1.修改关键跳即可达到破解;软件验证注册信息时调用算法Call部分,修改关键跳后使软件执行注册功能.
2.软件修改关键跳后,保存入系统的将是正确的注册信息(或者保存的是代表软件已注册的字符或其他);这种软件也可以修改关键跳达到破解之目的。这种保存方式属于软件设计上的败笔。
3.软件的算法Call被系统多次调用;软件启动时验证算法CALL部分的返回值来判断软件是否已注册.此时,如果只是修改算法Call下方的跳转,只能显示一个注册正确对话框,在使用软件其他功能时,依旧无法使用注册功能。所以我们需要跟踪软件启动时对注册信息的验证.
举一个简单例子来说明:
某软件注册部分:
……
CALL XXXXXX01 算法CALL
text al,al 比较语句
je XXXXXXX2
……
CALL XXXXXX03 注册成功
……
JMP XXXXXXX4
(上方je跳到这里)
CALL XXXXXX05 注册失败
……
算法CALL调用这个地址(函数)
XXXXXX01 算法CALL地址(算法CALL部分至少要被两次调用启动时和注册时)
……
RETN
如果我们在这里也是将JE修改为JNE,可能当我们再次打开软件时又会出现注册对话框。并没有实现真正的破解。我们知道软件注册成功后,一定会向系统某个文件写入注册信息,因为软件在启动的时候需要对软件是否已注册进行判断。所以,我们暴破一个软件更好的方法就是去了解软件在启动时是如何对注册信息进行验证的。并做出相应的修改,以确保软件的完美暴破。
上文中我们提到算法CALL至少要被两个CALL调用。一处是注册部分,另一个是软件启动时候,软件启动时判断保存的注册信息是否正确,一般仍会调用注册部分的算法CALL来验证注册信息是否正确。所以我们更好的方法就是跟进算法CALL进行修改。但是我们知道,算法CALL也是一个函数。如果软件在启动时有其他函数也调用了该函数或其中的某一部分,需要得到一个返回值或是得到返回值的目的就是来判断算法CALL是否被修改,这种情况,算法CALL部分的一些跳转我们就不可以轻易修改,以免软件启动时候出错。
可以说,暴破是大家发挥想象力和创造力的一个平台,同时对破解的感悟也会有一个很大的提升。某些软件,暴破的难度并不次与算法的分析。当我们研究出算法后,不妨再分析下如何暴破,将是别一翻的享受。 |
|