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
  }}

解决方案 »

  1.   

    hoho~ WriteProcessMemory(),楼主写病毒呢?把 &idxianguai 改成 CMyDlg::idxianguai 试试。
      

  2.   

    WriteProcessMemory(openrocess,pRemoteThread,&idxianguai,128,NULL);
    改成:WriteProcessMemory(openrocess,pRemoteThread,idxianguai,128,NULL);即可
      

  3.   

    把 &idxianguai 改成 (void*)CMyDlg::idxianguai 试试。
    要不成,改成 (void*)(&CMyDlg::idxianguai) 试试。
      

  4.   

    楼主的问题来自于获得类的成员函数的指针问题,可以采用如下的方法解决typedef void (CMyDlg:: *FP)((_RemotePara *);CMyDlg dlg;FP fp = dlg.idxianguai;// 此时,fp中存有dlg的idxianguai函数地址
    // 最后
    WriteProcessMemory(openrocess,pRemoteThread, fp, 128, NULL);OK
      

  5.   

    也可使用如下模式:typedef void (CMyDlg:: *FP)((_RemotePara *);CMyDlg dlg;FP fp = &CMyDlg::idxianguai;// 此时,fp中存有dlg的idxianguai函数地址
    // 最后
    WriteProcessMemory(openrocess,pRemoteThread, fp, 128, NULL);OK
      

  6.   

    不好意思,上面多大了个括号:(
    应该是:
    typedef void (CMyDlg:: *FP)(_RemotePara *);
      

  7.   

    void __stdcall CMyDlg::idxianguai(_RemotePara *lpprar)这个声明成static的试下
      

  8.   

    CALLBACK函数,这个声明成static的试下应该可以的。
      

  9.   

    TO: hediant(何) 
    建议先去看看 WriteProcessMemory() 原型。
      

  10.   

    嗯,需要使用static或全局函数。
      

  11.   

    #define GET_FUN(_Fun) ((VOID *)(&(DWORD &)(_Fun)))这个宏可以满足你的要求
      

  12.   

    我把这个函数定义成全局的就行了,谢谢你们了,能不能再问个问题,我的分没有了,只能在这里问了:
    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,&para,sizeof(para),0);
    procthread=CreateRemoteThread(openrocess,0,0,(LPTHREAD_START_ROUTINE)pRemoteThread,prar,0,&proceid);
    ::WaitForSingleObject(procthread,INFINITE);
    ::CloseHandle(procthread);
    麻烦哪位朋友帮我看下,这段注入代码哪有问题,谢谢!
      

  13.   

    TO: hediant(何) 
    WriteProcessMemory要的只是个LPVOID,并不关心你是函数指针还是数据指针,更无须关心是否是成员函数指针,只要取到正确的指针就行了。
      

  14.   

    to:manbaum
    你没有看明白楼主的意思,LZ是想把函数idxianguai编译后的代码写入到一个进程中,所以在使用WriteProcessMemory函数的时候其实是把函数指针传递给了第三个参数。不过这里想提醒楼主一下,
    尽管函数指针通常是指向函数代码的地址的,但通常VC编译器会把函数的链接改成如下形式:
    假设fp = 0x004010000Address       代码
    0x004010000   JMP 0x004050000
    0x004010004
    ……
    0x004050000   真实的函数代码因此,使用上面的方法有时候可能会产生意想不到的结果或错误。
      

  15.   

    你没有看明白楼主的意思,LZ是想把函数idxianguai编译后的代码写入到一个进程中,所以在使用WriteProcessMemory函数的时候其实是把函数指针传递给了第三个参数。
    --------
    我明白楼主的意思。我的意思就在于,你只要取到正确的函数指针的地址就可以,不用去关心函数原形是什么,没必要做什么typedef构造一个函数指针类型,因为要的是地址,而不是类型。
      

  16.   

    tomanbaum(砸锅上网) :
       呵呵,估计你没看懂我写的代码的意思,取得函数指针的地址与取得类的成员函数的函数指针的形式有点不同,但结果都一样是取得函数指针。   其实MS大量使用了这样的方式获得类的成员变量的函数指针。当然,可以不用typedef,而直接使用 &CMyDlg::idxianguai的形式获得函数指针,但这样做不如使用typedef的方式更有优越性。