我正忙着装配和翻译后产生的实际字节(无论如何都在x86上),我发现自己在问这个:
在Linux中,当你想调用say printf时,你会将参数和调用代码放在堆栈上,然后调用int 0x80。这非常优雅,并且将始终转换为相同的字节。
但是在Windows上,我尝试编译一个小程序,就像这样
#include <stdio.h>
int main() {
printf("abcdefgh");
return 0;
}
然后拆开它。其中,产生类似“call _printf”的东西,其中_printf代表“jmp * 0x406124”和两个nops(甚至是静态链接!)。
我假设跳转中的地址是printf库函数的动态加载地址,所以在每次加载时这可能会有所不同?或者我在这里完全错了?那么,动态加载器如何知道程序想要调用哪个函数,只需要从指令代码(这可能是一个接近调用这么短的程序)?动态链接器是否会更改指令代码?
对于简单的系统调用来说,这似乎都是一个很大的麻烦,但我知道Windows也可以使用int 0x80代码,除了功能代码经常更改(或者我被告知)。那么在Windows上的指令中直接调用printf(或任何其他系统调用)的最简单方法是什么?