从Windows

时间:2015-11-20 21:36:11

标签: windows assembly

我正忙着装配和翻译后产生的实际字节(无论如何都在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(或任何其他系统调用)的最简单方法是什么?

0 个答案:

没有答案