mingw32-g ++编译器如何知道在WIN32机器可执行文件中注入系统调用的位置?

LXS*_*oft -5 assembly winapi mingw ida portable-executable

今天,仅出于测试目的,我提出了以下想法,在CodeBlocks中创建和编译一个天真的源代码,使用Release目标来删除不必要的调试代码,一个带有三个nop操作的主函数只能找到更快的条目点的主要功能是.

CodeBlocks样本天真程序:

CodeBlocks代码

使用IDA反汇编程序,我看到一些奇怪的东西,OS实际上可以在main函数中添加aditional机器代码调用(隐式添加),调用系统函数,它驻留在kernel32.dll中,用于OS线程处理.

IDA计划视图:

IDA查看示例

在机器代码中仅出于测试原因将三个"nop"(90)替换为"和esp,0FFFFFFF0h",程序再次被重新缓存,这就是为什么"无操作"操作码在视图中不可取消的原因.

观察到的行为:

为每个进程创建一个新线程是逻辑,因为我们可以在TaskManager中探索它,这是一个在它自己的线程中运行的进程,这就是编译器添加此代码的原因(隐式默认线程).

我的问题:

编译器如何知道自动"注入"此调用代码的位置?

为什么之前没有在上层函数(sub_401B8C)中进行此调用,该函数将路由到主函数入口点?

Jes*_*ter 5

引用gcc手册:

如果没有init部分可用,当GCC编译任何名为main的函数时(或者更确切地说,由语言前端调用expand_main_function指定为程序入口点的任何函数),它会在__main之后插入一个过程调用作为第一个可执行代码.功能序幕.__main函数在libgcc2.c中定义并运行全局构造函数.