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

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

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

    3

     

    悲剧啊,啥也没有!

    PEID:MASM32 / TASM32 [覆盖]

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

     

    3、思路分析和破解流程

    1、打开OD,将exe拖到OD窗口中,等程序暂停后,不用理会(先不要运行,否则无法进行爆破)。

    2、右键->中文搜索插件->智能搜索,找到提示成功字符串:

    image

    很容易找到提示成功的字符串:Good work cracker! 选中它,右键->Follow.

    00401362  /$  8B0D 49214000 mov ecx,dword ptr ds:[0x402149]
    00401368  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    0040136C  |.  8B7C24 08     mov edi,dword ptr ss:[esp+0x8]
    00401370  |.  83C7 0C       add edi,0xC
    00401373  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
    00401375  |.  66:C707 210D  mov word ptr ds:[edi],0xD21
    0040137A  |.  83C7 02       add edi,0x2
    0040137D  |.  8B7424 0C     mov esi,dword ptr ss:[esp+0xC]
    00401381  |.  B9 1A000000   mov ecx,0x1A
    00401386  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[>
    00401388  |.  6A 30         push 0x30                                ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
    0040138A  |.  68 57214000   push 00402157                            ; |Good work cracker!
    0040138F  |.  68 6A214000   push 0040216A                            ; |Cracked by:                 Now try the next crackme!
    00401394  |.  FF35 04204000 push dword ptr ds:[0x402004]             ; |hOwner = NULL
    0040139A  |.  E8 19000000   call <jmp.&USER32.MessageBoxA>           ; MessageBoxA
    0040139F  .  C3            retn

    这里只进行了一个提示,我们在头部下断,跟踪,发现这里调用了这段代码:

    00401187  |.  58            pop eax                                  ;  // 将结果出栈,问题在于怎样才能找到对应入栈的地方
    00401188  |.  3C 01         cmp al,0x1                               ;  // 比较是否成功
    0040118A      75 17         jnz short 004011A3                       ;  // 不成功则跳转,想要爆破就要改这里
    0040118C  |.  68 86214000   push 00402186                            ;  ASCII "xt crackme!"
    00401191  |.  68 6A214000   push 0040216A                            ;  ASCII "Cracked by: !
    Now try the next crackme!"
    00401196  |.  68 08204000   push 00402008
    0040119B  |.  E8 C2010000   call 00401362
    004011A0  |.  83C4 0C       add esp,0xC

    在0040118A地址处,如果跳转则直接到失败的地方了!所以,想要爆破,只需要将这个判断跳转修改为Nop。
    地址: 0040118A 选中 jnz short 004011A3,右键->Binary->Fill with NOPs。

    F9,运行程序!

    11

    4、注册机的探索

    这个汇编代码也不长,但是汇编的代码逻辑性一般都很差,所以,我们还是从头开始分析吧:

    00401000 >/$  6A 00         push 0x0                                 ; /pModule = NULL
    00401002  |.  E8 7D040000   call <jmp.&KERNEL32.GetModuleHandleA>    ; GetModuleHandleA
    00401007  |.  A3 E9204000   mov dword ptr ds:[0x4020E9],eax
    0040100C  |.  C705 F9204000>mov dword ptr ds:[0x4020F9],0x0
    00401016  |.  6A 00         push 0x0                                 ; /hTemplateFile = NULL
    00401018  |.  68 80000000   push 0x80                                ; |Attributes = NORMAL
    0040101D  |.  6A 03         push 0x3                                 ; |Mode = OPEN_EXISTING
    0040101F  |.  6A 00         push 0x0                                 ; |pSecurity = NULL
    00401021  |.  6A 03         push 0x3                                 ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
    00401023  |.  68 000000C0   push 0xC0000000                          ; |Access = GENERIC_READ|GENERIC_WRITE
    00401028  |.  68 D7204000   push 004020D7                            ; |FileName = "CRACKME3.KEY"
    0040102D  |.  E8 76040000   call <jmp.&KERNEL32.CreateFileA>         ; CreateFileA
    00401032  |.  83F8 FF       cmp eax,-0x1
    00401035  |.  75 0C         jnz short 00401043                       ;  // 存在则跳过
    00401037  |>  68 0E214000   push 0040210E                            ;  ASCII "CrackMe v3.0             "
    0040103C  |.  E8 B4020000   call 004012F5
    00401041  |.  EB 6B         jmp short 004010AE
    00401043  |>  A3 F5204000   mov dword ptr ds:[0x4020F5],eax
    00401048  |.  B8 12000000   mov eax,0x12
    0040104D  |.  BB 08204000   mov ebx,00402008
    00401052  |.  6A 00         push 0x0                                 ; /pOverlapped = NULL
    00401054  |.  68 A0214000   push 004021A0                            ; |pBytesRead = Cruehead.004021A0
    00401059  |.  50            push eax                                 ; |BytesToRead => 12 (18.)
    0040105A  |.  53            push ebx                                 ; |Buffer => Cruehead.00402008
    0040105B  |.  FF35 F5204000 push dword ptr ds:[0x4020F5]             ; |hFile = 00000044 (window)
    00401061  |.  E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; ReadFile
    00401066  |.  833D A0214000>cmp dword ptr ds:[0x4021A0],0x12         ;  // 比较这个地址的文本是否为0x12
    0040106D  |.^ 75 C8         jnz short 00401037
    0040106F  |.  68 08204000   push 00402008
    00401074  |.  E8 98020000   call 00401311                            ;  // 进行一些数据比较
    00401079  |.  8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
    00401083  |.  83C4 04       add esp,0x4
    00401086  |.  68 08204000   push 00402008
    0040108B  |.  E8 AC020000   call 0040133C                            ;  // 一个加法
    00401090  |.  83C4 04       add esp,0x4
    00401093  |.  3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
    00401099  |.  0F94C0        sete al
    0040109C  |.  50            push eax
    0040109D  |.  84C0          test al,al
    0040109F  |.^ 74 96         je short 00401037
    004010A1  |.  68 0E214000   push 0040210E                            ;  ASCII "CrackMe v3.0             "
    004010A6  |.  E8 9B020000   call 00401346
    004010AB  |.  83C4 04       add esp,0x4
    004010AE  |>  6A 00         push 0x0                                 ; /Title = NULL
    004010B0  |.  68 28214000   push 00402128                            ; |Class = "No need to disasm the code!"
    004010B5  |.  E8 9A030000   call <jmp.&USER32.FindWindowA>           ; FindWindowA

    这里查找了CRACKME3.KEY文件,然后通过ReadFile读取文件处理。

    我们在exe所在目录下,新建一个空文件:CRACKME3.KEY

    由于从地址 00401066 开始,进行了大量的内存数据修改和比较处理,并且没有参照内容,分析了很长时间还是不知道怎样才是正确的,所以只有放弃了!

    有关内存处理的地方如下:

    00401007  |.  A3 E9204000   mov dword ptr ds:[0x4020E9],eax
    0040100C  |.  C705 F9204000>mov dword ptr ds:[0x4020F9],0x0
    
    00401043  |> A3 F5204000   mov dword ptr ds:[0x4020F5],eax
    
    00401052  |.  6A 00         push 0x0                                 ; /pOverlapped = NULL
    00401054  |.  68 A0214000   push 004021A0                            ; |pBytesRead = Cruehead.004021A0
    00401059  |.  50            push eax                                 ; |BytesToRead => 12 (18.)
    0040105A  |.  53            push ebx                                 ; |Buffer => Cruehead.00402008
    0040105B  |.  FF35 F5204000 push dword ptr ds:[0x4020F5]             ; |hFile = NULL
    00401061  |.  E8 30040000   call <jmp.&KERNEL32.ReadFile>            ; ReadFile

    将读取的文本存放在[0x4020F5]内存中,然后进行数据比较,这部分是最重点的内容:

    00401066  |.  833D A0214000>cmp dword ptr ds:[0x4021A0],0x12         ;  // 比较这个地址的字节是否为0x12
    0040106D  |.^ 75 C8         jnz short 00401037
    0040106F  |.  68 08204000   push 00402008
    00401074  |.  E8 98020000   call 00401311                            ;  // 进行一些数据比较
    00401079  |.  8135 F9204000>xor dword ptr ds:[0x4020F9],0x12345678
    00401083  |.  83C4 04       add esp,0x4
    00401086  |.  68 08204000   push 00402008
    0040108B  |.  E8 AC020000   call 0040133C                            ;  // 一个加法
    00401090  |.  83C4 04       add esp,0x4
    00401093  |.  3B05 F9204000 cmp eax,dword ptr ds:[0x4020F9]
    00401099  |.  0F94C0        sete al
    0040109C  |.  50            push eax
    0040109D  |.  84C0          test al,al
    0040109F  |.^ 74 96         je short 00401037
    
    Call 00401037:
    00401311  /$  33C9          xor ecx,ecx
    00401313  |.  33C0          xor eax,eax
    00401315  |.  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    00401319  |.  B3 41         mov bl,0x41
    0040131B  |>  8A06          /mov al,byte ptr ds:[esi]
    0040131D  |.  32C3          |xor al,bl
    0040131F  |.  8806          |mov byte ptr ds:[esi],al
    00401321  |.  46            |inc esi
    00401322  |.  FEC3          |inc bl
    00401324  |.  0105 F9204000 |add dword ptr ds:[0x4020F9],eax
    0040132A  |.  3C 00         |cmp al,0x0
    0040132C  |.  74 07         |je short 00401335
    0040132E  |.  FEC1          |inc cl
    00401330  |.  80FB 4F       |cmp bl,0x4F
    00401333  |.^ 75 E6         jnz short 0040131B
    00401335  |>  890D 49214000 mov dword ptr ds:[0x402149],ecx
    0040133B  .  C3            retn
    
    Call 0040133C:
    0040133C  /$  8B7424 04     mov esi,dword ptr ss:[esp+0x4]
    00401340  |.  83C6 0E       add esi,0xE
    00401343  |.  8B06          mov eax,dword ptr ds:[esi]
    00401345  .  C3            retn

    到此结束!

    BY  笨笨D幸福

  • 相关阅读:
    颜色空间之CIE2000色差公式
    爱做梦的人-人的特性之一
    Lua文件操作和串行化
    Lua文件操作和串行化
    Lua调用C++带参数的方法
    Lua调用C++带参数的方法
    C++对Lua中table进行读取、修改和创建
    C++对Lua中table进行读取、修改和创建
    C++获取Lua全局变量和执行Lua多参数多返回值函数
    C++获取Lua全局变量和执行Lua多参数多返回值函数
  • 原文地址:https://www.cnblogs.com/bbdxf/p/3843952.html
Copyright © 2011-2022 走看看