环境:
Windows xp sp3
工具
1.ollydbg
2.exeinfope
0x00 查壳
还是无壳的Delphi程序
0x01 分析
这次继续OD载入搜字符串,但是没找到错误信息的字符串。
又因为是Delphi程序,所以可以试一下这样:
OD载入后还是搜字符串,可以看到这个:
分别跟随进去,下断点。
00421DB2 8BC0 mov eax,eax
00421DB4 . A1 60464200 mov eax,dword ptr ds:[0x424660]
00421DB9 . E8 26BBFFFF call Dope2112.0041D8E4
00421DBE . C3 retn
00421DBF 90 nop
00421DC0 . E8 0FBAFFFF call Dope2112.0041D7D4
00421DC5 . C3 retn
00421DC6 8BC0 mov eax,eax
00421DC8 /. 55 push ebp ; 点击Check后会在这里断下
00421DC9 |. 8BEC mov ebp,esp
00421DF2 |. E8 89FAFEFF call Dope2112.00411880 ; 读入serial
00421DF7 |. 8D55 FC lea edx,[local.1]
00421DFA |. 8B86 AC010000 mov eax,dword ptr ds:[esi+0x1AC]
00421E00 |. E8 7BFAFEFF call Dope2112.00411880 ; 读入name
00421E05 |. 8B45 FC mov eax,[local.1]
00421E08 |. E8 5715FEFF call Dope2112.00403364 ; 计算长度
00421E0D |. 83F8 04 cmp eax,0x4 ; 不能小于4位
00421E10 |. 7D 0C jge XDope2112.00421E1E
00421E12 |. A1 64464200 mov eax,dword ptr ds:[0x424664]
00421E17 |. E8 C8BAFFFF call Dope2112.0041D8E4
00421E1C |. EB 4D jmp XDope2112.00421E6B
00421E1E |> 8B45 FC mov eax,[local.1]
00421E21 |. E8 3E15FEFF call Dope2112.00403364 ; 计算长度
00421E26 |. 85C0 test eax,eax
00421E28 |. 7C 14 jl XDope2112.00421E3E
00421E2A |. 40 inc eax ; 循环次数为:字符串长度加1
00421E2B |. 33D2 xor edx,edx
00421E2D |> 8B4D FC /mov ecx,[local.1]
00421E30 |. 0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-0x1] ; 将每个字符读出来左移9位
00421E35 |. C1E1 09 |shl ecx,0x9
00421E38 |. 03D9 |add ebx,ecx ; 37
00421E3A |. 42 |inc edx
00421E3B |. 48 |dec eax
00421E3C |.^ 75 EF \jnz XDope2112.00421E2D
00421E3E |> 8D55 F4 lea edx,[local.3]
00421E41 |. 8BC3 mov eax,ebx
00421E43 |. E8 E834FEFF call Dope2112.00405330
00421E48 |. 8B45 F4 mov eax,[local.3]
00421E4B |. 8B55 F8 mov edx,[local.2]
00421E4E |. E8 2116FEFF call Dope2112.00403474
00421E53 |. 75 0C jnz XDope2112.00421E61
00421E55 |. A1 68464200 mov eax,dword ptr ds:[0x424668]
00421E5A |. E8 85BAFFFF call Dope2112.0041D8E4 ; 正确的弹窗
00421E5F |. EB 0A jmp XDope2112.00421E6B
00421E61 |> A1 64464200 mov eax,dword ptr ds:[0x424664]
00421E66 |. E8 79BAFFFF call Dope2112.0041D8E4 ; 错误的弹窗
这个更简单了,第一个值是0x37,其他都是将name每个字符的ascii值左移9位,将结果相加,结果的10进制值就是serial了。