zoukankan      html  css  js  c++  java
  • [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026.

    本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西。

    其中,文章中按照如下逻辑编排(解决如下问题):

    1、使用什么环境和工具

    2、程序分析

    3、思路分析和破解流程

    4、注册机的探索

    ----------------------------------

    提醒各位看客: 如果文章中的逻辑看不明白,那你一定是没有亲手操刀!OD中的跳转提示很强大,只要你跟踪了,不用怎么看代码就理解了!

    ----------------------------------

    1、工具和环境:

    WinXP SP3 + 52Pojie六周年纪念版OD + PEID + 汇编金手指。

    160个CrackMe的打包文件。

    下载地址: http://pan.baidu.com/s/1xUWOY 密码: jbnq

    注:

    1、Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。

    2、以上工具都是在52PoJie论坛下的原版程序,NOD32不报毒,个人承诺绝对不会进行任何和木马病毒相关内容。

    wps_clip_image-880

    2、程序分析:

    想要破解一个程序,必须先了解这个程序。所以,在破解过程中,对最初程序的分析很重要,他可以帮助我们理解作者的目的和意图,特别是对于注册码的处理细节,从而方便我们反向跟踪和推导。

    和上一节一样,打开CHM,选择第26个Colormaster.exe,保存下来。运行程序,程序界面如下:

    0

    点击上面的那个按钮没有任何反应,看来失败没有提示的。

    PEID:Microsoft Visual Basic 5.0 / 6.0

    3、思路分析和破解流程

    没有信息框,我们可以试试查找文本的办法。

    1、打开OD,将exe拖到OD窗口中,等程序暂停后,直接点击运行按钮(F9),不用理会。

    2、在OD中反汇编窗口,右键->中文搜索插件->智能搜索,信息如下:

    1

    大概地猜猜意思,图中选中的哪一行应该就是正确的。(为什么是它?因为它的第一个单词我认识啊!哈哈哈!)

    双击或者右键->Show call进去,我们就返回到了反汇编窗口,附进代码如下:

    004036EB     /0F84 AB000000 je 0040379C
    004036F1   . |8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>;  msvbvm60.__vbaVarDup
    004036F7   . |B9 04000280   mov ecx,0x80020004
    004036FC   . |898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
    00403702   . |B8 0A000000   mov eax,0xA
    00403707   . |898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
    0040370D   . |BF 08000000   mov edi,0x8
    00403712   . |8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
    00403718   . |8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
    0040371E   . |8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
    00403724   . |8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
    0040372A   . |C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C     ;  Colormaster′s Crackme 7.0
    00403734   . |89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
    0040373A   . |FFD6          call esi                                 ;  <&MSVBVM60.__vbaVarDup>
    0040373C   . |8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
    00403742   . |8D4D 8C       lea ecx,dword ptr ss:[ebp-0x74]
    00403745   . |C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401F80     ;   Gratulation ,du hast es geschafft!
    0040374F   . |89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
    00403755   . |FFD6          call esi

    哈哈,代码是不是很简单?这段代码的开头je 0040379C 就是我们需要的关键跳转!尝试爆破一下!选中je 0040379C, 右键->Binary->Fill with NOPs。再试试:

    2

    4、注册机的探索

    注册码比较肯定在关键跳转附近,我们直接分析这段代码就可以了:

    代码比较长,捡重要的说明:

    00402CAC   .  FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
    00402CB2   >  8B55 D8       mov edx,dword ptr ss:[ebp-0x28]
    00402CB5   .  52            push edx                                 ;  // edx="bbdxf",目的是校验字符串长度大于5
    00402CB6   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>;  msvbvm60.__vbaLenBstr
    00402CBC   .  33C9          xor ecx,ecx
    00402CBE   .  83F8 04       cmp eax,0x4
    00402CC1   .  0F9EC1        setle cl
    00402CC4   .  F7D9          neg ecx
    00402CC6   .  66:898D DCFEF>mov word ptr ss:[ebp-0x124],cx
    00402CCD   .  8D4D D8       lea ecx,dword ptr ss:[ebp-0x28]
    00402CD0   .  FF15 F0104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
    00402CD6   .  8D4D B8       lea ecx,dword ptr ss:[ebp-0x48]
    00402CD9   .  FF15 F4104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>;  msvbvm60.__vbaFreeObj
    00402CDF   .  66:399D DCFEF>cmp word ptr ss:[ebp-0x124],bx
    00402CE6   .  0F84 B0000000 je 00402D9C
    00402CEC   .  8B35 D4104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVa>;  msvbvm60.__vbaVarDup
    00402CF2   .  B9 04000280   mov ecx,0x80020004
    00402CF7   .  898D 64FFFFFF mov dword ptr ss:[ebp-0x9C],ecx
    00402CFD   .  B8 0A000000   mov eax,0xA
    00402D02   .  898D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ecx
    00402D08   .  BF 08000000   mov edi,0x8
    00402D0D   .  8D95 0CFFFFFF lea edx,dword ptr ss:[ebp-0xF4]
    00402D13   .  8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
    00402D19   .  8985 5CFFFFFF mov dword ptr ss:[ebp-0xA4],eax
    00402D1F   .  8985 6CFFFFFF mov dword ptr ss:[ebp-0x94],eax
    00402D25   .  C785 14FFFFFF>mov dword ptr ss:[ebp-0xEC],00401F2C     ;  Colormaster′s Crackme 7.0
    00402D2F   .  89BD 0CFFFFFF mov dword ptr ss:[ebp-0xF4],edi
    00402D35   .  FFD6          call esi                                 ;  <&MSVBVM60.__vbaVarDup>
    00402D37   .  8D95 1CFFFFFF lea edx,dword ptr ss:[ebp-0xE4]
    00402D3D   .  8D4D 8C       lea ecx,dword ptr ss:[ebp-0x74]
    00402D40   .  C785 24FFFFFF>mov dword ptr ss:[ebp-0xDC],00401ED4     ;   Der Name muss mindestens 5 Chars haben
    00402D4A   .  89BD 1CFFFFFF mov dword ptr ss:[ebp-0xE4],edi
    00402D50   .  FFD6          call esi
    00402D52   .  8D95 5CFFFFFF lea edx,dword ptr ss:[ebp-0xA4]
    00402D58   .  8D85 6CFFFFFF lea eax,dword ptr ss:[ebp-0x94]
    00402D5E   .  52            push edx
    00402D5F   .  8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
    00402D65   .  50            push eax
    00402D66   .  51            push ecx
    00402D67   .  8D55 8C       lea edx,dword ptr ss:[ebp-0x74]
    00402D6A   .  6A 40         push 0x40
    00402D6C   .  52            push edx
    00402D6D   .  FF15 48104000 call dword ptr ds:[<&MSVBVM60.#595>]     ;  msvbvm60.rtcMsgBox

    首先,校验了Name的长度,必须大于4. 然后,有很长很长一段代码用于进行浮点数计算,但是生成的数值实在无法理解是怎样互相联系的,所以我放弃了。

    最后,就进行了注册码的相关处理:

    00403648   . /7D 12         jge short 0040365C
    0040364A   . |68 A0000000   push 0xA0
    0040364F   . |68 941E4000   push 00401E94
    00403654   . |56            push esi
    00403655   . |50            push eax
    00403656   . |FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  msvbvm60.__vbaHresultCheckObj
    0040365C   > 8B45 D8       mov eax,dword ptr ss:[ebp-0x28]
    0040365F   .  8B4D D4       mov ecx,dword ptr ss:[ebp-0x2C]
    00403662   .  8B55 D0       mov edx,dword ptr ss:[ebp-0x30]
    00403665   .  50            push eax                                 ;  // eax = "123123"
    00403666   .  51            push ecx                                 ;  // ecx = "52406C2C2CC54463"
    00403667   .  52            push edx                                 ;  // edx = "bbdxf"
    00403668   .  FF15 10104000 call dword ptr ds:[<&MSVBVM60.__vbaLenBs>;  msvbvm60.__vbaLenBstr
    0040366E   .  50            push eax                                 ;  // eax = 5
    0040366F   .  FF15 08104000 call dword ptr ds:[<&MSVBVM60.__vbaStrI4>;  msvbvm60.__vbaStrI4
    00403675   .  8B35 DC104000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  msvbvm60.__vbaStrMove
    0040367B   .  8BD0          mov edx,eax
    0040367D   .  8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
    00403680   .  FFD6          call esi                                 ;  <&MSVBVM60.__vbaStrMove>
    00403682   .  8B3D 30104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  msvbvm60.__vbaStrCat
    00403688   .  50            push eax                                 ;  // eax = "5", ecx="52406C2C2CC54463"
    00403689   .  FFD7          call edi                                 ;  <&MSVBVM60.__vbaStrCat>
    0040368B   .  8BD0          mov edx,eax
    0040368D   .  8D4D C8       lea ecx,dword ptr ss:[ebp-0x38]
    00403690   .  FFD6          call esi
    00403692   .  50            push eax
    00403693   .  68 741F4000   push 00401F74                            ;  -CM
    00403698   .  FFD7          call edi
    0040369A   .  8BD0          mov edx,eax
    0040369C   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
    0040369F   .  FFD6          call esi
    004036A1   .  50            push eax
    004036A2   .  FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCm>;  msvbvm60.__vbaStrCmp
    

    这里,我们发现:注册码比较的文本,在我们点击按钮之前就已经生成好了,String    "52406C2C2CC54463",为了避免这个文本是固定的,我们再次换一个Name跟踪下它的比较文本,发现确实不一样了,说明,比较字符串是在输入Name的时候也已经根据Name的内容动态生成了。

    想要在输入Name就完成了比较文本的生成,一般都是用的是Edit控件文本变化事件或者一个Timer定时去读取Name的内容然后生成。

    遗憾的是,我尝试寻找这两种事件的地址,终究也没有找到,以下是使用其他VB工具尝试的结果:

     

    3

    4

    5

    首先,他确实有一个Timer,但是根据Timer事件的跟踪内容,发现里面就产生了一个错误,和注册码相关的啥也没有。在按钮按下时,通过遍历Name的每一个字符ANSII值,然后与浮点数432.4以及0x15进行了一些乘法运算,(这在OD里已经跟踪出来了,但是怎么计算也无法匹配跟踪的结果,有点无语),最后将结果转换为整数,最后的两个结果转换为十六进制整数文本,然后开头和结尾加上了一些其他的整数文本,组成了最后的注册码。

    PS:VB的代码跟踪起来代价太大,太坑了,但是160个CrackMe中有很多这种程序,无语啊!

    BY  笨笨D幸福

  • 相关阅读:
    css 响应式布局
    【nodejs】async
    vue移动appUI框架搭建-选取mintUI
    浅谈开发流程_敏捷开发流程_迭代流程的理解
    一篇业务需求上的数据处理问题--后台API只返回四个字段ABCD,现在数据量较大有20万条,一列上要展示ABCDABCDABCD这么些字段
    vue列表鼠标滚动翻页(数据量较大,几千万条数据,因此要滚动翻页,为了性能良好,鼠标滚动时发送请求页码page++),网上找不到自己写了一个,
    app移动端 rem和px的换算
    vue搜索关键字字体高亮, map映射新数组,replace替换,font字体样式
    vue文字截取方法 :title | filterFun方法过滤
    什么是正则表达式?
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3823456.html
Copyright © 2011-2022 走看看