CM--CrueHead.3

Posted WhiteLearner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CM--CrueHead.3相关的知识,希望对你有一定的参考价值。

继续160个新手CM系列,今天破的是KeyFile保护的一道题,觉得最坑的就是最后破解成功的提示框,居然写着“Now try the next crackme”。。。我这英文0级的以为这道题还有后续。。就又搞了半天最后发现它的意思是你可以去做其他的题了。。。⊙﹏⊙‖∣

言归正传,还是先打开程序,结果发现什么都没有,什么输入框了啥的都没有。。。emmm具体就像下图一样

好吧我们直接打开OD调试。

 

00401000 >/$  6A 00         push    0                                ; /pModule = NULL
00401002  |.  E8 7D040000   call    <jmp.&KERNEL32.GetModuleHandleA> ; \\GetModuleHandleA
00401007  |.  A3 E9204000   mov     dword ptr [4020E9], eax
0040100C  |.  C705 F9204000>mov     dword ptr [4020F9], 0
00401016  |.  6A 00         push    0                                ; /hTemplateFile = NULL
00401018  |.  68 80000000   push    80                               ; |Attributes = NORMAL
0040101D      6A 03         push    3;OPEN_EXISTING
0040101F  |.  6A 00         push    0                                ; |pSecurity = NULL
00401021  |.  6A 03         push    3                                ; |ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401023  |.  68 000000C0   push    C0000000                         ; |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, -1;创建失败,不能让他创建失败,所以自己建一个CRACKME3.KEY
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 [4020F5], eax
00401048  |.  B8 12000000   mov     eax, 12
0040104D  |.  BB 08204000   mov     ebx, 00402008
00401052  |.  6A 00         push    0                                ; /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 [4020F5]               ; |hFile = NULL
00401061  |.  E8 30040000   call    <jmp.&KERNEL32.ReadFile>         ; \\ReadFile
00401066      833D A0214000>cmp     dword ptr [4021A0], 12  ;比较读出的文件内容是不是18个字节
0040106D  |.^ 75 C8         jnz     short 00401037
0040106F  |.  68 08204000   push    00402008
00401074  |.  E8 98020000   call    00401311;关键,跟下去瞅瞅

下面就是比较文件中的内容了

00401311  /$  33C9          xor     ecx, ecx;清0
00401313  |.  33C0          xor     eax, eax
00401315  |.  8B7424 04     mov     esi, dword ptr [esp+4];文件读出来的内容
00401319  |.  B3 41         mov     bl, 41
0040131B  |>  8A06          /mov     al, byte ptr [esi]
0040131D  |.  32C3          |xor     al, bl;将文件中读出来的第一个字节与41h异或
0040131F  |.  8806          |mov     byte ptr [esi], al
00401321  |.  46            |inc     esi
00401322  |.  FEC3          |inc     bl
00401324  |.  0105 F9204000 |add     dword ptr [4020F9], eax
0040132A  |.  3C 00         |cmp     al, 0
0040132C  |.  74 07         |je      short 00401335;当文件第一个字节为41h时跳
0040132E  |.  FEC1          |inc     cl
00401330  |.  80FB 4F       |cmp     bl, 4F
00401333  |.^ 75 E6         \\jnz     short 0040131B
00401335  |>  890D 49214000 mov     dword ptr [402149], ecx
0040133B  \\.  C3            retn
00401079  |.  8135 F9204000>xor     dword ptr [4020F9], 12345678
00401083  |.  83C4 04       add     esp, 4
00401086  |.  68 08204000   push    00402008
0040108B  |.  E8 AC020000   call    0040133C
0040133C  /$  8B7424 04     mov     esi, dword ptr [esp+4]           ;  Cruehead.00402008
00401340  |.  83C6 0E       add     esi, 0E
00401343  |.  8B06          mov     eax, dword ptr [esi]
00401345  \\.  C3            retn

00401090  |.  83C4 04       add     esp, 4
00401093  |.  3B05 F9204000 cmp     eax, dword ptr [4020F9];将12345678与文件中最后4个字节比较,注意字节在内存中的保存位置
00401099  |.  0F94C0        sete    al;当相等时将al置为1,不相等置为0
0040109C  |.  50            push    eax
0040109D  |.  84C0          test    al, al
0040109F  |.^ 74 96         je      short 00401037;当al为1时不跳,跳就gg了

下面就是找窗口注册窗口的过程了,就不继续分析了,还有一点注意文件中最后四个字节用16进制编译器写入,因为你自己写txt的话写不了12这个值。

这道题刚开始分析还有点难度,但是分析完觉得也不是那么难。。。emmmm毕竟称为新手CM ⊙﹏⊙‖∣

以上是关于CM--CrueHead.3的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数