我正在尝试分析OllyDbg中的旧恶意软件样本。它具有CALL <JMP.&KERNEL32.SetUnhandledExceptionFilter>格式的说明

我不是汇编专家。我知道CALL用于调用子例程,而JMP用于跳转到内存中的特定地址,但是将CALL与JMP一起使用会产生什么结果?有人可以澄清吗?即使是指向我可以找到答案的地方的指针也将很有帮助。谢谢。

#1 楼

看到形式为CALL <JMP.&KERNEL32.SetUnhandledExceptionFilter>的调用,表明该二进制文件是使用Visual C ++的/ INCREMENTAL选项进行编译的,因此是跳转thunk的表。


...增量链接的可执行文件(.exe)文件或动态链接库(DLL):

...


可能包含跳转thunk来处理将函数重定位到新地址。

...


#2 楼

没错,可以直接调用它,而不必在调用后跳转。

但是,如果仅一次引用该API地址,则更容易,并且该单个引用应为JMP(否则会改变堆栈)。

因此,仅通过一个JMP对该API就有一个内存引用。每次使用该API时,此JMP都是CALL -ed,因此透明地传输执行,并且在API末尾,调用方的原始地址仍在堆栈中,该调用方将被透明地返回。 />

评论


这是跳转表的组成部分吗?

–TheRookierLearner
2013年9月29日下午16:45

#3 楼

原因是为了提高性能-跳转被收集到一个单独的区域中,该区域为了放置API地址而可以临时写入,并且通常只有一个页面大小。这样可以避免加载程序对VirtualProtect()的多次调用,从而将代码空间的所有内容写入对任何给定API的每个引用。