在使用olly反转可执行文件时,存在编译器代码和用户代码。那么我如何识别编译器代码?可以说如果可执行文件是Visual Basic的,它在前2条指令中有一个jmp和一个调用,而winmain稍后出现。

#1 楼

您只需要确定主要功能。从main调用的所有内容都是用户代码。如果要检查函数是否是用户代码的一部分,请递归检查从该函数开始的外部参照,并查看其是否以main结尾。至于如何识别主程序,则取决于可执行文件要针对其进行编译的OS,也可能取决于特定的编译器。但是对于由gcc for Linux编译的ELF文件,main是在start中调用__libc_start_main之前最后推送的值。

评论


是的,我认为tat将适用于ida,并使用外部参照进行追溯。任何手动操作的想法吗?

–user_lian
17年1月13日在10:48

当然。查找从main调用的所有函数。每次找到一个函数时,将其添加到列表中,然后找到从该函数调用的所有函数。因此,如果该函数存在于该列表中,则意味着它是用户代码的一部分。

–黄色字节
17年1月14日下午5:09

“从主调用的所有内容都是用户代码”?那是一个大胆的声明。您不仅可以将用户调用放入main中(即使仅是一个较低的printf(“请提供此命令的参数\ n”;);),也可以在main内部进行模板调用以初始化全局数据,并调用系统维护例程或序言和尾声等。

–杂件
17年1月15日在13:41

对不起,您说的话我很困惑。说模板调用,是指函数模板?功能模板可以由用户声明和定义。全局数据是用户代码的一部分。它们放在.data或.bss节中,但在用户代码中引用。在主要权利之前调用系统维护例程吗?在启动功能?当您说序言/结尾时,是指功能序言和功能尾声?那只是定义了函数如何设置和清除自身。用户没有明确地写序言和结语,但这只是将功能编译成什么。

–黄色字节
17年1月17日下午5:52

如果我误解了您的回复@Rad_Lexus,我们深表歉意。

–黄色字节
17年1月17日在6:24