• [反汇编练习] 160个CrackMe之008


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

    本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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-142827

     

    2、程序分析:

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

    和上一节一样,打开CHM,选择第8个Andrénalin.1(谁能告诉我这是哪国语言?什么意思?),保存下来。运行程序,程序界面如下:

    2

    3、思路分析和破解流程

    虽然看不懂这是什么意思,也不知道是哪国语言,但是不妨碍我们把它破掉。出现消息框,是不是感到很亲切?哈哈,Ctrl+K你懂的。不过,为了放心地继续下去,还是先用PEID查看一下:Microsoft Visual Basic 5.0 / 6.0。恩,没加壳,真良心。

    由于它第一时间就把消息框给弹出来了,我们不能辜负她,还是用老办法,暂停,查看堆栈。

    具体操作步骤如下:

    1、关掉程序,打开OD,将exe拖到OD中运行。

    2、在exe中随意输入一个伪码,比如123321,点击【OK】按钮,弹出错误对话框。

    3、此时不要关闭对话框,回到OD,使用Ctrl+K(K图标),得到当前堆栈信息。

    4、参考vba常用函数说明(http://www.cnblogs.com/bbdxf/p/3780187.html),发现信息框函数。

    1

    5、选中rtcMsgBox这一行,右键->Show Call,返回到了反汇编窗口。

    6、向上浏览代码,发现有两块字符串相关的内容。

    00401DC4   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
    00401DCA   .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
    00401DCD   .  8945 94       mov dword ptr ss:[ebp-0x6C],eax
    00401DD0   .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax
    00401DD3   .  C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401AC4     ;  UNICODE "SuCCESFul !"
    00401DDD   .  899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
    00401DE3   .  FFD7          call edi                                 ;  <&MSVBVM50.__vbaVarDup>
    00401DE5   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
    00401DE8   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
    00401DEB   .  C745 8C 701A4>mov dword ptr ss:[ebp-0x74],00401A70     ;  UNICODE "RiCHtiG ! ...nun weiter zu CrackMe 2 !"
    00401DF2   .  895D 84       mov dword ptr ss:[ebp-0x7C],ebx
    00401DF5   .  FFD7          call edi
    00401DF7   .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
    00401DFA   .  8D45 A4       lea eax,dword ptr ss:[ebp-0x5C]
    00401DFD   .  52            push edx
    00401DFE   .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
    00401E01   .  50            push eax
    00401E02   .  51            push ecx
    00401E03   .  8D55 C4       lea edx,dword ptr ss:[ebp-0x3C]
    00401E06   .  6A 30         push 0x30
    00401E08   .  52            push edx
    00401E09   .  FF15 F0304000 call dword ptr ds:[<&MSVBVM50.#595>]     ;  msvbvm50.rtcMsgBox
    00401E0F   .  8D95 44FFFFFF lea edx,dword ptr ss:[ebp-0xBC]
    00401E15   .  8D4D DC       lea ecx,dword ptr ss:[ebp-0x24]
    00401E18   .  8985 4CFFFFFF mov dword ptr ss:[ebp-0xB4],eax
    00401E1E   .  C785 44FFFFFF>mov dword ptr ss:[ebp-0xBC],0x3
    00401E28   .  FF15 D0304000 call dword ptr ds:[<&MSVBVM50.__vbaVarMo>;  msvbvm50.__vbaVarMove
    00401E2E   .  8D45 94       lea eax,dword ptr ss:[ebp-0x6C]
    00401E31   .  8D4D A4       lea ecx,dword ptr ss:[ebp-0x5C]
    00401E34   .  50            push eax
    00401E35   .  8D55 B4       lea edx,dword ptr ss:[ebp-0x4C]
    00401E38   .  51            push ecx
    00401E39   .  8D45 C4       lea eax,dword ptr ss:[ebp-0x3C]
    00401E3C   .  52            push edx
    00401E3D   .  50            push eax
    00401E3E   .  E9 95000000   jmp 00401ED8
    00401E43   >  8B3D 48314000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaVa>;  msvbvm50.__vbaVarDup
    00401E49   .  B9 04000280   mov ecx,0x80020004
    00401E4E   .  894D 9C       mov dword ptr ss:[ebp-0x64],ecx
    00401E51   .  B8 0A000000   mov eax,0xA
    00401E56   .  894D AC       mov dword ptr ss:[ebp-0x54],ecx
    00401E59   .  BB 08000000   mov ebx,0x8
    00401E5E   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
    00401E64   .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
    00401E67   .  8945 94       mov dword ptr ss:[ebp-0x6C],eax
    00401E6A   .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax
    00401E6D   .  C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401B44     ;  UNICODE "leider NeiN !"
    00401E77   .  899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
    00401E7D   .  FFD7          call edi                                 ;  <&MSVBVM50.__vbaVarDup>
    00401E7F   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
    00401E82   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
    00401E85   .  C745 8C E01A4>mov dword ptr ss:[ebp-0x74],00401AE0     ;  UNICODE "Leider Falsch !  Schau noch mal genau nach ..."
    00401E8C   .  895D 84       mov dword ptr ss:[ebp-0x7C],ebx
    00401E8F   .  FFD7          call edi
    00401E91   .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
    00401E94   .  8D55 A4       lea edx,dword ptr ss:[ebp-0x5C]
    00401E97   .  51            push ecx
    00401E98   .  8D45 B4       lea eax,dword ptr ss:[ebp-0x4C]
    00401E9B   .  52            push edx
    00401E9C   .  50            push eax
    00401E9D   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
    00401EA0   .  6A 10         push 0x10
    00401EA2   .  51            push ecx
    00401EA3   .  FF15 F0304000 call dword ptr ds:[<&MSVBVM50.#595>]     ;  msvbvm50.rtcMsgBox

    因为语言的原因,虽然看的不是很明白,但是大概上面的一个就是成功(success),下面的那个就是我们刚看到的失败提示内容。

    继续向上找发现了一个JE跳转:

    00401D94   .  FF15 60314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>;  msvbvm50.__vbaFreeObj
    00401D9A   .  66:3BFE       cmp di,si
    00401D9D   .  0F84 A0000000 je 00401E43
    00401DA3   .  FF15 2C314000 call dword ptr ds:[<&MSVBVM50.#534>]     ;  msvbvm50.rtcBeep
    00401DA9   .  8B3D 48314000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaVa>;  msvbvm50.__vbaVarDup
    00401DAF   .  B9 04000280   mov ecx,0x80020004
    00401DB4   .  894D 9C       mov dword ptr ss:[ebp-0x64],ecx
    00401DB7   .  B8 0A000000   mov eax,0xA
    00401DBC   .  894D AC       mov dword ptr ss:[ebp-0x54],ecx
    00401DBF   .  BB 08000000   mov ebx,0x8
    00401DC4   .  8D95 74FFFFFF lea edx,dword ptr ss:[ebp-0x8C]
    00401DCA   .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
    00401DCD   .  8945 94       mov dword ptr ss:[ebp-0x6C],eax
    00401DD0   .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax
    00401DD3   .  C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],00401AC4     ;  UNICODE "SuCCESFul !"
    00401DDD   .  899D 74FFFFFF mov dword ptr ss:[ebp-0x8C],ebx
    00401DE3   .  FFD7          call edi                                 ;  <&MSVBVM50.__vbaVarDup>
    00401DE5   .  8D55 84       lea edx,dword ptr ss:[ebp-0x7C]
    00401DE8   .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
    00401DEB   .  C745 8C 701A4>mov dword ptr ss:[ebp-0x74],00401A70     ;  UNICODE "RiCHtiG ! ...nun weiter zu CrackMe 2 !"

    发现,JE如果跳过去则提示的是失败,如果不跳则提示成功,所以这个肯定是关键跳啦!我们尝试使用NOP填充一下!选中JE 00401E43,右键->Binary->Fill with NOPs。再次回到程序,点击【OK】按钮,哈哈哈,爆破成功!

    3

    4、注册码探索

    既然已经找到关键的JE跳转了,关键CALL一定在它的旁边,我们试着再向上寻找:

    00401D70   > 8B4D D8       mov ecx,dword ptr ss:[ebp-0x28]
    00401D73   .  51            push ecx                                 ;  // ecx=输入的字符串
    00401D74   .  68 541A4000   push 00401A54                            ;  UNICODE "SynTaX 2oo1"
    00401D79   .  FF15 08314000 call dword ptr ds:[<&MSVBVM50.__vbaStrCm>;  msvbvm50.__vbaStrCmp
    00401D7F   .  8BF8          mov edi,eax
    00401D81   .  8D4D D8       lea ecx,dword ptr ss:[ebp-0x28]
    00401D84   .  F7DF          neg edi
    00401D86   .  1BFF          sbb edi,edi
    00401D88   .  47            inc edi
    00401D89   .  F7DF          neg edi
    00401D8B   .  FF15 5C314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>;  msvbvm50.__vbaFreeStr
    00401D91   .  8D4D D4       lea ecx,dword ptr ss:[ebp-0x2C]
    00401D94   .  FF15 60314000 call dword ptr ds:[<&MSVBVM50.__vbaFreeO>;  msvbvm50.__vbaFreeObj
    00401D9A   .  66:3BFE       cmp di,si
    00401D9D   .  0F84 A0000000 je 00401E43
    00401DA3   .  FF15 2C314000 call dword ptr ds:[<&MSVBVM50.#534>]     ;  msvbvm50.rtcBeep

    是否看到了一个很明显的字符串比较? __vbaStrcmp 我们在这里下F2断点,回到程序,点击【OK】按钮,查看Call前面的两个push,ecx指向的就是我们输入的字符串,下面的【SynTax 2oo1】就是一个固定的字符串,比较它们是否相等。好了,注册码是不是已经出来啦!它是固定的字符串【SynTax 2oo1】。

    BY   笨笨D幸福

  • 相关阅读:
    POWERSHELL脚本执行权限
    tcp连接状态查看
    shutdown vs close
    tcp timestamps
    与TIME_WAIT相关的几个内核参数修改测试讨论结论
    添加 vip
    tcp nonblock connection rst
    tcp keepalive选项
    grep搜索文本
    protobuf 测试使用
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3791634.html
Copyright © 2020-2023  润新知