概述
前面讲了DLL和CreateRemoteThread函数的基本用法,然而如果你想做个实用点的东西,还必须注意许多细节,这篇算是前面的小综合。
我们的目的是要在QQ.exe进程中插入一个新线程,这个线程会调用LoadLibrary()来加载我们自己写的DLL。
说下思路
1:DLL中的DllMain函数
首先需要说明的是,DLL文件不只是用来做存储的库,它也可以像exe文件那样运行程序,而前面我们讲的DLL都是单纯的用它来导出函数和类,可能会误导某些和我一样的初学者,不过不要紧,要像exe那样运行也很简单,只需要添加一个DllMain函数即可,这个函数是DLL的入口函数,与WinMain、main一个意思,不过貌似比main更好用哈,有兴趣的可以追究一下switch的各种情况的具体是怎么来的,这里不写了。
有人可能会问这个DllMain函数放在哪里,我想说的是学程序不能学死了,就像你问main函数放在哪里一样。
代码如下:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBoxA(0,"proc attach","msg",MB_OK);
case DLL_THREAD_ATTACH:
MessageBoxA(0,"thread attach","msg",MB_OK);
case DLL_THREAD_DETACH:
MessageBoxA(0,"thread dettach","msg",MB_OK);
case DLL_PROCESS_DETACH:
MessageBoxA(0,"proc dettach","msg",MB_OK);
break;
}
return TRUE;
}
2:知道了DLL可以运行的比exe还好,那么我们只需要Loadlibrary()然后DLL就可以工作了哈。
好,再来看下我们的远程线程里面写什么呢?我们只需要调用LoadLibrary()这一步工作就可以了,简单啊~
然而事实并非这样顺利,小细节可能让大象也能翻跟头啊。
3: 结构体:代码如下:
typedef struct _RemoteParam {
DWORD Func[10];
char msg[10][50];
} RemoteParam, * PRemoteParam;
一个是函数名数组,一个是参数数组,为了研究方便,我才使用数组的,不至于每添加一个函数都要重写这个结构。
函数定义:typedef HINSTANCE (__stdcall * LOADLIB)(LPCTSTR);
希望你能很清楚的知道这是什么意思~
加载DLL:
RemoteParam remoteData;
ZeroMemory(&remoteData,sizeof(remoteData));
HINSTANCE hKen = LoadLibrary("Kernel32.dll");
remoteData.Func[0]=(DWORD)GetProcAddress(hKen,"LoadLibraryA");
FreeLibrary(hKen);
strcpy_s(remoteData.msg[0],"dll_02.dll/0");
这里有个问题不得不提,那就是GetProcAddress(hKen,"LoadLibraryA");你写成GetProcAddress(hKen,"LoadLibraryW")或GetProcAddress(hKen,"LoadLibrary")试试看,如果你知道Unicode编码,那么你应该知道为什么后2者为什么不行,看看源声明也可以稍微理解一下。
好了,最后来看线程函数:
DWORD __stdcall threadProc(LPVOID lParam)
{
RemoteParam* pRP = (RemoteParam*)lParam;
LOADLIB lb=(LOADLIB)pRP->Func[0];
lb(pRP->msg[0]);
return 0;
}
简单吧~
4:别以为这样就完了,还有一点呢!
我们让QQ这个进程来加载dll_02.dll,那么就是QQ.exe进程在它所在当前路径中查找,所以我们还得将dll_02.dll放到QQ.exe的文件夹中。当然你也可以将dll放到系统文件夹中,那是dll中心嘛,大家一起用。
5:我这里只是将大体框架写出来,细枝末节都给删了,是为了让人看得更清楚,我源代码不是上面那样的哦。
还想说的一点是CreateRemoteThread函数产生的线程中的代码几乎不可能执行什么功能,每加一个函数都痛苦得要命,所以建议把所有的实现都放到DLL的DLLMAIN中,好了,就说这么多了。
最后
以上就是俏皮香菇为你收集整理的有关前面DLL和CreateRemoteThread函数综合说明的全部内容,希望文章能够帮你解决有关前面DLL和CreateRemoteThread函数综合说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复