vc 函数的绝对指针

来源:百度知道 编辑:UC知道 时间:2024/05/05 17:46:22
我有一个DLL,想与一个程序通信,但是这个程序与Dll没有加载关系

我在Dll的DllMain里向程序发送一个特定消息,LPARAM参数有Dll中一个函数的地址信息,这样程序那边就可以调用这个DLl内的这个函数而不需加载它

但是发送的函数地址似乎是一个相对地址(0x10001000),程序调用就有异常
问下怎样获得函数绝对地址

你搜进程间通信.

这样做是不允许的,首先你这个DLL是不能自动运行的,肯定是有另外一个EXE加载它,这样这个DLL的函数和数据就映射到加载它的EXE地址空间里面,所以你上面得到的0x10001000实际是加载它的EXE的地址空间里面的虚拟地址;这个地址在另外一个进程里面是不存在的,所以你在那进程里面访问这个地址是会导致访问非法的。

如果你非得这么做,你可以考虑注入方式来实现,首先你需要用OpenProcess来打开这个进程,然后用VirtualAllocEx来为这个进程申请空间,要申请多大的空间,有关这个有点复杂,一般来说都是需要DLL本身的支持,如果你知道代码是多大那就好办,当然你多分配了没问题的。例如你要加入到这个进程的函数为R,那你可以设计如下
static void R();
static void foo();
这样用foo函数地址减去R的地址即可得到R函数占用的空间大小了,说题外话了,回正题。申请空间成功并且写入数据后,VirtualProtect来修改这个虚拟地址的属性为可执行,操作成功后就可以调用CreateRemoteThread来创建远程线程来启动刚才写入的代码了。

另外值得注意的是,这种注入方法比较麻烦,如上面的,你注入的R函数调用到某个系统API,例如是CreateFontA,但目标进程里没有调用过这个API,那么你的函数就会运行出错,所以在R函数里面,你调用的系统API都必须通过LoadLibrary来加载,此外,你的R函数不允许再调用DLL里的其它函数,即使是私有的也不行,因为它们没有映射到远程地址里面,除非是inline。

反正这方法复杂得很,也不好调试……出错了超麻烦……一般不建议用