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,然后分别执行双击动作和单击动作。
出现力!
网友评论