我目前正在与Olly和IDA分析一些破解方法。最初,它是包装好的。我设法找到了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的使用。尽管它们可以起到有意义的作用(考虑位置无关的代码),但此处未使用它们。这些是垃圾指令,它们的存在只是使人们在看反汇编时感到迷惑。

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

评论


彼得,非常感谢!但是仍然有这部分: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