小狐用delphi编程后用自己写的软件的明码进行逆向(符合kanxue的无版权问题),向大家显示delphi的加解密和逆向工程技术,只要有朋友感兴趣,顶起来,我会逐渐增加难度,直至形成一个系统工程
我新建一个窗体,添加一个输入框,加一个按钮,按钮输入如下代码
begin
if form1.Edit1.text='loveyou' then
MessageBox(0,'你输入正确','成功',MB_OK);
end;
用OD加载新建的exe文件,跟踪结果如下:
以下是程序关建CALL附近的调用
0044F047 |. 8B80 FC020000 mov eax, dword ptr [eax+2FC]
0044F04D |. E8 EAF3FDFF call 0042E43C
0044F052 |. 8B45 FC mov eax, dword ptr [ebp-4]
0044F055 |. BA 9CF04400 mov edx, 0044F09C ; loveyou
0044F05A |. E8 BD51FBFF call 0040421C
0044F05F |. 75 13 jnz short 0044F074
0044F061 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0044F063 |. 68 A4F04400 push 0044F0A4 ; |成功
0044F068 |. 68 ACF04400 push 0044F0AC ; |你输入正确
0044F06D |. 6A 00 push 0 ; |hOwner = NULL
0044F06F |. E8 2474FBFF call <jmp.&user32.MessageBoxA> ; \MessageBoxA
0044F074 |> 33C0 xor eax, eax
根据以上可以得出结论:
1、如果是明码字符串比较,则明码字符串的你输入的字串开始地址为ebp-4,而程序设计时那个固定的内存变量被编译系统编译成一个固定的内存地址,在开始比较前放入eax
2、这也进一步证实了高手所说的在调用CALL时的入栈规则,在dephi调用时第一个参数最先入栈
这是按钮的 click事件
0040421C /$ 53 push ebx
0040421D |. 56 push esi
0040421E |. 57 push edi
0040421F |. 89C6 mov esi, eax
00404221 |. 89D7 mov edi, edx
00404223 |. 39D0 cmp eax, edx
00404225 |. 0F84 8F000000 je 004042BA
0040422B |. 85F6 test esi, esi
0040422D |. 74 68 je short 00404297
0040422F |. 85FF test edi, edi
00404231 |. 74 6B je short 0040429E
00404233 |. 8B46 FC mov eax, dword ptr [esi-4]
00404236 |. 8B57 FC mov edx, dword ptr [edi-4]
00404239 |. 29D0 sub eax, edx
0040423B |. 77 02 ja short 0040423F
delphi的编译系统很有意思,它没有按我们想象的那样进行循环逐次比较的方式形成7次循环,而是一个EAX和EDX进行比较后再来一个,可能对于CPU来说,这样的32位一次比较四个字节的快式来得更快吧,这样给我们一个结论:
我们在跟踪一些简单程序时,不应该把软件算法想的很复杂,其实有很多时间是编译系统为了提高执行效率把算法弄复杂了,这么长的汇编就是一个if语句.
0040423D |. 01C2 add edx, eax
0040423F |> 52 push edx
00404240 |. C1EA 02 shr edx, 2
00404243 |. 74 26 je short 0040426B
00404245 |> 8B0E /mov ecx, dword ptr [esi]
00404247 |. 8B1F |mov ebx, dword ptr [edi]
00404249 |. 39D9 |cmp ecx, ebx
0040424B |. 75 58 |jnz short 004042A5
0040424D |. 4A |dec edx
0040424E |. 74 15 |je short 00404265
00404250 |. 8B4E 04 |mov ecx, dword ptr [esi+4]
00404253 |. 8B5F 04 |mov ebx, dword ptr [edi+4]
00404256 |. 39D9 |cmp ecx, ebx
00404258 |. 75 4B |jnz short 004042A5
0040425A |. 83C6 08 |add esi, 8
0040425D |. 83C7 08 |add edi, 8
00404260 |. 4A |dec edx
00404261 |.^ 75 E2 \jnz short 00404245
00404263 |. EB 06 jmp short 0040426B
00404265 |> 83C6 04 add esi, 4
00404268 |. 83C7 04 add edi, 4
0040426B |> 5A pop edx
0040426C |. 83E2 03 and edx, 3
0040426F |. 74 22 je short 00404293
00404271 |. 8B0E mov ecx, dword ptr [esi]
00404273 |. 8B1F mov ebx, dword ptr [edi]
00404275 |. 38D9 cmp cl, bl
00404277 |. 75 41 jnz short 004042BA
00404279 |. 4A dec edx
0040427A |. 74 17 je short 00404293
0040427C |. 38FD cmp ch, bh
0040427E |. 75 3A jnz short 004042BA
00404280 |. 4A dec edx
00404281 |. 74 10 je short 00404293
00404283 |. 81E3 0000FF00 and ebx, 0FF0000
00404289 |. 81E1 0000FF00 and ecx, 0FF0000
0040428F |. 39D9 cmp ecx, ebx
00404291 |. 75 27 jnz short 004042BA
00404293 |> 01C0 add eax, eax
00404295 |. EB 23 jmp short 004042BA
00404297 |> 8B57 FC mov edx, dword ptr [edi-4]
0040429A |. 29D0 sub eax, edx
0040429C |. EB 1C jmp short 004042BA
0040429E |> 8B46 FC mov eax, dword ptr [esi-4]
004042A1 |. 29D0 sub eax, edx
004042A3 |. EB 15 jmp short 004042BA
004042A5 |> 5A pop edx
004042A6 |. 38D9 cmp cl, bl
004042A8 |. 75 10 jnz short 004042BA
004042AA |. 38FD cmp ch, bh
004042AC |. 75 0C jnz short 004042BA
004042AE |. C1E9 10 shr ecx, 10
004042B1 |. C1EB 10 shr ebx, 10
004042B4 |. 38D9 cmp cl, bl
004042B6 |. 75 02 jnz short 004042BA
004042B8 |. 38FD cmp ch, bh
004042BA |> 5F pop edi
004042BB |. 5E pop esi
004042BC |. 5B pop ebx
004042BD \. C3 retn
[课程]Linux pwn 探索篇!