环境:
Windows Xp sp3
输入Name和Serial,无错误提示。看说明,只有正确时才有提示
OD载入,搜索字符串,发现两个字符串:
Panel1DblClick和Panel1Click
一个双击一个单击
先跟随单击的:
00457B88 . /B87F4500 dd CKme.00457FB8
00457B8C . |0B db 0B
00457B8D . |50 61 6E 65 6>ascii "Panel1Click"
00457B98 . |06 db 06
00457B99 . |54 46 6F 72 6>ascii "TForm1"
00457B9F |04 db 04
到00457FB8看看:
往下看一看找到这个:
00458031 |. 81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85 ;这里有个比较
0045803B 75 76 jnz XCKme.004580B3 ;不为0就跳,显然跳到下面那个地方的,所以[esi+0x30C]的值是关键
0045803D |. 33DB xor ebx,ebx
0045803F |> 8D55 E4 /lea edx,[local.7]
00458042 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00458048 |. E8 FBB2FCFF |call CKme.00423348
0045804D |. 8B45 E4 |mov eax,[local.7]
00458050 |. E8 27BBFAFF |call CKme.00403B7C
00458055 |. 83C0 03 |add eax,0x3
00458058 |. 8D55 E8 |lea edx,[local.6]
0045805B |. E8 A4FAFAFF |call CKme.00407B04
00458060 |. FF75 E8 |push [local.6]
00458063 |. 8D55 E0 |lea edx,[local.8]
00458066 |. 8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
0045806C |. E8 D7B2FCFF |call CKme.00423348
00458071 |. FF75 E0 |push [local.8]
00458074 |. 8D55 DC |lea edx,[local.9]
00458077 |. 8BC3 |mov eax,ebx
00458079 |. E8 86FAFAFF |call CKme.00407B04
0045807E |. FF75 DC |push [local.9]
00458081 |. 8D45 FC |lea eax,[local.1]
00458084 |. BA 03000000 |mov edx,0x3
00458089 |. E8 AEBBFAFF |call CKme.00403C3C
0045808E |. 43 |inc ebx
0045808F |. 83FB 13 |cmp ebx,0x13
00458092 |.^ 75 AB \jnz XCKme.0045803F
00458094 |. 33D2 xor edx,edx
00458096 |. 8B86 F0020000 mov eax,dword ptr ds:[esi+0x2F0]
0045809C |. E8 BFB1FCFF call CKme.00423260
004580A1 |. A1 20B84500 mov eax,dword ptr ds:[0x45B820]
004580A6 |. 83C0 70 add eax,0x70 ; 这里显然是成功的地方
004580A9 |. BA 14814500 mov edx,CKme.00458114 ; 恭喜恭喜!注册成功
004580AE |. E8 9DB8FAFF call CKme.00403950
004580B3 |> 33C0 xor eax,eax ;这里有个跳转来到这里,往上看
那就去跟随Panel1DblClick看看,发现了这个:
00457EF5 |. 83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E
00457EFC |. 75 0A jnz XCKme.00457F08
00457EFE |. C786 0C030000>mov dword ptr ds:[esi+0x30C],0x85
00457F08 |> 33DB xor ebx,ebx
原来是这里把[esi+0x30C]的值改为0x85的,但是前提是[esi+0x30C]的值要为0x3E
于是下个内存访问断点,重新让程序运行起来,在注册码的输入框中按下回车
跳到这里来了:
00457D2F |. 8B93 18030000 mov edx,dword ptr ds:[ebx+0x318]
00457D35 |. E8 52BFFAFF call CKme.00403C8C ;猜测这个call是判断注册码的正确性
00457D3A |. 75 0A jnz XCKme.00457D46
00457D3C |. C783 0C030000>mov dword ptr ds:[ebx+0x30C],0x3E ;这里赋值了0x3E
00457D46 |> 8B83 0C030000 mov eax,dword ptr ds:[ebx+0x30C]
00457D4C |. 83C0 10 add eax,0x10
00457D4F |. 8983 FC020000 mov dword ptr ds:[ebx+0x2FC],eax
往上翻一翻:
00457C40 /. 55 push ebp
00457C41 |. 8BEC mov ebp,esp
00457C43 |. 51 push ecx
00457C44 |. B9 05000000 mov ecx,0x5
00457C49 |> 6A 00 /push 0x0
00457C4B |. 6A 00 |push 0x0
00457C4D |. 49 |dec ecx
00457C4E |.^ 75 F9 \jnz XCKme.00457C49
00457C50 |. 51 push ecx
00457C51 |. 874D FC xchg [local.1],ecx
00457C54 |. 53 push ebx
00457C55 |. 56 push esi
00457C56 |. 8BD8 mov ebx,eax
00457C58 |. 33C0 xor eax,eax
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] ; 输入的Name的长度L
00457C6C |. 83C6 05 add esi,0x5 ; L = L + 5
00457C6F |. FFB3 10030000 push dword ptr ds:[ebx+0x310] ; [ebx+0x310]是serial的一部分
00457C75 |. 8D55 F8 lea edx,[local.2]
00457C78 |. 8BC6 mov eax,esi
00457C7A |. E8 85FEFAFF call CKme.00407B04 ; 算出来L存到内容中,L是serial的一部分
00457C7F |. FF75 F8 push [local.2]
00457C82 |. FFB3 14030000 push dword ptr ds:[ebx+0x314] ; [ebx+0x314]是serial的一部分
00457C88 |. 8D55 F4 lea edx,[local.3]
00457C8B |. 8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
00457C91 |. E8 B2B6FCFF call CKme.00423348 ; 将输入Name存到内存中,Name是serial的一部分
00457C96 |. FF75 F4 push [local.3]
00457C99 |. 8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
00457C9F |. BA 04000000 mov edx,0x4
00457CA4 |. E8 93BFFAFF call CKme.00403C3C ; 用上面4个部分,生成serial
00457CA9 |. 33D2 xor edx,edx
这样就生成了serial了,[ebx+0x310]和[ebx+0x314]的内容又是从哪里来呢?刚好往上翻一翻就是了:
00457BD0 . 53 push ebx
00457BD1 . 8BD8 mov ebx,eax
00457BD3 . 8D83 10030000 lea eax,dword ptr ds:[ebx+0x310] ; 保存到内存的位置
00457BD9 . BA 187C4500 mov edx,CKme.00457C18 ; 黑头Sun Bird
00457BDE . E8 6DBDFAFF call CKme.00403950
00457BE3 . 8D83 14030000 lea eax,dword ptr ds:[ebx+0x314] ; 保存到内存的位置
00457BE9 . BA 307C4500 mov edx,CKme.00457C30 ; dseloffc-012-OK
00457BEE . E8 5DBDFAFF call CKme.00403950
00457BF3 . B2 01 mov dl,0x1
00457BF5 . 8B83 E4020000 mov eax,dword ptr ds:[ebx+0x2E4]
00457BFB . E8 60B6FCFF call CKme.00423260
00457C00 . B2 01 mov dl,0x1
00457C02 . 8B83 F0020000 mov eax,dword ptr ds:[ebx+0x2F0]
00457C08 . E8 53B6FCFF call CKme.00423260
00457C0D . 5B pop ebx
00457C0E . C3 retn
设:
用户名长度为 L
L = L + 5
用户名为N
得:
serial = 黑头Sun Bird + L + dseloffc-012-OK+N
其中“+”是连接符号,这里只是方便观察用户名和serial的关系
用户名:goodname
serial: 黑头Sun Bird13dseloffc-012-OKgoodname
可能是环境原因,如果输入完正确的srial后马上点3下图片会显示成功,如果等待一段时间后再点3下是不能正常显示的,须在输入验证码的输入框中按下回车,再点3下图片才能正常显示。