我指的是,传过去的函数,不是CreateRemoteThread这个函数里调用API!
比如,下面这个是我的远程线程函数:
int  __stdcall WINAPI MyFunction(LPVOID pData)
{
typedef void  (WINAPI* HOOKAPI)(BOOL IsHook,DWORD dwThreadId, HANDLE handle);
        //上面这个函数是我自己写的DLL里的一个函数,这个函数在远程线程函数里根本就不能调用!
        //搞得这个远程线程像个鸡肋似的,什么都不能干! typedef HMODULE (WINAPI * MyLoadLibraryA)(LPCSTR lpLibFileName);
typedef FARPROC (WINAPI *MYGETPROC)(HMODULE hModule, LPCSTR lpProcName);
typedef int (WINAPI* MyMessageBox)(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType);        //上面定义了三个系统函数类型,要想用这三个函数,我就要定三个这样的类型.
        //问题是,如果我想用很多个系统函数,我是不是要定义,好像这样的类型?
        //这样是不是有点太笨的了.
        //还有,如果我想在这个函数里使用sprintf,那就更没办法了,因为我不知道他在哪个DLL里!
        //是不是还有别的简单的方法,可以使用这样函数呢?
        //微软不会这么笨,要这样给供给程序员来用CreateRemoteThread函数吧!应该还有别的方法吧! REMOTEINFO * RmoteInfo = (REMOTEINFO *)pData; MyLoadLibraryA myLoad = (MyLoadLibraryA)RmoteInfo->LoadAddr; MYGETPROC MyGetProcAddr = (MYGETPROC)RmoteInfo->GetProcAddr; MyMessageBox box = (MyMessageBox)RmoteInfo->MsgAddr; HINSTANCE hInst; hInst = myLoad(rinfo->szText);    //加载我自己写的DLL if (hInst)
{
InstallHookApi = (HOOKAPI)MyGetProcAddr(hInst, "InstallHookApi");   //得到我的DLL里的某个函数
                  //char szText[]128 = {0};
                //sprintf(szText, "%d", InstallHookApi);
                //上面这块,我本想用一个MessageBox弹出来,看看有没有正确得到这个InstallHookApi地址,可是sprintf,根本不让用,一用目标进程就退出!               //下面这块,我想调用我自己写的DLL里的函数,可是根本就没用!
if (InstallHookApi > 0)
InstallHookApi(TRUE, rinfo->pPro.dwThreadId, rinfo->pPro.hProcess);
} return 0;
}
上面我加了很多注释,问题我想在注释里说,能让大家很快看明白问题!
我现在就是不能在这个线程函数里自如的使用WINDOW系统API的函数,不知道有没有办法,可以轻松的使用函数的这些方法.
为什么不能像,在自己的程序里调用函数一样,直接调用系统API函数呢?
有什么办法可以达到我说的效果吗?
请大家帮忙想想,谢谢!

解决方案 »

  1.   

    简单的方法就是将你的实现功能的代码放在一个DLL中,然后在远程线程中加载这个DLL这就不存在API需要重新定位的问题了
      

  2.   

    如果不是非要用远程,可以尝试HOOK(钩子)比较有效。
      

  3.   

    你的LoadLibrary和GetProcAddress函数地址在哪里获取的
      

  4.   

    楼主你想代码注入?
    楼主你要清楚,你写的代码并不在目标进程的地址空间,CreateRemoteThread的方法的线程入口必须是在目标进程的地址空间中,所以你的线程函数(MyFunctio)必须要将整份代码用WriteProcessMemory写入到目标进程中。同时,你的线程函数中要使用其他函数,如myLoad都必须重定位,使用API也必须重定为(要符合目标进程地址空间的地址)。
    其实1楼说得很对,直接把你的DLL路径的字符串变量写如目标进程,然后CreateRemoteThread的线程入口用LoadLibrary的地址,则你的DLL就注入了,然后在全局对象的构造函数中干你想干的事就可以了,比代码注入方便很多。
      

  5.   

    请阅读《Windows核心编程》"22.4 使用远程线程来插入DLL",里面有完整的例子,教你如何把代码挂载到目标进程空间里运行。