我的破解心得(3) (3千字)
破解对象:IrfanView32
破解者:
chcw
在上两节中,我们介绍了通过修补IrfanView32程序来破解其注册检验的方法。
修补程序(或称Patch)是Crack中常用的一种方法,它的缺点也是显而易见的,主要
有以下几点:
1. 不少程序在运行时会检查自身的完整性(如Win Command32),如果发现自身被
修改过,就会立即报错退出,Patch方法对这类程序就无计可施了(除非把程
序检查完整性的部分也给Patch掉)。
2. 有些程序在通过编译优化后,可能不只在一处调用Patch过的代码,因此Patch
此类程序一般要相当小心,对Patch点的选取是关键。如果Patch不好的化,在
程序运行时,可能会产生许多莫名其妙的错误。
3. 有些查毒程序(如MSAV),在扫描硬盘上的程序文件时,同时会生成这些文件
的校验码,以备日后检查文件完整性用。因此,如果我们Patch了一个受查毒
程序校验和保护的程序,查毒程序可能会认为该程序被病毒感染。
4. Patch程序常以执行文件方式提供,容易传播病毒。
5. Patch程序对错误的执行文件版本进行Patch后,会导致无法预料的结果。
另一种常用的Crack方法是直接获取程序的合法注册码或是序列号,然后通过正常的
注册过程完成注册,这种方法可以避免对执行程序本身进行修改,因而不会有Patch方
法的那些问题;它的缺点是工作量较大,破解者往往需要理解整个注册检验函数的工作
机理。
还是以IrfanView32为例,在上一节中,我们已经知道:0041A733 call 00401000语
句很可能就是程序检验注册码的子程序,在这一节中,我们将分析子程序00401000,并
从中获取IrfanView32的注册码。
1. 用WinICE载入I_view32.exe。
2. 按Ctrl D,回到IrfanView32窗口。选择About/Registration,打开注册窗口。
3. 按Ctrl D, 回到WinICE窗口,键入命令BPX MessageBoxA,对消息框设置断点。再键入X
命令,回到注册窗口。
4. 在注册窗口中输入注册码Name=chcw,Code=9530109, 按OK命令键,触发我们刚才设置的
断点,进入WinICE窗口。
5. 用BC *命令清除原先的断点。然后键入命令BPX CS:0041A733,在调用00401000子程序的
语句处设置新的断点。键入X命令,回到IrfanView32窗口。
6. 再次输入注册码,按OK后,触发断点。执行亮带停留在0137:0041A733 call 00401000语
句处,检查该程序的调用,发现参数1为串"chcw"的地址,参数2为串"9530109"的地址,
这就进一步证实了00401000子程序是注册检验函数的猜想。
7. 按F8,进入该子程序调用。其中有不少子程序调用语句和循环,先不去管它们,不断按
F10,跳过(Step Out)这些语句,最后到达00401000子程序的返回语句附近:
:00401280 cmp ebp, eax
...
:00401284 sete cl
...
:00401288 mov eax, ecx
...
:0040128E ret
这几条语句是处理子程序00401000的返回值用的(大部分函数的返回值都放在eax中),
其效果相当于c语言中的return (%epb==%eax);在上两节中,我们知道,当子程序
00401000返回值eax不为零时,注册成功。因此,在对用户输入的姓名和注册码进行一定
的运算之后,只要满足%ebp==%eax,注册就算成功了。记下在语句cmp ebp, eax处的ebp
和eax的值,ebp=00916AFD, eax=10E1B31A。
8. 键入X命令后,回到IrfanView32窗口,再次输入注册码,进入子程序00401000, 设置断点
EPR cs:00401000 cs:00401280 R if ((ebp==00916AFD) || (eax==10E1B31A))
该断点是用来查找从cs:00401000到00401280的语句中,将ebp设置为00916AFD或将eax设
置为10E1B31A的第一条语句。键入X命令后,中断被触发,相继找到ebp=00916AFD是
:0040100E处 call 0045F770子程序调用的返回值。eax=10E1B31A是
:00401276处 call 0045F770子程序调用的返回值。在这两处分别设置一次性断点。发现
对子程序0045F770子程序的两次调用的参数分别为字符串"9530109"和"283226906"。既
然两次调用的函数都是0045F770,那么只要我们将原先的注册码"9530109"改为"283226906"
,调用后的返回值ebp和eax就是相等的,注册也就会成功。
因而得到IrfanView32的注册码为Name="chcw", Code="283226906"。
小结:
00401000是IrfanView32的注册检验函数,该函数首先将用户姓名("chcw")作某种转化后
得到数字代码("283226906"),然后将该代码和用户输入的注册码("9530109")分别通过函
数0045F770进行变换,最后通过比较两者的变换值是否相等来判断注册是否成功。奇怪的
是,IrfanView32在第二步中对数字代码和注册码进行变换时所用的函数都是0045F770。
我们知道,对于函数,当x1=x2时,必有f(x1)=f(x2),所以无论函数0045F770作了何种变
换,我们只要使注册码和通过姓名计算出的数字代码相同,就可以确保注册的成功。
