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

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

    本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将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,选择第33个Cruehead.1.exe,保存下来。运行程序,程序界面如下:

    image

    0

    有信息框,很好。

    PEID:MASM32 / TASM32 [覆盖]

    汇编写的程序啊!哎!要么很简单,要么就很坑啦!

    3、思路分析和破解流程

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

    2、点击About->Register,随意输入伪码:bbdxf  123123。点击OK按钮,弹出信息框,不要关闭,回到OD。

    3、Ctrl+K查看堆栈信息:

    1

    选中Cruehead.0040137E,右键->Show calls

    0040137E  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    00401382  |.  56            push esi                                 ;  // "bbdxf"
    00401383  |>  8A06          /mov al,byte ptr ds:[esi]
    00401385  |.  84C0          |test al,al
    00401387  |.  74 13         |je short 0040139C
    00401389  |.  3C 41         |cmp al,0x41                             ;  "A"
    0040138B  |.  72 1F         |jb short 004013AC
    0040138D  |.  3C 5A         |cmp al,0x5A                             ;  "Z"
    0040138F  |.  73 03         |jnb short 00401394
    00401391  |.  46            |inc esi
    00401392  |.^ EB EF         |jmp short 00401383
    00401394  |>  E8 39000000   |call 004013D2                           ;  // 如果在A-Z之间,则处理(+0x20)
    00401399  |.  46            |inc esi
    0040139A  |.^ EB E7         jmp short 00401383
    0040139C  |>  5E            pop esi
    0040139D  |.  E8 20000000   call 004013C2                            ;  // 处理完成在这里处理
    004013A2  |.  81F7 78560000 xor edi,0x5678                           ;  // 在这里进行比较
    004013A8  |.  8BC7          mov eax,edi
    004013AA  |.  EB 15         jmp short 004013C1
    004013AC  |>  5E            pop esi
    004013AD  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    004013AF  |.  68 60214000   push 00402160                            ; |Title = "No luck!"
    004013B4  |.  68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
    004013B9  |.  FF75 08       push [arg.1]                             ; |hOwner
    004013BC  |.  E8 79000000   call <jmp.&USER32.MessageBoxA>           ; MessageBoxA
    004013C1  >  C3            retn

    这段代码只是将name分析处理了一下,如果不合格则跳转到失败。

    我们选中这段代码头部,即0040137E地址处,OD提示:

    Local call from 0040122D

    我们转到地址 0040122D,附近代码如下:

    00401228   .  68 8E214000   push 0040218E                            ;  ASCII "BBDXF"
    0040122D   .  E8 4C010000   call 0040137E
    00401232   .  50            push eax                                 ;  // 比较之后来到这里
    00401233   .  68 7E214000   push 0040217E                            ;  ASCII "123123"
    00401238   .  E8 9B010000   call 004013D8
    0040123D   .  83C4 04       add esp,0x4                              ;  // 再次处理之后
    00401240   .  58            pop eax
    00401241   .  3BC3          cmp eax,ebx
    00401243   .  74 07         je short 0040124C
    00401245   .  E8 18010000   call 00401362
    0040124A   .^ EB 9A         jmp short 004011E6
    0040124C   >  E8 FC000000   call 0040134D                            ;  // 这个跳转到正确的提示
    00401251   .^ EB 93         jmp short 004011E6

    发现,这里调用了大量的Call,我们一个个分析一下(注释里已经分析好了):

    call 0040137E 内容:
    
    0040137E  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    00401382  |.  56            push esi                                 ;  // "bbdxf"
    00401383  |>  8A06          /mov al,byte ptr ds:[esi]
    00401385  |.  84C0          |test al,al
    00401387  |.  74 13         |je short 0040139C
    00401389  |.  3C 41         |cmp al,0x41                             ;  "A"
    0040138B  |.  72 1F         |jb short 004013AC
    0040138D  |.  3C 5A         |cmp al,0x5A                             ;  "Z"
    0040138F  |.  73 03         |jnb short 00401394
    00401391  |.  46            |inc esi
    00401392  |.^ EB EF         |jmp short 00401383
    00401394  |>  E8 39000000   |call 004013D2                           ;  // 如果在A-Z之间,则处理(+0x20)
    00401399  |.  46            |inc esi
    0040139A  |.^ EB E7         jmp short 00401383
    0040139C  |>  5E            pop esi
    0040139D  |.  E8 20000000   call 004013C2                            ;  // 处理完成在这里处理
    004013A2  |.  81F7 78560000 xor edi,0x5678                           ;  // 在这里进行比较
    004013A8  |.  8BC7          mov eax,edi
    004013AA  |.  EB 15         jmp short 004013C1
    004013AC  |>  5E            pop esi
    004013AD  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    004013AF  |.  68 60214000   push 00402160                            ; |Title = "No luck!"
    004013B4  |.  68 69214000   push 00402169                            ; |Text = "No luck there, mate!"
    004013B9  |.  FF75 08       push [arg.1]                             ; |hOwner
    004013BC  |.  E8 79000000   call <jmp.&USER32.MessageBoxA>           ; MessageBoxA
    004013C1  >  C3            retn
    
    其中,call 004013D2 内容:
    004013D2  /$  2C 20         sub al,0x20
    004013D4  |.  8806          mov byte ptr ds:[esi],al
    004013D6  .  C3            retn
    
    其中,call 004013C2 内容:
    004013C2  /$  33FF          xor edi,edi
    004013C4  |.  33DB          xor ebx,ebx
    004013C6  |>  8A1E          /mov bl,byte ptr ds:[esi]
    004013C8  |.  84DB          |test bl,bl
    004013CA  |.  74 05         |je short 004013D1
    004013CC  |.  03FB          |add edi,ebx                             ;  // edi=循环求和
    004013CE  |.  46            |inc esi
    004013CF  |.^ EB F5         jmp short 004013C6
    004013D1  >  C3            retn
    
    Call 004013D8 内容:
    004013D8  /$  33C0          xor eax,eax
    004013DA  |.  33FF          xor edi,edi
    004013DC  |.  33DB          xor ebx,ebx
    004013DE  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    004013E2  |>  B0 0A         /mov al,0xA
    004013E4  |.  8A1E          |mov bl,byte ptr ds:[esi]                ;  // "123123"
    004013E6  |.  84DB          |test bl,bl
    004013E8  |.  74 0B         |je short 004013F5
    004013EA  |.  80EB 30       |sub bl,0x30                             ;  // +0x30
    004013ED  |.  0FAFF8        |imul edi,eax                            ;  // edi/10
    004013F0  |.  03FB          |add edi,ebx                             ;  // edi+ebx
    004013F2  |.  46            |inc esi
    004013F3  |.^ EB ED         jmp short 004013E2
    004013F5  |>  81F7 34120000 xor edi,0x1234
    004013FB  |.  8BDF          mov ebx,edi
    004013FD  .  C3            retn
    
    
    call 0040134D 的内容:
    0040134D  /$  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    0040134F  |.  68 29214000   push 00402129                            ; |Title = "Good work!"
    00401354  |.  68 34214000   push 00402134                            ; |Text = "Great work, mate!
    Now try the next CrackMe!"
    00401359  |.  FF75 08       push [arg.1]                             ; |hOwner
    0040135C  |.  E8 D9000000   call <jmp.&USER32.MessageBoxA>           ; MessageBoxA
    00401361  .  C3            retn
    
    

    哈哈,大概流程是这样的,地址00401228开始,将Name和Serial分别经过call运算,通过00401241   .  3BC3          cmp eax,ebx 比较,然后根据结果跳转到不同的处理,其中,0040124C   >  E8 FC000000   call 0040134D  是提示正确的处理流程。所以,我们只要00401243   .  74 07         je short 0040124C改为jmp 0040124C,试一试:

    2

    4、注册机的探索

    算法处理如下:

    1、Name字符串,先判断是否在A-Z之间,然后每个字符ANSII值加上0x20,然后对计算后的值求和,最后与0x5678异或。

    2、Serial字符串,每个字符ANSII值加上0x30,然后加上上一次的和除以10的值,存到一个变量中,继续下一个,最后与0x1234异或。

    3、比较最后的结果。

    …..我想想不出来这样的两个字符串,我也没办法反计算,所以,这有作罢!

    BY  BBDXF

  • 相关阅读:
    Java--环境变量(jdk、jre)配置
    Jsoup爬取数据设置代理IP
    数据库连接的莫名问题:create connection error
    springBoot使用过程的小感悟
    Activiti工作流引擎数据库表结构
    IDEA创建Activiti工作流开发
    Java开源爬虫框架WebCollector设置代理
    使用OkHttpClient爬取json数据
    雪中的杭州
    StringBuffer中的append方法
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3840351.html
Copyright © 2011-2022 走看看