CrackMe--cffo-3

来源:互联网 发布:手机商城网页源码下载 编辑:程序博客网 时间:2024/06/05 04:28

打开软件,一看是要输入 用户名和序列号,随便输一个。然后点击 register。 弹出错误。

关键字出现了: Wrong Serial,try again!

OD 载入 ,搜索字符串得到两处结果、

中文搜索引擎, 条目 593
地址=00440F79
反汇编=mov edx,CrackMe3.0044108C
文本字符串=Wrong Serial,try again!

中文搜索引擎, 条目 595
地址=00440F93
反汇编=mov edx,CrackMe3.0044108C
文本字符串=Wrong Serial,try again!

发现两处地址较近,直接在反汇编窗口中查看。、

向上找,找到了两处关键call、

00440F2C  |.  8B45 FC       mov eax,[local.1]00440F2F  |.  BA 14104400   mov edx,CrackMe3.00441014                ;  Registered User00440F34  |.  E8 F32BFCFF   call CrackMe3.00403B2C00440F39  |.  75 51         jnz short CrackMe3.00440F8C              ;  跳了就完蛋

另一处:

00440F49  |.  8B45 FC       mov eax,[local.1]00440F4C  |.  BA 2C104400   mov edx,CrackMe3.0044102C                ;  GFX-754-IER-95400440F51  |.  E8 D62BFCFF   call CrackMe3.00403B2C00440F56  |.  75 1A         jnz short CrackMe3.00440F72              ;   跳了就完蛋

这两处call执行后如果 jnz发生了跳转就会产生失败。所以call函数要返回ZF=0

在第一处函数下断,F9运行,用户名为 testuser 序列号为 754-GFX-IER-954

压入两个参数,eax为 testuser ,edx为 Registered User

F7跳入函数内

