如何调用远程注入后DLL中的函数

怎么调用远程注入后DLL中的函数
dll里写了个Add函数,也导出了,直接在exe里调用dll没问题,然后我把这个Dll注入到其他进程后不会调用Dll里的Add函数(注入是成功的),网上找了N久也不知道怎么搞,都说像LoadLibraryA一样调用,但是这个LoadLibraryA是全局的,所以进程里都有加载这个kernel32,而且网上说这个在每个进程里的地址一样,我自己注入的可不是全部进程注入的
C/C++ code

   DWORD dwID;
    LPVOID pFunc = LoadLibraryA;
    HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
    WaitForSingleObject( hThread, INFINITE );
//do
    DWORD hDll;
    lpAdd AddFunc;
    GetExitCodeThread( hThread,&hDll );
    HMODULE hmdll=(HMODULE)hDll;
    if(hDll!=NULL)
    {
        AddFunc=GetProcAddress(hmdll,"Add");
        DWORD aa= GetLastError();//这每次都是126(找不到模块)
        if(AddFunc!=NULL)
        {
            AddFunc(2,3);
            AfxMessageBox("遠程執行成功");
        }
    }


C/C++ code

typedef  int (*lpAdd)(int a,int b);


C/C++ code

extern "C" __declspec(dllexport) int __stdcall Add(int a,int b)
{
    return theApp.Add(a,b);
}


GetProcAddress 后GetLastError 每次都是126,确认dll是注入成功的,有用工具查看过
怀疑这个GetProcAddress 是进行注入的Exe执行的,所以系统就在这个exe的模块里去找那个dll了,所以找不到
最后,RT问一下

------解决方案--------------------
探讨
LPVOID pAddFunc=lpAdd;
HANDLE hThreadAdd=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pAddFunc,??,0,&dwID);
參數位置用什麽?弄個結構?
lpAdd里可沒有解析結構的代碼
再一個參數還要用VirtualAllocEx在遠程進程里開內存?再WriteProcessMemory?

------解决方案--------------------
C/C++ code

  DWORD dwID;
    LPVOID pFunc = LoadLibraryA;
    HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
    WaitForSingleObject( hThread, INFINITE );
//do
    DWORD hDll;
    lpAdd AddFunc;
    GetExitCodeThread( hThread,&hDll );
    HMODULE hmdll=(HMODULE)hDll;
    if(hDll!=NULL)
    {
        AddFunc=GetProcAddress(hmdll,"Add");
        DWORD aa= GetLastError();//这每次都是126(找不到模块)
        if(AddFunc!=NULL)
        {
            AddFunc(2,3);
            AfxMessageBox("遠程執行成功");
        }
    }

------解决方案--------------------
首先是对远程执行概念上的理解有错误

1.用CreateRemoteThread在目标进程创建远程线程执行LoadLibraryA,实现注入,这个没有错。
2.同理的,你想要远程执行你DLL的Add函数,也必须使用远程线程调用,参考上一条。
3.你通过GetExitCodeThread取得的HMODULE是目标进程(远程)的模块基址,而你却在本地使用(GetProcAddress),当然是不存在的模块。

C/C++ code

  DWORD dwID;
    LPVOID pFunc = LoadLibraryA;
    HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );
    WaitForSingleObject( hThread, INFINITE );
//do
    DWORD hDll;
    lpAdd AddFunc;
    GetExitCodeThread( hThread,&hDll );
    HMODULE hmdll=(HMODULE)hDll; //[color=#FF0000]hDll是目标进程的Your.dll的HMODULE,在这里可并不存在[/color]
    if(hDll!=NULL)
    {
        AddFunc=GetProcAddress(hmdll,"Add"); //[color=#FF0000]这样是错误的,应该让GetProcAddress和上面的LoadLibraryA一样在目标进程里执行(它有两个参数,所以不好直接用CreateRemoteThread,再议)[/color]
        DWORD aa= GetLastError();//这每次都是126(找不到模块)
        if(AddFunc!=NULL)
        {
            AddFunc(2,3); //[color=#FF0000]假设上面的GetProcAddress已解决,这样也是错误的,依然需要在目标进程调用,道理和上面一样[/color]
            AfxMessageBox("遠程執行成功");
        }
    }