| 关键词: nbsp 算法 sqlpp 0062 试用版 注册 程序 AC EAX CALL |
首发于《黑客防线》杂志骗钱,高手略过。 终于拿到了黑防的杂志,里面有一款“SQL格式化工具”,居然要花50RMB注册,虽然可以试用,但还是觉得很不爽,于是继续我的作风,支持盗版. 先查壳,Borland Delphi 6.0 - 7.0 编写。建议初学的话用Dede3.5 分析Delphi 程序。先看程序,随便输入KEY,就会提示说“非法注册号”,一般我们根据他的错误提示,用OD就可以找到他的错误信息,在出错附近就可以找到他的关键跳,也就是常说的“暴点”.0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C0062AC35 |. 84C0 TEST AL,AL //比较0062AC37 |. 74 0A JE SHORT sqlpp.0062AC430062AC39 |. C783 4C020000>MOV DWORD PTR DS:[EBX+24C],10062AC43 |> 83BB 4C020000>CMP DWORD PTR DS:[EBX+24C],10062AC4A |. 75 17 JNZ SHORT sqlpp.0062AC63 //关键跳0062AC4C |. 6A 00 PUSH 0 ; /Arg1 = 000000000062AC4E |. 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.004372880062AC61 |. EB 15 JMP SHORT sqlpp.0062AC780062AC63 |> 6A 00 PUSH 0 ; /Arg1 = 000000000062AC65 |. 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.00626F640062AC29 |. 84C0 TEST AL,AL0062AC2B |. 74 16 JE SHORT sqlpp.0062AC430062AC2D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]0062AC30 |. E8 57C6FFFF CALL sqlpp.0062728C0062AC35 |. 84C0 TEST AL,AL0062AC37 |. 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,ESP0062728F |. 83C4 A8 ADD ESP,-5800627292 |. 53 PUSH EBX……省略部分006272DB |. E8 3C25DEFF CALL sqlpp.0040981C006272E0 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]006272E3 |. E8 00DADDFF CALL sqlpp.00404CE8006272E8 |. 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.006273CD006273C9 |. 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,EBX006286B7 |. E8 9848E4FF CALL sqlpp.0046CF54006286BC |. 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,1RETN那程序在调用算法的时候,就把al的赋值为1,接着RETN结束call,TEST AL,AL 的时候就成立了。我们来保存一下修改结果,看看效果。程序已经没有试用版的提示了,注册提示窗口也没有了.虽然没有提示,其实,注册已经成功了。不信可以看看。总结: 这次破解,虽然程序使用的base64的不可逆强算法,但是它众多判断却是调用同一个地址的算法,这样,却成了这个强算法的软肋,我们只要修改算法的调用入口,就可以轻松的达到一劳永逸办法.希望此文能给在学习反汇编的朋友一个思路,高手见笑了.有不足地方,还望指点. |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|