00403B2C  /$  53            push ebx00403B2D  |.  56            push esi00403B2E  |.  57            push edi00403B2F  |.  89C6          mov esi,eax00403B31  |.  89D7          mov edi,edx                              ;  CrackMe3.0044101400403B33  |.  39D0          cmp eax,edx                              ;  CrackMe3.0044101400403B35  |.  0F84 8F000000 je CrackMe3.00403BCA                     ;  地址 相同则跳 显然不同00403B3B  |.  85F6          test esi,esi                             ;  检查字符串a是否为空、00403B3D  |.  74 68         je short CrackMe3.00403BA700403B3F  |.  85FF          test edi,edi                             ;  检查字符串b是否为空00403B41  |.  74 6B         je short CrackMe3.00403BAE00403B43  |.  8B46 FC       mov eax,dword ptr ds:[esi-0x4]           ;  输入 字符串长度00403B46  |.  8B57 FC       mov edx,dword ptr ds:[edi-0x4]           ;  参考字符串00403B49  |.  29D0          sub eax,edx                              ;  相减00403B4B  |.  77 02         ja short CrackMe3.00403B4F               ;  输入字符串a长度比较长 则跳转 根据后文edx可以得出是取短值00403B4D  |.  01C2          add edx,eax                              ;  如果字符串a比较短的话就让edx为字符串a的长度00403B4F  |>  52            push edx                                 ;  短值压入栈00403B50  |.  C1EA 02       shr edx,0x2                              ;  右移两位 就是除4,因为要进行字符串比较 4个字符一起比较效率高00403B53  |.  74 26         je short CrackMe3.00403B7B               ;  如果字符串长度小于4就会变成0 然后就挂了、00403B55  |>  8B0E          /mov ecx,dword ptr ds:[esi]              ;  CrackMe3.0043EB7000403B57  |.  8B1F          |mov ebx,dword ptr ds:[edi]              ;  比较esi edi所指向的四个字符00403B59  |.  39D9          |cmp ecx,ebx00403B5B  |.  75 58         |jnz short CrackMe3.00403BB5             ;  比较字符串 前四个字符 不相等就完蛋00403B5D  |.  4A            |dec edx                                 ;  字符串长度减一00403B5E  |.  74 15         |je short CrackMe3.00403B75              ;  比完了 就跳出去 没比完继续00403B60  |.  8B4E 04       |mov ecx,dword ptr ds:[esi+0x4]00403B63  |.  8B5F 04       |mov ebx,dword ptr ds:[edi+0x4]00403B66  |.  39D9          |cmp ecx,ebx00403B68  |.  75 4B         |jnz short CrackMe3.00403BB5             ;  不相等就滚出去00403B6A  |.  83C6 08       |add esi,0x800403B6D  |.  83C7 08       |add edi,0x800403B70  |.  4A            |dec edx                                 ;  又比较了4个字符了  每次循环比较8个字符00403B71  |.^ 75 E2         \jnz short CrackMe3.00403B55             ;  还有字符没比就继续00403B73  |.  EB 06         jmp short CrackMe3.00403B7B00403B75  |>  83C6 04       add esi,0x4                              ;  剩下不足4个字符了 不能在循环里面比了00403B78  |.  83C7 04       add edi,0x400403B7B  |>  5A            pop edx                                  ;  CrackMe3.00440F3900403B7C  |.  83E2 03       and edx,0x300403B7F  |.  74 22         je short CrackMe3.00403BA300403B81  |.  8B0E          mov ecx,dword ptr ds:[esi]               ;  CrackMe3.0043EB7000403B83  |.  8B1F          mov ebx,dword ptr ds:[edi]00403B85  |.  38D9          cmp cl,bl                                ;  比较剩下几个中的第一个00403B87  |.  75 41         jnz short CrackMe3.00403BCA00403B89  |.  4A            dec edx                                  ;  -100403B8A  |.  74 17         je short CrackMe3.00403BA300403B8C  |.  38FD          cmp ch,bh00403B8E  |.  75 3A         jnz short CrackMe3.00403BCA              ;  -100403B90  |.  4A            dec edx                                  ;  CrackMe3.0044101400403B91  |.  74 10         je short CrackMe3.00403BA300403B93  |.  81E3 0000FF00 and ebx,0xFF000000403B99  |.  81E1 0000FF00 and ecx,0xFF000000403B9F  |.  39D9          cmp ecx,ebx                              ;  -100403BA1  |.  75 27         jnz short CrackMe3.00403BCA00403BA3  |>  01C0          add eax,eax00403BA5  |.  EB 23         jmp short CrackMe3.00403BCA00403BA7  |>  8B57 FC       mov edx,dword ptr ds:[edi-0x4]00403BAA  |.  29D0          sub eax,edx                              ;  CrackMe3.0044101400403BAC  |.  EB 1C         jmp short CrackMe3.00403BCA00403BAE  |>  8B46 FC       mov eax,dword ptr ds:[esi-0x4]00403BB1  |.  29D0          sub eax,edx                              ;  CrackMe3.0044101400403BB3  |.  EB 15         jmp short CrackMe3.00403BCA00403BB5  |>  5A            pop edx                                  ;  CrackMe3.00440F3900403BB6  |.  38D9          cmp cl,bl00403BB8  |.  75 10         jnz short CrackMe3.00403BCA00403BBA  |.  38FD          cmp ch,bh00403BBC  |.  75 0C         jnz short CrackMe3.00403BCA00403BBE  |.  C1E9 10       shr ecx,0x1000403BC1  |.  C1EB 10       shr ebx,0x1000403BC4  |.  38D9          cmp cl,bl00403BC6  |.  75 02         jnz short CrackMe3.00403BCA00403BC8  |.  38FD          cmp ch,bh00403BCA  |>  5F            pop edi                                  ;  CrackMe3.00440F3900403BCB  |.  5E            pop esi                                  ;  CrackMe3.00440F3900403BCC  |.  5B            pop ebx                                  ;  CrackMe3.00440F3900403BCD  \.  C3            retn

其实这个函数的功能是检查两个字符串是否相同,
它首先比较两个字符串的地址是否相同,如果相同就返回失败。
然后比较两个字符串的第一个字符是否为 \0, 也就是检查字符串长度,如果为空,返回失败
接下来就可以进行比较了。 因为一个字符是8位,而eax寄存器变量是32位,所以每次比较4个字符,
最后不足4个字符单个比,当然如果字符串不同的话,肯定最后也会返回失败的。。
所以这个函数的参数是两个字符串,功能是比较两个字符串是否相同,如果相同的话,就返回1.

这两处关键call用的是同一处函数,所以只要找到题目中检查的第二个参数就行了。分别为;

Registered User
GFX-754-IER-954

0 0
原创粉丝点击