美文网首页
crackme#004 ajj_1

crackme#004 ajj_1

作者: 北嶋雪 | 来源:发表于2020-03-07 13:20 被阅读0次

0x01 准备工作

作者很贴心的写了封信,总结一下就是这个注册机没有button,使用delphi写的。当然一开始还是先扔到die看一下:


image.png

打开程序,和之前的crackme有点不一样:

image.png

概括一下,就是在文本框中输入正确的注册码,下面灰色方框里面就会出现一张照片。与之前不同的地方在哪里?之前我们可以通过button知道程序一定会有一个关键的判断跳转jnz,但是现在程序的结构,应该是实时监听文本框的改变情况来修改窗体元素(或者说照片)是否可见。主要任务还是不变,第一看一下能不能爆破,第二如果有注册算法就分析一下。

0x02 ida分析

Jpeg::Finalization(void)    CODE    00457880    00000040    00000004    00000000    R   .   L   .   B   T   .
Jpeg::initialization(void)  CODE    004578C0    00000093    0000000C    00000000    R   .   L   .   B   T   .
_TForm1_FormCreate          CODE    00457BD0    0000003F    00000004    00000000    R   .   .   .   .   .   .
_TForm1_chkcode             CODE    00457C40    0000020C    0000003C    00000000    R   .   .   .   B   .   .
_TForm1_KeyUp               CODE    00457E4C    0000002D    0000000C    00000000    R   .   .   .   B   .   .
_TForm1_Panel1DblClick      CODE    00457E7C    0000013A    00000030    00000000    R   .   .   .   B   .   .
_TForm1_Panel1Click         CODE    00457FB8    00000152    00000030    00000000    R   .   .   .   B   .   .
sub_458128                  CODE    00458128    0000002E    00000004    00000000    R   .   .   .   B   .   .
sub_458158                  CODE    00458158    00000008    00000000    00000000    R   .   .   .   .   .   .
unknown_libname_373         CODE    00458160    00000028    00000004    00000000    R   .   L   .   B   .   .
start                       CODE    004582D0    00000056    00000010    00000000    .   .   L   .   B   .   .

从函数列表中看到了一些关键的函数,比如有jpeg图片的初始化和生成,form的创建,chkcode应该是检查注册码,keyup猜测应该是监听器,panel1dblclick/click对灰色面板的单击和双击。用注册失败的字符串来定位关键跳转,在这里不能使用。幸好ida把每个函数的开始地址告诉我了,那扔od看一下情况。

0x03 od分析

先看看chkcode,没想到一开头就看到了一些信息:

00457C1C   .  53 75 6E 20 4>ascii "Sun Bird",0
00457C25      00            db 00
00457C26      00            db 00
00457C27      00            db 00
00457C28   .  FFFFFFFF      dd FFFFFFFF
00457C2C   .  0F000000      dd 0000000F
00457C30   .  64 73 65 6C 6>ascii "dseloffc-012-OK",0
00457C40  /.  55            push ebp                                 ;  chkcode function
00457C41  |.  8BEC          mov ebp,esp
00457C43  |.  51            push ecx                                 ;  CKme.<ModuleEntryPoint>
00457C44  |.  B9 05000000   mov ecx,0x5

说明chkcode中可能使用到了字符串常量"Sun Bird"和“dseloffc-012-OK”
伪码测试,name文本框填endcat,在chkcode开头下断点。在注册码文本框键入f,不出所料,断中。说明keyup监听注册码文本框。

00457C40  /.  55            push ebp                                 ;  chkcode function
00457C41  |.  8BEC          mov ebp,esp
00457C43  |.  51            push ecx
00457C44  |.  B9 05000000   mov ecx,0x5                              ;  ecx = 5
00457C49  |>  6A 00         /push 0x0
00457C4B  |.  6A 00         |push 0x0
00457C4D  |.  49            |dec ecx                                 ;  ecx decrease
00457C4E  |.^ 75 F9         \jnz short CKme.00457C49                 ;  create space loop
00457C50  |.  51            push ecx
00457C51  |.  874D FC       xchg [local.1],ecx                       ;  ecx = unicode(f)
00457C54  |.  53            push ebx
00457C55  |.  56            push esi
00457C56  |.  8BD8          mov ebx,eax
00457C58  |.  33C0          xor eax,eax                              ;  eax = 0
00457C5A  |.  55            push ebp
00457C5B  |.  68 3D7E4500   push CKme.00457E3D
00457C60  |.  64:FF30       push dword ptr fs:[eax]
00457C63  |.  64:8920       mov dword ptr fs:[eax],esp
00457C66  |.  8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8]         ;  esi = 6
00457C6C  |.  83C6 05       add esi,0x5                              ;  esi = 0xB
00457C6F  |.  FFB3 10030000 push dword ptr ds:[ebx+0x310]            ;  push 黑头Sun Bird
00457C75  |.  8D55 F8       lea edx,[local.2]
00457C78  |.  8BC6          mov eax,esi                              ;  eax = edi = 0xB
00457C7A  |.  E8 85FEFAFF   call CKme.00407B04
00457C7F  |.  FF75 F8       push [local.2]                           ;  push 11
00457C82  |.  FFB3 14030000 push dword ptr ds:[ebx+0x314]            ;  push dseloffc-012-OK
00457C88  |.  8D55 F4       lea edx,[local.3]
00457C8B  |.  8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
00457C91  |.  E8 B2B6FCFF   call CKme.00423348
00457C96  |.  FF75 F4       push [local.3]                           ;  push endcat
00457C99  |.  8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
00457C9F  |.  BA 04000000   mov edx,0x4                              ;  edx = 4
00457CA4  |.  E8 93BFFAFF   call CKme.00403C3C
00457CA9  |.  33D2          xor edx,edx
00457CAB  |.  8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CB1  |.  E8 AAB5FCFF   call CKme.00423260
00457CB6  |.  8B93 18030000 mov edx,dword ptr ds:[ebx+0x318]         ;  黑头Sun Bird11dseloffc-012-OKendcat

总结一下就是注册码=黑头Sun Bird11desloffc-012-OKendcat,试一下

image.png

不幸,啥事都没发生,得继续看其他的函数,还记得panel的单击双击事件没?实际上输入了注册码以后对灰色面板一顿狂按,是没啥反应的。跟进到汇编看一下:
挑关键部分看一下,下面是双击函数:

00457EF5  |.  83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E
00457EFC  |.  75 0A         jnz short CKme.00457F08
00457EFE  |.  C786 0C030000>mov dword ptr ds:[esi+0x30C],0x85
00457F08  |>  33DB          xor ebx,ebx

下面是单击函数:

0045802F  |.^\75 AB         \jnz short CKme.00457FDC
00458031  |.  81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
0045803B  |.  75 76         jnz short CKme.004580B3
0045803D  |.  33DB          xor ebx,ebx

思路是这样的,先分别看了下两个点击函数是否有关键跳转语句,然后放在一起看,发现了问题。单击函数中要满足[esi+0x30C]=0x85才能跳转,而双击函数中如果满足[esi+0x30C]=0x3E,就会把[esi+0x30C]改成0x85,这应该不是巧合。
把[esi+0x30C]改成0x3E,然后分别执行双击动作和单击动作。

image.png image.png image.png

出现力!

相关文章

  • crackme#004 ajj_1

    0x01 准备工作 作者很贴心的写了封信,总结一下就是这个注册机没有button,使用delphi写的。当然一开始...

网友评论

      本文标题:crackme#004 ajj_1

      本文链接:https://www.haomeiwen.com/subject/cvxcdhtx.html