Dll释放可执行文件用途很广泛。一种实现木马注入的方法就是将dll加载到某进程的地址空间后释放木马。接下来
介绍下详细的步骤,为后来者提供参考。
需要释放的文件首先必须以资源的形式存储在dll中。然后被读取、写入文件等。 创建dll的步骤就不介绍了。不
明白的可以参考我的博客《windows核心编程系列》谈谈dll。http://blog.csdn.net/ithzhang/article/details/7021274或
是参考网上使用vc创建dll的帖子。
Dll工程建好后,就需要添加资源。在资源视图右击添加资源--》导入。然后选中需要加入的文件。如calc.exe。为
资源定一个类型如EXE。资源就添加完毕了。展开该EXE资源,下面就是该资源的ID,如ID_EXE1。这在后面会用
到。
首先关注DllMain函数。这个函数在dll被加载到应用程序地址空间后以及从进程地址空间卸载时都会被调用。此外
还有另外两种情况此函数也会被调用。ul_reason_for_call标识了此函数被调用的原因。我们关注的是
DLL_PROCESS_ATTACH。在dll被加载到进程 地址空间时DllMain被调用,ul_reason_for_call 被赋值
DLL_PROCESS_ATTACH 。在这里我们将执行所有的动作。我的博文《windows核心编程系列》谈谈dll高级技术
http://blog.csdn.net/ithzhang/article/details/7051558
HINSTANCE hIns=GetModuleHandle("AudioEngine.dll");这句话会获得此dll的实例句柄。
FindResource会在指定的地址空间内搜索。由于我们将要释放的文件存储在dll内,因此传给它的句柄应该是hIns。
如果是在exe中,第一个参数可以省略默认当前进程地址空间。详细内容请参考:http://blog.csdn.net/ithzhang/article/details/7995102
看代码:
- <span style="font-size:18px;">case DLL_PROCESS_ATTACH:
- {
- HINSTANCE hIns=GetModuleHandle("AudioEngine.dll");
- HRSRC hRsrc =::FindResource(hIns, MAKEINTRESOURCE(IDR_EXE1), "exe");//IDR_XXXXXX就是你刚才导入的a.exe或b.dll的ID了
- if (NULL == hRsrc)
- {
- MessageBox(NULL,TEXT("资源查找失败!!!"),TEXT("失败!!"),MB_OK);
-
- return FALSE;
- }
-
- DWORD dwSize = SizeofResource(hIns, hRsrc);
- if (0 == dwSize)
- {
- MessageBox(NULL,TEXT("资源查找失败!!!"),TEXT("失败!!"),MB_OK);
- return FALSE;
- }
- //加载资源
- HGLOBAL gl = LoadResource(hIns, hRsrc);
- if (NULL == gl)
- {
- MessageBox(NULL,TEXT("加载资源失败!!!"),TEXT("失败!!"),MB_OK);
- return FALSE;
- }
- //锁定资源
- LPVOID lp = LockResource(gl);
- if (NULL == lp)
- {
- MessageBox(NULL,TEXT("锁定资源失败!!!"),TEXT("失败!!"),MB_OK);
-
- return FALSE;
- }
- TCHAR filename[256]=TEXT("calc1111.exe");//保存的临时文件名
- // CREATE_ALWAYS为不管文件存不存在都产生新文件。
- STARTUPINFO si={0};
- PROCESS_INFORMATION pi;
- DWORD a;
- HANDLE fp= CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
- if((fp==INVALID_HANDLE_VALUE))
- {
- MessageBox(NULL,TEXT("写入文件失败!!!"),TEXT("失败!!"),MB_OK);
-
- return 0;
- }
- if (!WriteFile (fp,lp,dwSize,&a,NULL))
- {
- MessageBox(NULL,TEXT("释放资源失败!!!"),TEXT("失败!!"),MB_OK);
-
- return false;
- }
- FreeResource (gl);//释放内存
- CloseHandle (fp);//关闭句柄
- bool ret=CreateProcess(NULL,filename,NULL,NULL,false,0,NULL,NULL,&si,&pi);
- if(!ret)
- {
- int r=GetLastError();
- char buff[256];
- sprintf(buff,"进程创建失败!!错误码为:%d",r);
- MessageBox(NULL,buff,TEXT("失败!!"),MB_OK);
- return 0;
-
- }
- CloseHandle(pi.hThread);
- CloseHandle(pi.hProcess);
- }</span>
本例中最后一步还调用CreateProcess让可执行文件执行。
在dll中添加资源这很常见。如对话框、位图等等。这跟dll释放exe文件原理都是类似的。
|