WriteProcessMemory(openrocess,pRemoteThread,&idxianguai,128,NULL);提示成员函数不能有&符号,其中&idxianguai是函数名,函数原型为:
void __stdcall CMyDlg::idxianguai(_RemotePara *lpprar)
{
UINT dwid;
dwid=lpprar->dww1;
UINT Address=0x0057e8b0;
_asm
{
pushad
mov esi,dwid
push esi
mov ecx,DWORD PTR DS:[0x9151c4]
MOV ecx,DWORD PTR DS:[ecx+0x20]
add ecx,0xd4
call Address
popad
}}
void __stdcall CMyDlg::idxianguai(_RemotePara *lpprar)
{
UINT dwid;
dwid=lpprar->dww1;
UINT Address=0x0057e8b0;
_asm
{
pushad
mov esi,dwid
push esi
mov ecx,DWORD PTR DS:[0x9151c4]
MOV ecx,DWORD PTR DS:[ecx+0x20]
add ecx,0xd4
call Address
popad
}}
解决方案 »
- 请教:在MFC对话框的按钮的响应函数里面,用new申请的数组,要不要delete掉呢?
- 显示、打印预览和打印三者传入的pDC的关系是什么?
- 如何从DLL中导出带STL实例的类?
- 椭圆弧算法的rx,ry代表什么?
- 求助 串口通讯
- 如何直接利用类型库生成COM dll程序?
- 怎么从图片中读取 exif 数据 ?
- 宽字节字符(wide-character)和多字节字符(multibyte-character)的区别是什么??
- 如何调用全局变量的数组
- 请问Csocket高手:一个Csocket连接断开,虽然在onclose作了处理,但是...应该如何处理
- 关于不规则窗口
- RPC用ncacn_ip_tcp协议来通信问题
改成:WriteProcessMemory(openrocess,pRemoteThread,idxianguai,128,NULL);即可
要不成,改成 (void*)(&CMyDlg::idxianguai) 试试。
// 最后
WriteProcessMemory(openrocess,pRemoteThread, fp, 128, NULL);OK
// 最后
WriteProcessMemory(openrocess,pRemoteThread, fp, 128, NULL);OK
应该是:
typedef void (CMyDlg:: *FP)(_RemotePara *);
建议先去看看 WriteProcessMemory() 原型。
void __stdcall idxianguai(RemotePara *lpprar)
{
DWORD dwid;
dwid=lpprar->dww1;
DWORD Address=0x0057e8b0;
_asm
{
pushad
mov esi,dwid
push esi
mov eax,DWORD PTR DS:[0x9151c4]
MOV ecx,DWORD PTR DS:[eax+0x20]
add ecx,0xd4
call Address
popad
}}
typedef struct _RemotePara{
DWORD dww1;
}RemotePara;
_RemotePara para;
LPTHREAD_START_ROUTINE pRemoteThread;
LPVOID prar;
HANDLE procthread;
para.dww1=guaiwuid;
pRemoteThread=(LPTHREAD_START_ROUTINE)VirtualAllocEx(openrocess,0,128,MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(openrocess,pRemoteThread,&idxianguai,128,NULL);
prar=VirtualAllocEx(openrocess,0,sizeof(_RemotePara),MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(openrocess,prar,¶,sizeof(para),0);
procthread=CreateRemoteThread(openrocess,0,0,(LPTHREAD_START_ROUTINE)pRemoteThread,prar,0,&proceid);
::WaitForSingleObject(procthread,INFINITE);
::CloseHandle(procthread);
麻烦哪位朋友帮我看下,这段注入代码哪有问题,谢谢!
WriteProcessMemory要的只是个LPVOID,并不关心你是函数指针还是数据指针,更无须关心是否是成员函数指针,只要取到正确的指针就行了。
你没有看明白楼主的意思,LZ是想把函数idxianguai编译后的代码写入到一个进程中,所以在使用WriteProcessMemory函数的时候其实是把函数指针传递给了第三个参数。不过这里想提醒楼主一下,
尽管函数指针通常是指向函数代码的地址的,但通常VC编译器会把函数的链接改成如下形式:
假设fp = 0x004010000Address 代码
0x004010000 JMP 0x004050000
0x004010004
……
0x004050000 真实的函数代码因此,使用上面的方法有时候可能会产生意想不到的结果或错误。
--------
我明白楼主的意思。我的意思就在于,你只要取到正确的函数指针的地址就可以,不用去关心函数原形是什么,没必要做什么typedef构造一个函数指针类型,因为要的是地址,而不是类型。
呵呵,估计你没看懂我写的代码的意思,取得函数指针的地址与取得类的成员函数的函数指针的形式有点不同,但结果都一样是取得函数指针。 其实MS大量使用了这样的方式获得类的成员变量的函数指针。当然,可以不用typedef,而直接使用 &CMyDlg::idxianguai的形式获得函数指针,但这样做不如使用typedef的方式更有优越性。