gpt4 book ai didi

c++ - 从可执行文件中调用函数

转载 作者:行者123 更新时间:2023-11-30 01:47:43 29 4
gpt4 key购买 nike

我想从可执行文件中调用一个函数。到达该进程的唯一方法是在父进程中注入(inject)一个 dll。我可以在父进程中注入(inject)一个 dll,但我如何从子进程中调用一个函数?有点像

_asm
{
call/jmp address
}

不起作用。我希望你明白我的意思。

最佳答案

如果您在进程内部运行,您需要知道您要调用的函数与包含该函数的模块(exe)的基址的偏移量。然后,你只需要制作一个函数指针并调用它。

// assuming the function you're calling returns void and takes 0 params
typedef void(__stdcall * voidf_t)();

// make sure func_offset is the offset of the function when the module is loaded
voidf_t func = (voidf_t) (((uint8_t *)GetModuleHandle('module_name')) + func_offset);
func(); // the function you located is called here

如果您知道函数的地址,您的解决方案将适用于 32 位系统(64 位不允许内联汇编),但您需要确保正确实现调用约定。上面的代码使用 GetModuleHandle 来解析您要调用其函数的模块的当前加载基数。

一旦您将模块注入(inject)到正在运行的进程中,ASLR 就不是真正的问题,因为您只需向 Windows 询问包含您希望调用的代码的模块的基础。如果你想找到运行当前进程的exe的基础,你可以调用参数为NULL的GetModuleHandle。如果您确信函数偏移量不会改变,则可以在反汇编程序或其他工具中找到偏移量后,对要调用的函数的偏移量进行硬编码。假设包含该函数的 exe 文件未更改,则该偏移量将保持不变。

如评论中所述,调用约定在函数 typedef 中很重要,请确保它与您正在调用的函数的调用约定相匹配。

关于c++ - 从可执行文件中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237323/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com