用于存储程序的ELF格式允许您在程序启动时通过返回函数指针的解析器函数动态链接函数。在机器代码中,不需要加载函数的地址,而是将新的链接地址直接内联到调用指令。在GCC / Clang,您可以这样做:
#include <iostream>
using TheFunc = void(*)();
// the resolver function is declared with extern"C",
// so you do not have to use the mangeled name as
// parameter to ifunc
extern"C" TheFunc thefunc_resolve() {
// maybe select a specific target function
return +[]{ std::cout << "Hello World!\n"; };
}
void thefunc() __attribute((ifunc("thefunc_resolve")));
int main() {
thefunc();
return 0;
};
问题:是否有任何可能的方法在Windows二进制文件中执行相同的链接,没有汇编程序黑客攻击或只是调用函数指针(由于指针来自变量的加载速度慢得多)?
答案 0 :(得分:1)
是的,查找延迟加载的DLL。它甚至可以通过自定义分辨率功能完成。