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的解释可能有问题代码吗?
谢谢您!
#1 楼
如果按照该流程进行操作,您将看到第一个“ lea ebx []”的结果被“ lea ebx [[]””的结果代替,而没有介入ebx的使用。尽管它们可以起到有意义的作用(考虑位置无关的代码),但此处未使用它们。这些是垃圾指令,它们的存在只是使人们在看反汇编时感到迷惑。就下一条指令的调用而言,该调用将指向返回地址的指针保存在堆栈中,因此弹出该值放入寄存器将使代码知道其在内存中的位置。这可能是出于位置无关代码的目的,或者是避免使用常量使反汇编更加困难的一种方法。
评论
彼得,非常感谢!但是仍然有这部分:lea ecx,ds:2186C225h;加载有效地址
– ShHolmes
17 Sep 12'在7:05
我现在意识到,有些指令只是垃圾,但仍有一些指令不太“垃圾明显”:lea ecx,ds:2186C225h;加载有效地址。正如我们从该指令后的代码中看到的那样,几乎使用了ecx。但这仍然不是有效地址。这也是某种毫无用处的代码,根本没有意义吗?还是机器代码被错误解释?
– ShHolmes
17年9月12日在7:12
我已经跟踪了这些操作,结果发现,“ lea ecx,ds:2186C225h”仅等于“ mov ecx,2186C225h”(根据存储的结果)。
– ShHolmes
17年9月12日在12:59
是的,“ lea”可用于对常数值进行乘法和加法运算组合。此后不必产生实际地址。
–彼得·弗里
17年9月12日在16:56