| |
您现在的位置: 猫头鹰病毒资讯网 >> 系统安全 >> 系统安全 >> 文章正文 |
| 攻击软肋 破解SQL格式化工具 |
| 作者:佚名 文章来源:网络收集 点击数: 更新时间:2007-9-28 |
[zt] 终于拿到了黑防的杂志,里面有一款“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的不可逆强算法,但是它众多判断却是调用同一个地址的算法,这样,却成了这个强算法的软肋,我们只要修改算法的调用入口,就可以轻松的达到一劳永逸办法.希望此文能给在学习反汇编的朋友一个思路,高手见笑了.有不足地方,还望指点.
|
|
|
|
|
|
|
|
|
|