首页
社区
课程
招聘
[原创]一个质因数分解工具的简单破解
发表于: 2011-3-19 18:41 5037

[原创]一个质因数分解工具的简单破解

2011-3-19 18:41
5037
在网上淘来的一个小软件,号称可以分解29位以内的数(不知是否真实,因为事实上当一个素数的位数超过16位时它的速度就杯具了)本来想用它验证下自己写的质因数分解程序(代码在这里http://bbs.pediy.com/showthread.php?t=131048),不料软件有个注册机制,老是提示挺烦人的,顺便搞掉他= =。旨在讨论,同时为了保护作者的权益(众人:P话!其实我也不好意思的= =),软件名就不说了。

    进入正题。PEID之,无壳,大爱;VB编写的,怪不得速度...
    既然无壳就直接扔进OD,程序给出了机器码,随便喂给它一个注册码,注册!(应该不会成功吧= =,成功了反倒省事了)弹出提示框说注册失败。messagebox下断,再来一次,杯具的是程序无视了我的断点继续提示失败,到底是不了解VB的程序,找资料吧。经过一番查找,重新在rtcmsgbox函数下断,这会成功断了下来,返回调用处得到这么一行代码:
        004128FB   .  FF15 9C104000 call    dword ptr [<&MSVBVM60.#595>]          ;  MSVBVM60.rtcMsgBox
也就是提示注册失败,网上看找到了这里
        ... ...
        0041283B   .  FF15 64104000 call    dword ptr [<&MSVBVM60.__vbaHresultChe>;  MSVBVM60.__vbaHresultCheckObj
        00412841   >  8B45 E0       mov     eax, dword ptr [ebp-20]
        00412844   .  50            push    eax                                   ;  传入用户输入的注册码
        00412845   .  FF15 54124000 call    dword ptr [<&MSVBVM60.#581>]          ;  MSVBVM60.rtcR8ValFromBstr
        0041284B   .  FF15 C4104000 call    dword ptr [<&MSVBVM60.__vbaFpR8>]     ;  MSVBVM60.__vbaFpR8
        00412851   .  DB46 38       fild    dword ptr [esi+38]                    ;  st0 = 正确注册码
        00412854   .  DD9D 38FFFFFF fstp    qword ptr [ebp-C8]                    ;  正确注册码装入ebp-c8,st0 = 用户输入的注册码
        0041285A   .  DC9D 38FFFFFF fcomp   qword ptr [ebp-C8]                    ;  比较两个“码”
        00412860   .  DFE0          fstsw   ax
        00412862   .  F6C4 40       test    ah, 40
        00412865   .  75 07         jnz     short 分解质因.0041286E                   ;  跳走成功
        00412867   .  B8 01000000   mov     eax, 1
        0041286C   .  EB 02         jmp     short 分解质因.00412870
        0041286E   >  33C0          xor     eax, eax
        00412870      F7D8          neg     eax
        00412872   .  8D4D E0       lea     ecx, dword ptr [ebp-20]
        00412875   .  66:8985 4CFFF>mov     word ptr [ebp-B4], ax
        0041287C   .  FF15 50124000 call    dword ptr [<&MSVBVM60.__vbaFreeStr>]  ;  MSVBVM60.__vbaFreeStr
        00412882   .  8B3D 4C124000 mov     edi, dword ptr [<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObj
        00412888   .  8D4D D8       lea     ecx, dword ptr [ebp-28]
        0041288B   .  FFD7          call    edi                                   ;  <&MSVBVM60.__vbaFreeObj>
        0041288D   .  66:83BD 4CFFF>cmp     word ptr [ebp-B4], 0
        00412895   .  0F84 0D010000 je      分解质因.004129A8                         ;  跳走完蛋
        0041289B   .  8B3D EC114000 mov     edi, dword ptr [<&MSVBVM60.__vbaVarDu>;  MSVBVM60.__vbaVarDup
        004128A1   .  B9 04000280   mov     ecx, 80020004
        004128A6   .  894D A0       mov     dword ptr [ebp-60], ecx
        004128A9   .  B8 0A000000   mov     eax, 0A
        ... ...
这里就是比较注册码的位置,有些地方我加了注释,但是正确注册码的计算代码却不在此处。有了这些要搞掉它就轻而易举了。爆破开始!将 00412865的jnz改为jmp即可,改了以后再次随意喂一个注册码,注册!哈,注册完成,烦人的提示框消失不见。除了改变跳转还有其他地方也可以实现爆破,例如也可以改 00412870处的取补操作,把这里改为xor eax,eax再注册,同样成功。

    其实还有个更方便的办法,打开regmon,运行程序后在regmon中可以清楚看到程序在注册表中的操作,包括保存是否注册信息的表项:
        10.26076508        #?鄍2.04.exe:1512        QueryValue        HKCU\Software\... ...\value        SUCCESS        "False"       
将键值改为true即可,连OD都省了。
一个很简单的爆破,分享思路,大牛莫笑。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//