易优2注册码分析和爆破

来源:互联网 发布:数控编程代码案例 编辑:程序博客网 时间:2024/06/05 07:17

【文章标题】: 易优2注册码分析和爆破
【文章作者】: lrw
【作者邮箱】: lrwtemp@gmail.com
【软件名称】: 易优2
【软件大小】: 6.5M
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: VB6
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
     应一个同事要求解的,我自己也不知道这软件是做什么用的。看标题是说一个GSM 信息管理软件
     安装好后,先用PEID扫描,提示是VB5/6编写的。没有加壳,倒省了不少工夫。
     运行程序,提示软件过期,要我们填写注册码。随便填了11111111(8个1),提交后软件要求重启验证,没有任何提示信息,没有办法,只好重启软件。
    重新运行程序,这次是提示“授权文件“有误,看来注册码是存放在文件中的了,于是到安装目录下乱翻,看到config目录下有个Credit.dat,看来倒长
  得和注册文件倒有点像,用UltraEdit打开,发现刚才我们填写的注册码正乖乖地躺在里面,可以肯定这是注册码存放文件了。
    运行OD,打开EOES2(软件主文件),试着在API参考中搜索msgbox、CreateFileA、OpenFile之类的,但是没有找到。(没有办法,我对VB程序不熟,只好
  祈求上天能给我个好运) 再搜索字符串,也没有找到刚才提示的“过期”、“授权”之类的字样,失望而归。由于不知道该在何处断(以前记得有说可以用
  vbastrcmp之类的作为断点,但是我想这VB过程中应该有不少的字符比较吧,这样找起来太繁了,没有尝试),于是稍作休息,想起在字符串里找Credit.dat,
  呵呵,这次终于找到两个地方,猜测一个是读取用,一个是写入用的了。双击字符串到调用的地方下断。在OD中运行EOES2,果然被拦下来了。连续按F8,注意
  看堆栈变化,可以很快看到我们填写的伪注册码会冒出来,在出现伪注册码的地方加断点,以便下次直接到达。
  00A7C0D1   .  6A 30         push    30
  00A7C0D3   .  68 A0894300   push    004389A0
  00A7C0D8   .  52            push    edx
  00A7C0D9   .  50            push    eax
  00A7C0DA   .  FFD6          call    esi
  00A7C0DC   >  8B55 E4       mov     edx, [ebp-1C]                    ;  到这里会显示出我们的伪注册码
  00A7C0DF   .  8D4D E8       lea     ecx, [ebp-18]
  00A7C0E2   .  C745 E4 00000>mov     dword ptr [ebp-1C], 0
 
  一直F8下去会出现警告框,提示“授权文件”出错,点击确定,返回OD后停留在
     
  00A7B54E   .  E8 AD010000   call    00A7B700                         
  00A7B553   .  8B55 D8       mov     edx, [ebp-28]
  00A7B556   .  52            push    edx
  00A7B557   .  E8 D4030000   call    00A7B930                         ;  这一个call里提示错误
  00A7B55C   .  66:393D D8F3A>cmp     [A7F3D8], di           ; 点“确定”后返回此处   
  00A7B563   .  0F85 A1000000 jnz     00A7B60A
  00A7B569   .  393D 08F6A700 cmp     [A7F608], edi
  00A7B56F   .  75 10         jnz     short 00A7B581
 
  于是初步认定在00A7B557 call    00A7B930这里需要进行分析,在此处下断,运行到后F7进入00A7B930
  F8到
  00A7B985   .  8B55 08       mov     edx, [ebp+8]
  00A7B988   .  8D4D D4       lea     ecx, [ebp-2C]                    ;我们的输入的注册码会在这里出现
  00A7B98B   .  FF15 74124000 call    [<&MSVBVM60.__vbaStrCopy>]       ;  MSVBVM60.__vbaStrCopy
  00A7B991   .  6A 01         push    1
  00A7B993   .  FF15 C0104000 call    [<&MSVBVM60.__vbaOnError>]       ;  MSVBVM60.__vbaOnError
  00A7B999   .  66:8935 D8F3A>mov     [A7F3D8], si
  00A7B9A0   .  8975 D8       mov     [ebp-28], esi
  00A7B9A3   .  33DB          xor     ebx, ebx
  00A7B9A5   .  8B3D 08134000 mov     edi, [<&MSVBVM60.__vbaStrMove>]  ;  MSVBVM60.__vbaStrMove
  00A7B9AB   >  B8 06000000   mov     eax, 6                           ;留意处此了,赋予eax=6   
  00A7B9B0   .  3BD8          cmp     ebx, eax                         ;观察ebx,可以发现开始为0
  00A7B9B2   .  0F8F DF000000 jg      00A7BA97
  00A7B9B8   .  83FB 08       cmp     ebx, 8
  00A7B9BB   .  72 06         jb      short 00A7B9C3                   ;下面一句是产生错误了 
  00A7B9BD   .  FF15 34114000 call    [<&MSVBVM60.__vbaGenerateBoundsE>;  MSVBVM60.__vbaGenerateBoundsError
  00A7B9C3   >  A1 C8F3A700   mov     eax, [A7F3C8]
  00A7B9C8   .  8D0C98        lea     ecx, [eax+ebx*4]
  00A7B9CB   .  51            push    ecx
  00A7B9CC   .  E8 2FBAFFFF   call    00A77400
  00A7B9D1   .  8BD0          mov     edx, eax                         ; 呵呵,在上一个call后,我们在这里看eax的值怎么看都像注册码,试着把00A7B9D1那里得到的eax的值复制出来
 
  继续F8,下面不远就到了
  00A7BA3B   .  8BD0          mov     edx, eax
  00A7BA3D   .  8D4D C8       lea     ecx, [ebp-38]
  00A7BA40   .  FFD7          call    edi
  00A7BA42   .  50            push    eax                              ;  看到下面的__vbaStrCmp了没有,比较啊!!在下一句中查看堆栈的,可以发现有我们输入的伪码和刚才看到的类注册码物体
  00A7BA43   .  FF15 40114000 call    [<&MSVBVM60.__vbaStrCmp>]        ;  MSVBVM60.__vbaStrCmp
 
  把得到的类注册码物体复制出来,填写进注册那里,提交,关闭,直接运行程序,倒,还是提示错误,莫非还有第二次比较?
  留意下程序在注册那里提示的要求我们发送给他们的注册信息:
  CDBF4689AA45C1B29B0C63A1AAF32CD2,A76530E9C6060D7B2E88AD1B5C390276,FC1FD7DE8A89B256E0A7FCEB10A30172,5CFAF91D9939DBC726030556AA92E9D5,EA27F403F21B2990D2D526A8B6A61BBE,7215EE9C7D9DC229D2921A40E899EC5F,FAE1FE85D425EA8A3FEF932246077017
  是用逗号分隔,共有7段,看回00A7B9AB处,赋予eax为6,比较是否大于6,倒和这个很像,不管了,就在注册码那里填写进“1,2,3,4,5,6,7”,设定断点在00A7BA42处,重新用OD跟踪,到达00A7BA42时,
  查看堆栈,发现居然与进行比较的字符串居然是1,哈哈,果然是使用逗号分隔多个注册码段的。把第一个比较的注册码记录下来,F9继续第二次到达这里,再记录第二次注册码,
  依次记录下7个注册码,F8继续下去,发现下面还有一个地方是比较的
  00A7BB12   .  8BD0          mov     edx, eax                          
  00A7BB14   .  8D4D C8       lea     ecx, [ebp-38]
  00A7BB17   .  FFD7          call    edi
  00A7BB19   .  50            push    eax                              ;下面是最后一个比较了,同样可以在堆栈中找到注册码
  00A7BB1A   .  FF15 40114000 call    [<&MSVBVM60.__vbaStrCmp>]        ;  MSVBVM60.__vbaStrCmp
  把记录下来的这几个注册码填写Credit.dat,用逗号分隔,重新运行程序,可以发现没有错误提示了。
  但是后来换了台机,发现注册码就不一样了,看来是与硬件有关,那就试下爆破吧。
  通过简单跟踪,很容易发现这个过程中,其实在注册码的比较过程中不相符程序是不会直接退出的,也就是说7次比较的结果错误都没有所谓,关键是最后返回前不能出错。
  00A7BB49      837D D8 05    cmp     dword ptr [ebp-28], 5      
  00A7BB4D      7E 1E         jle     short 00A7BB6D         ;如果注册码比较过程中有错,此处会跳转,nop掉            
  00A7BB4F   .  66:85F6       test    si, si                       
  00A7BB52      74 19         je      short 00A7BB6D                  ;同样nop掉这里,让它直接到下一句
  00A7BB54   .  66:C705 D8F3A>mov     word ptr [A7F3D8], 0FFFF
  00A7BB5D   .  FF15 B0104000 call    [<&MSVBVM60.__vbaExitProc>]      ;  MSVBVM60.__vbaExitProc
 
  因此,只要修改上面的两处地方,然后注册码里填写1,2,3,4,5,6,7,8(忘记是不是这么多位了,写多无碍),运行程序就可以正常了。
  由于这个软件我也不知道有什么用,所以也不清楚爆破后是否有问题。
  但是如果有问题的话我们完全可以取得注册码,用注册码去注册,这样就肯定不会出问题了。
  末了,发现原来调试中有个rtcMsgBox和rtcDir可以作为断点。
 
 
 
 
 
 
--------------------------------------------------------------------------------
【经验总结】
  VB程序我第一次用OD跟完整,不过幸好这个软件的反破能力不强,注册码比较过程也比较松散,而且是明文比较,所以跟得
  还算顺利,唯一不熟的是API函数断点,不知道用哪个才能快而有效地到达,不过看来找到一个读写文件的地方,然后用F8
  跟踪到出错的地方,倒也还是一个办法。
 
--------------------------------------------------------------------------------
【版权声明】: 本文为lrw原创, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年06月25日 8:51:51
 

原创粉丝点击