我目前正在使用 Olly 和 IDA 分析一些 Crackme。最初它是打包的。我设法找到了 OEP(在 POPAD 之后不久和一堆空值之前的 JMP):
0040E978 . 53 PUSH EBX
0040E979 . 57 PUSH EDI
0040E97A . FFD5 CALL NEAR EBP
0040E97C . 58 POP EAX
0040E97D . 61 POPAD
0040E97E . 8D4424 80 LEA EAX, DWORD PTR SS:[ESP-80]
0040E982 > 6A 00 PUSH 0
0040E984 . 39C4 CMP ESP, EAX
0040E986 .^ 75 FA JNZ SHORT crackme_.0040E982
0040E988 . 83EC 80 SUB ESP, -80
0040E98B .- E9 7062FFFF JMP crackme_.00404C00
0040E990 00 DB 00
0040E991 00 DB 00
0040E992 00 DB 00
但我可能做错了一些事情,或者,可能是某种混淆技术,导致解压后的程序充满了类似的东西:
lea ecx, ds:2186C225h ; Load Effective Address
UPX0:00403042 mov ebx, 0C11A8EBBh
UPX0:00403047 lea ebx, [ebx-6CFE17B8h] ; Load Effective Address
UPX0:0040304D add ecx, ecx ; Add
UPX0:0040304F lea ebx, [eax-68FB1E76h] ; Load Effective Address
UPX0:00403055 sub ecx, eax ; Integer Subtraction
UPX0:00403057 lea eax, [ebp-6Ch] ; Load Effective Address
UPX0:0040305A push eax
UPX0:0040305B call $+5 ; Call Procedure
UPX0:0040305B
UPX0:00403060 pop eax
UPX0:00403061 add eax, 0Ah ; Add
UPX0:00403064 push eax
UPX0:00403065 jmp loc_408EF0 ; Jump
最让我困惑的是(除了 UPX 前缀,虽然它似乎是解包的),是这样的指令:
UPX0:00403047 lea ebx, [ebx-6CFE17B8h] ; Load Effective Address
UPX0:0040304F lea ebx, [eax-68FB1E76h] ; Load Effective Address
此外,在整个代码中有很多调用跳转,它们指向下一条指令,而不是代码中的其他地方(这更常见):
0040327B 50 PUSH EAX
0040327C E8 00000000 CALL crackme2.00403281
00403281 58 POP EAX
...
0040321A 50 PUSH EAX
0040321B 8B45 08 MOV EAX, DWORD PTR SS:[EBP+8]
0040321E 50 PUSH EAX
0040321F E8 00000000 CALL crackme2.00403224
00403224 58 POP EAX
这有多常见?
我想,那可能是我解包错了,但程序似乎可以正常工作。我的下一个虽然是它可能是自我修改的,但是当我将 BP 放在 GetWindowTextA 上时,其中加载了名字、姓氏和序列号,然后通过代码,它似乎没有改变。
有没有可能有这样的地址?:
lea ecx, ds:2186C225h ; Load Effective Address
...
lea ebx, [eax-68FB1E76h] ; Load Effective Address
或者 OllyDbg 对代码的解释可能有问题?
先感谢您!