看起来很奇怪的汇编代码堆

逆向工程 艾达 拆卸 部件 ollydbg 快手
2021-06-13 10:47:19

我目前正在使用 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 对代码的解释可能有问题?

先感谢您!

1个回答

如果您按照流程进行操作,您将看到第一个“lea ebx, []”的结果被替换为“lea ebx, []”的结果,并且没有中间使用 ebx。虽然它们可以用于有意义的目的(考虑与位置无关的代码),但这不是它们在这里的用途。这些是垃圾指令,它们的存在只是为了让正在查看反汇编的人感到困惑。

至于对下一条指令的调用,该调用将指向返回地址的指针保存在堆栈中,因此将该值弹出到寄存器中将使代码知道它在内存中的位置。这可能是为了与位置无关的代码,或者只是一种避免使用常量使反汇编更加困难的方法。