终于拿到了黑防的杂志,里面有一款“SQL格式化工具”,居然要花50RMB注册,虽然可以试用,但还是觉得很不爽,于是继续我的作风,支持盗版.
先查壳,Borland Delphi 6.0 - 7.0 编写。建议初学的话用Dede3.5 分析Delphi 程序。先看程序,随便输入KEY,就会提示说“非法注册号”,一般我们根据他的错误提示,用OD就可以找到他的错误信息,在出错附近就可以找到他的关键跳,也就是常说的“暴点”.
0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C
0062AC35 |. 84C0 TEST AL,AL //比较
0062AC37 |. 74 0A JE SHORT sqlpp.0062AC43
0062AC39 |. C783 4C020000>MOV DWORD PTR DS:[EBX+24C],1
0062AC43 |> 83BB 4C020000>CMP DWORD PTR DS:[EBX+24C],1
0062AC4A |. 75 17 JNZ SHORT sqlpp.0062AC63 //关键跳
0062AC4C |. 6A 00 PUSH 0 ; /Arg1 = 00000000
0062AC4E |. 66:8B0D C0AC6>MOV CX,WORD PTR DS:[62ACC0] ; |
0062AC55 |. B2 02 MOV DL,2 ; |
0062AC57 |. B8 CCAC6200 MOV EAX,sqlpp.0062ACCC ; |感谢您的注册!
0062AC5C |. E8 27C6E0FF CALL sqlpp.00437288 ; \sqlpp.00437288
0062AC61 |. EB 15 JMP SHORT sqlpp.0062AC78
0062AC63 |> 6A 00 PUSH 0 ; /Arg1 = 00000000
0062AC65 |. 66:8B0D C0AC6>MOV CX,WORD PTR DS:[62ACC0] ; |
0062AC6C |. 33D2 XOR EDX,EDX ; |
0062AC6E |. B8 E4AC6200 MOV EAX,sqlpp.0062ACE4 ; |非法注册号!
0062AC73 |. E8 10C6E0FF CALL sqlpp.00437288 ; \sqlpp.00437288
我们可以看到在0062AC4A 处的地方JNZ SHORT sqlpp.0062AC63 如果不相等就跳到0062AC63 提示“非法注册号”,有一点破解经验的朋友应该可以想到,改JNZ 为 JZ 就可以了。
虽然是弹出了注册成功的窗口,但是你也别高兴的太早.程序还是和适用版一样.也就是说,我们破解是很失败的.因为这个程序判断是否注册至少有三到四个地方判断,甚至更多.
1 程序刚启动的时候 2 点注册的时候 3 使用非注册功能的时候 4.暗桩
虽然你可以一个一个的找到,然后都给暴破,但是,这样很麻烦,也很难找,以前破过一个飞翔企业名录搜索王,判断注册和限制功能居然有10多个地方,虽然最后一个一个的把限制都找出来了。但是,回想起来,仍然觉得是败笔.
我们还得仔细分析.
0062AC24 |. E8 3BC3FFFF CALL sqlpp.00626F64
0062AC29 |. 84C0 TEST AL,AL
0062AC2B |. 74 16 JE SHORT sqlpp.0062AC43
0062AC2D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C
0062AC35 |. 84C0 TEST AL,AL
0062AC37 |. 74 0A JE SHORT sqlpp.0062AC43
这里有2个比较,第一个比较是试用比较,程序不是有30次的试用功能吗?这个比较就是判断你是否使用次数满30次,如果满了,就提示注册。
采用的是保存注册表的形式,你可以在这个键值下找到他的试用判断,如果试用过期了你把里面的内容改成零,又可以使用了。HKEY_LOCAL_MACHINE\SOFTWARE\gudusoft\easypp
接着,我们来跟入第2个call,
0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C
这里应该就是算法了.
0062728C /$ 55 PUSH EBP //算法入口
0062728D |. 8BEC MOV EBP,ESP
0062728F |. 83C4 A8 ADD ESP,-58
00627292 |. 53 PUSH EBX
……省略部分
006272DB |. E8 3C25DEFF CALL sqlpp.0040981C
006272E0 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
006272E3 |. E8 00DADDFF CALL sqlpp.00404CE8
006272E8 |. 83F8 13 CMP EAX,13 //判断注册的长度
006272EB |. 0F85 19010000 JNZ sqlpp.0062740A
…..省略部分
006273C5 |. 3B1A ||CMP EBX,DWORD PTR DS:[EDX]
006273C7 |. 74 04 ||JE SHORT sqlpp.006273CD
006273C9 |. 33C0 ||XOR EAX,EAX
我们看这一句
006272E8 |. 83F8 13 CMP EAX,13 判断注册的长度是否为19位,不相等就跳到 006273C9 |. 33C0 ||XOR EAX,EAX 清零.
那注册码很有可能是这样的格式0000-0000-0000-0000
来看算法部分,暴难,向老K求救就给了我几句.我是从头到尾都没有看懂。
MOVZX EAX,BYTE PTR DS:[EAX] //取[初始]位
MOVZX EAX,BYTE PTR DS:[EAX+12] //取[初始+18]位(第19位)
MOV EAX,DWORD PTR SS:[EBP-8] //计算后的[EBP-8]中的值赋给EAX备用
MOV DWORD PTR SS:[EBP-38],EAX // 把上面的值写回到[EBP-38]中继续备用
尝试了一下,用PEID的查壳插件,查看他的算法.
BASE64的算法.根据前辈记载,是个很牛B的强算法.心就凉了半截.继续分析.
我们在来跟,看程序上方,有试用版的提示,如果程序注册那应该就很没有试用版的字样,那应该也是调用算法.
006286A9 |. E8 DEEBFFFF CALL sqlpp.0062728C //调用算法
006286AE |. 84C0 TEST AL,AL //比较
006286B0 |. 75 38 JNZ SHORT sqlpp.006286EA //不相等就有跳到试用版…
006286B2 |. 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
006286B5 |. 8BC3 MOV EAX,EBX
006286B7 |. E8 9848E4FF CALL sqlpp.0046CF54
006286BC |. FF75 E8 PUSH DWORD PTR SS:[EBP-18]
006286BF |. 68 70886200 PUSH sqlpp.00628870 ; 试用版
我们可以看到,这里调用的算法地址,和前面调用的算法地址做个比较。
006286A9 |. E8 DEEBFFFF CALL sqlpp.0062728C
0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C
嘿嘿,发现了吧。都是调用同一个算法。那我们修改算法部分代码,会怎样了。来到算法的入口。
0062728C /$ 55 PUSH EBP
直接把这句改成为,
Mov al,1
RETN
那程序在调用算法的时候,就把al的赋值为1,接着RETN结束call,TEST AL,AL 的时候就成立了。我们来保存一下修改结果,看看效果。
程序已经没有试用版的提示了,注册提示窗口也没有了.虽然没有提示,其实,注册已经成功了。不信可以看看。
总结:
这次破解,虽然程序使用的base64的不可逆强算法,但是它众多判断却是调用同一个地址的算法,这样,却成了这个强算法的软肋,我们只要修改算法的调用入口,就可以轻松的达到一劳永逸办法.希望此文能给在学习反汇编的朋友一个思路,高手见笑了.有不足地方,还望指点.
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛https://bbs.txwb.com |
关注天下网吧微信,了解网吧网咖经营管理,安装维护:
本文来源:赛迪网 作者:佚名