我正在尝试分析一段代码,我对以下行感到困惑:
CALL fct.00402589
然后在那之后,我遇到了一个以 RETN 开头的块。(见下文)
这是该代码块的几行:
RETN
NOP
PUSH EBP
MOV EBP,ESP
LEA ESP, DWORD PTR SS:[ESP-0X2D0]
PUSH ESP
CALL ntdll.RtCaptureContext
......
......
INT 3
NOP
正如我所说,在通话之后,我正在排队等候 RETN。但是,当我想更进一步时(单击 ollydbg 的“跳过”按钮),它会在调用指令后跳回下一行。在最后一条指令“NOP”之前的行中,有指令 INT 3。
我发现在某些情况下,特别是作为反调试技术,程序会插入 INT 3 的操作码 0xCC 来混淆调试器。调试器认为这是一个断点,因为通常情况下,调试器使用 OxCC 来设置断点。
因此,我更改了 ollydbg 的调试选项(选项 -> 调试选项 -> 异常,然后单击 INT 3 中断框)。从现在开始,调试器不会捕获异常,而是将异常传递给程序。
当我再次启动程序并来到调用指令时,会出现以下内容(我再次复制了一些行):
JMP DWORD PTR DS: [<%crtdll._GetMainArgs>]
NOP
NOP
ADD BYTE PTR DS:[EAX], AL
ADD BYTE PTR DS:[EAX], AL
JMP DWORD PTR DS: [<%crtdll._strcmpi>]
NOP
NOP
ADD BYTE PTR DS:[EAX], AL
ADD BYTE PTR DS:[EAX], AL
JMP DWORD PTR DS: [<%crtdll._atoi>]
NOP
NOP
ADD BYTE PTR DS:[EAX], AL
ADD BYTE PTR DS:[EAX], AL
JMP DWORD PTR DS: [<%crtdll._exit>]
NOP
NOP
ADD BYTE PTR DS:[EAX], AL
ADD BYTE PTR DS:[EAX], AL
JMP DWORD PTR DS: [<%crtdll._memcpy>]
NOP
NOP
----
等等,有人知道吗?或者有人可以解释我这里发生了什么?