有关前面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中,好了,就说这么多了。
- 有关前面DLL和CreateRemoteThread函数综合说明
- 有关前面DLL和CreateRemoteThread函数综合说明
- CreateRemoteThread函数
- createremotethread()远程注入dll
- CreateRemoteThread LoadLibrary 注入DLL
- DLL注入之CreateRemoteThread
- user32.dll 函数说明
- CreateRemoteThread API 函数心得
- CreateRemoteThread API 函数心得
- 有关函数定义的说明
- CreateRemoteThread和WriteProcessMemory技术
- CreateRemoteThread和WriteProcessMemory技术
- CreateRemoteThread和WriteProcessMemory技术
- 进程注入技术:CreateRemoteThread 和 LoadLibrary技术的步骤 (非dll注入)
- 与LIB和DLL有关
- lib函数添加功能但是函数名和参数不变,重新封装成DLL有关问题
- user32.dll中的函数说明
- Advapi32.dll 函数接口说明
- Python 定时运行脚本
- mime 类型
- 字符数组与字符串(
- new的六种重载形式
- 删除SQL数据库中相同记录的SQL语句
- 有关前面DLL和CreateRemoteThread函数综合说明
- An incompatible version 1.1.1 of the Apache Tomcat Native library is installed, while Tomcat requires version 1.1.3
- 第一篇日志
- 呵呵,这是我第一篇博客,谢谢大家
- mime类型详解
- tomcat 5.5 的The Apache Tomcat Native library which allows optimal performance 的解决
- webRequest for authenticate
- 在Silverlight 2应用程序中集成Virtual Earth Silverlight Map
- 在Silverlight 2中实现超酷图表