有关前面DLL和CreateRemoteThread函数综合说明

来源:互联网 发布:dm单宣传彩页网络平台 编辑:程序博客网 时间:2024/06/05 06:52

前面讲了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中,好了,就说这么多了。

原创粉丝点击