2013-03-07 23 views
2

我有2个FARPROC,我想用另一个使用ASM替换另一个的地址。如何使用ASM将FARPROC的内存地址移动到另一个函数?

什么是FARPROC? “[int(FAR WINAPI * FARPROC)()]在C语言中,FARPROC声明表示一个具有未指定参数列表的回调函数。但是,在C++中,声明中的空参数列表表示函数没有参数。微妙的区别可以打破粗心的代码下面是处理这种情况的一种方式:”

现在,多数民众赞成覆盖,这是我的代码:

HMODULE h = LoadLibrary("myDLL.dll"); 
    FARPROC p = GetProcAddress(h, "[email protected]"); 

    if(!p) MessageBox(hwnd, "injected, but function not found", "Loader", NULL); 

    HMODULE dllHmodule = GetModuleHandle("InjectFunctions.dll"); 
    FARPROC injproc = GetProcAddress(dllHmodule, "[email protected]"); 

    if(!injproc) MessageBox(hwnd, "injproc is null", "Loader", NULL); 

    __asm{ 
     mov eax, p 
     ADD injproc [EAX],8 
    } 

我的问题是我如何使它所以当程序加载这个DLL调用p它会调用injproc?

+0

听起来像你试图做一些恶意的东西:) – OregonTrail 2013-03-07 16:57:50

+1

知道如何做这些事情并不是恶意的,它只是恶意使用这些东西的邪恶,我打算不这样做:) – CyanPrime 2013-03-07 16:59:02

回答

1

外部DLL中的每个引用的函数都会在可执行文件标题区域的导入地址表中获取一个条目。该条目的一部分是该函数的地址。这就是你打电话去其他地方的补丁。应该有很多关于如何在开放的互联网上实现这个功能的例子,尽管我没有方便的链接。

如果你想自己做,请从msdn下载Portable Executable规范,看看这些头文件的格式是什么。

相关问题