寻找程序中的软肋

终于拿到了黑防的杂志,里面有一款“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
来看算法部分,暴难。
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的不可逆强算法,但是它众多判断却是调用同一个地址的算法,这样,却成了这个强算法的软肋,我们只要修改算法的调用入口,就可以轻松的达到一劳永逸办法.希望此文能给在学习反汇编的朋友一个思路,高手见笑了.有不足地方,还望指点.
                              
                               (完)

没有评论:

发表评论

Follow Us

FOLLOW US

Blog Archive

Comments

Blogger 提供支持.

Search This Blog

Tags

header ads