我指的是,传过去的函数,不是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函数呢?
有什么办法可以达到我说的效果吗?
请大家帮忙想想,谢谢!
比如,下面这个是我的远程线程函数:
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函数呢?
有什么办法可以达到我说的效果吗?
请大家帮忙想想,谢谢!
解决方案 »
- 怎么从一个邮件地址得到相应的邮件服务器?像[email protected]——>smtp.126.com?
- 请问用什么方法封装窗口创建过程但不封装回调函数?
- 关于SHFormatDrive函数的问题
- 我自己建了一个ToolBar,画了几笔简单的图案,可是显示不出来...
- sqlconfigdatasource创建数据源时不能指定uid和pwd......高手请进。
- 远程线程的问题
- 高分求救!!!
- windows控件类
- 挑战性问题
- ATL 实现的Webbrowser, 无法响应 页面内的 execwb(45,1) 关闭页面事件
- SQL查询正常的语句在VC中死活返回空怎么回事?
- 简单问题:工程里拷贝了别人的代码后怎么关于Csize类型的比如m_pos.cx m_pos.cy全有警告?
楼主你要清楚,你写的代码并不在目标进程的地址空间,CreateRemoteThread的方法的线程入口必须是在目标进程的地址空间中,所以你的线程函数(MyFunctio)必须要将整份代码用WriteProcessMemory写入到目标进程中。同时,你的线程函数中要使用其他函数,如myLoad都必须重定位,使用API也必须重定为(要符合目标进程地址空间的地址)。
其实1楼说得很对,直接把你的DLL路径的字符串变量写如目标进程,然后CreateRemoteThread的线程入口用LoadLibrary的地址,则你的DLL就注入了,然后在全局对象的构造函数中干你想干的事就可以了,比代码注入方便很多。