版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、远程注入DLL1、 概述为了隐藏自身的进程信息,我们希望将进程作为一个合法进程的线程运行。由于系统进程间不允许直接操作资源,因而我们需要在合法进程内部创建一个线程,为其指定要执行的代码。一种简单的方式是令远程线程载入一个我们编写的DLL,通过DllMain()函数执行我们需要的代码。基本思路是将LoadLibrary()函数作为一个线程函数来调用:CreateRemoteThread()-LoadLibrary()-DllMain()这里的核心函数是CreateRemoteThread(),它用来在远程进程中创建一新线程。我们来看一下这个函数:HANDLE WINAPI CreateRemot
2、eThread(HANDLE hProcess, /要创建远程线程的进程句柄LPSECURITY_ATTRIBUTES lpThreadAttributes, /用于定义新线程的安全属性,这里设为NULL采用默认值即可SIZE_T dwStackSize,/初始化线程堆栈大小,NULL为默认大小LPTHREAD_START_ROUTINE lpStartAddress, /线程函数开始的地址LPVOID lpParameter,/线程函数参数DWORD dwCreationFlags,/函数表示创建线程后线程的运行状态LPDWORD lpThreadId/返回线程ID,不关心可以设为NULL不
3、返回);使用这个函数关键要解决三个参数问题:l获得远程线程的进程句柄,而且要确保相应权限l获取远程进程中线程函数的开始地址,而非本地地址l向远程线程成功传入DLL路径字符串解决了这三个问题,我们的远程注入DLL就基本完成了。接下来,这篇笔记的组织结构如下:F获取远程进程句柄l枚举系统进程l提升进程权限F获取LoadLibrary()函数在远程进程中的地址F向远程线程中写入DLL路径字符串l利用VirtualAllocEx()分配远程地址空间l利用WriteProcessMemory()写入远程地址空间F程序源码F运行测试2、 获取远程进程句柄我们主要利用OpenProcess()函数来获得要注
4、入的进程的句柄,句柄是系统中可以起到唯一标识作用的一个对象。我们来看一下OpenProcess()函数:HANDLE WINAPI OpenProcess(DWORD dwDesiredAccess,/获取的句柄的访问权限BOOL bInheritHandle,/是否可为新进程继承DWORD dwProcessId/要获取句柄的进程ID);句柄的访问权限是指我们要使用该进程的句柄做哪些访问操作,对于远程注入DLL来说,主要有:PROCESS_CREATE_THREAD |/For CreateRemoteThread()PROCESS_VM_OPERATION |/For VirtualAll
5、ocEx()/VirtualFreeEx()PROCESS_VM_WRITE/For WriteProcessMemory(0当然,我们也可以直接设为最高权限:PROCESS_ALL_ACCESS。第二个参数说明了是否可为新进程继承,第三个参数需要借助我们编写的子函数ListProcess()来获得。另外需要注意的是,对于很多系统和服务进程而言,获取其带有写权限的句柄需要主调进程拥有调试权限,我们利用子函数EnableDebugPriv()来提升权限。这样在XP下就足够了,在VISTA之后的系统中需要进一步提升另一个隐藏权限,这里只讨论在XP上的情况。lListProcess()我们使用Too
6、lHelpAPI获取当前运行程序的信息,从而编写适合自己需要的工具(MSDN)。它支持的平台比较广泛,可以在Windows CE下使用。在Windows Mobile SDK的Samples里面有一个PViewCE的样例程序,就是用这个来查看进程和线程信息的。使用方法就是先用CreateToolhelp32Snapshot将当前系统的进程、线程、DLL、堆的信息保存到一个缓冲区,这就是一个系统快照。如果你只是对进程信息感兴趣,那么只要包含TH32CS_SNAPPROCESS标志即可。常见标志如下:TH32CS_SNAPHEAPLIST:列举th32ProcessID指定进程中的堆TH32CS_
7、SNAPMODULE:列举th32ProcessID指定进程中的模块TH32CS_SNAPPROCESS:列举系统范围内的所有进程TH32CS_SNAPTHREAD:列举系统范围内的所有线程函数执行成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。得到系统快照句柄后,我们调用Process32First和Process32Next来依次获取系统中每个进程的信息,将信息存入PROCESSENTRY32结构体中,该结构体中存放着进程的主要信息,如DWORDth32ProcessID;/进程IDDWORDth32ModuleID;/进程模块IDCHARszExeFileMAX_PA
8、TH;/进程的可执行文件名这两个函数当枚举到进程时返回TRUE,否则返回FALSE。然后调用一次Process32First函数,从快照中获取第一个进程,然后重复调用Process32Next,直到函数返回FALSE为止,这样将遍历快照中进程列表。这两个函数都带两个参数,它们分别是快照句柄和一个PROCESSENTRY32结构。调用完Process32First或Process32Next之后,PROCESSENTRY32中将包含系统中某个进程的关键信息。其中进程ID就存储在此结构的th32ProcessID。此ID传给OpenProcess API可以获得该进程的句柄。对应的可执行文件名及其
9、存放路径存放在szExeFile结构成员中。在该结构中还可以找到其它一些有用的信息。需要注意的是:在调用Process32First()之前,要将PROCESSENTRY32结构的dwSize成员设置成sizeof(PROCESSENTRY32)。然后再用Process32First、Process32Next来枚举进程。使用结束后要调用CloseHandle来释放保存的系统快照。具体程序代码如下:/利用ToolHelp32库来枚举当前系统进程#include#include#include#includeintListProcess()/获取系统快照HANDLE hProcessSnap =
10、 CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);/不要写错CreateToolhelp32Snapshot()if(hProcessSnap = INVALID_HANDLE_VALUE)printf(CreateToolHelp32Snapshot error!n);return-1;/创建单个进程快照结构体,初始化大小PROCESSENTRY32 pe32;pe32.dwSize =sizeof(PROCESSENTRY32);/务必提前初始化,否则默认的大小不一定满足要求/初始化缓冲区WCHAR buff1024 = 0;/PROCESS
11、ENTRY32中的szExeFile为WCHAR类型数组,此处应一致,使用Unicode码/枚举系统快照链表中的第一个进程项目BOOL bProcess = Process32First(hProcessSnap, &pe32);while(bProcess)/格式化进程名和进程ID,这里要使用printf的宽字符版/格式字符串“”都需要用L转换为宽字符形式wsprintf(buff, LFileName:%-30sID:%-6drn, pe32.szExeFile, pe32.th32ProcessID);wprintf(L%sn,buff);/缓冲区复位memset(buff, 0,siz
12、eof(buff);/继续枚举下一个进程bProcess = Process32Next(hProcessSnap, &pe32);CloseHandle(hProcessSnap);return0;lEnableDebugPriv()提升权限主要利用下面四个函数:GetCurrentProcessID()/得到当前进程的IDOpenProcessToken()/得到进程的令牌句柄LookupPrivilegeValue()/查询进程的权限AdjustTokenPrivileges()/调整令牌权限进程的权限设置存储在令牌句柄中,我们需要先获取进程的令牌句柄,其次获取进程中权限类型的LUID值
13、,利用此值来设置进程新的权限,具体函数调用顺序如下:OpenProcessToken()-LookupPrivilegeValue()-AdjustTokenPrivileges()具体代码如下:#include#includeintEnableDebugPriv(constWCHAR *name)HANDLE hToken;/进程令牌句柄TOKEN_PRIVILEGES tp;/TOKEN_PRIVILEGES结构体,其中包含一个【类型+操作】的权限数组LUID luid;/上述结构体中的类型值/打开进程令牌环/GetCurrentProcess()获取当前进程的伪句柄,只会指向当前进程或者
14、线程句柄,随时变化if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)printf(OpenProcessToken errorn);return-8;/获得本地进程name所代表的权限类型的局部唯一IDif(!LookupPrivilegeValue(NULL, name, &luid)printf(LookupPrivilegeValue errorn);tp.PrivilegeCount = 1;/权限数组中只有一个“元素”tp.Privileges0.Attribu
15、tes = SE_PRIVILEGE_ENABLED;/权限操作tp.Privileges0.Luid = luid;/权限类型/调整进程权限if(!AdjustTokenPrivileges(hToken, 0, &tp,sizeof(TOKEN_PRIVILEGES), NULL, NULL)printf(AdjustTokenPrivileges error!n);return-9;return0;3、 获取LoadLibrary()的远程地址对于Windows系统而言,本地进程和远程进程中的Kernel32.dll被映射到地址空间的同一内存地址,因而只要获取本地进程中LoadLibra
16、ry()的地址,在远程进程中也同样是这个地址,可以直接传给CreateRemoteThread():LPTHREAD_START_ROUTINE pLoadLibrary=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(kernel32.dll),LoadLibraryA);GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。函数原型:FARPROC GetProcAddress(HMODULE hModule, / DLL模块句柄LPCSTR lpProcName /函数名,以NULL结尾的
17、字符串);返回值:如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。4、 向远程进程中写入DLL路径字符串lVirtualAllocEx()如果直接向CreateRemoteThread()传入DLL路径,如”C:WindowsSystem32MyDLL.dll”那么实际向远程线程传递的是一个本地的指针值,这个值在远程进程的地址空间中是没有意义的。所以我们需要使用VirtualAllocEx()函数在远程进程中先分配一段空间,用于直接写入我们的DLL路径。函数原形:LPVOID VirtualAlloc
18、Ex(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect);hProcess:申请内存所在的进程句柄。lpAddress:保留页面的内存地址;一般用NULL自动分配 。dwSize:欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍。我们这里的实际代码为:/在远程进程中分配内存,准备拷入DLL路径字符串/取得当前DLL路径charDllPath260;/Windows路径最大为GetCurrentDirectoryA(260, DllPath);/获取当
19、前进程执行目录printf(Proces*e Directory is %sn, DllPath);strcat(DllPath,.DebugMyDLL.dll);/链接到DLL路径LPVOID pRemoteDllPath = VirtualAllocEx(hRemoteProcess, NULL, strlen(DllPath) + 1, MEM_COMMIT, PAGE_READWRITE);if(pRemoteDllPath = NULL)printf(VirtualAllocEx errorn);return-3;lWriteProcessMemory()我们利用该函数直接向远程进程
20、中分配好的空间中写入DLL路径字符串BOOL WriteProcessMemory(HANDLE hProcess,/进程的句柄,是用OpenProcess打开的LPVOID lpBaseAddress,/要写入的起始地址LPVOID lpBuffer,/写入的缓存区DWORD nSize,/要写入缓存区的大小LPDWORD lpNumberOfBytesWritten/这个是返回实际写入的字节。);我们这里的实际代码为:/向远程进程空间中写入DLL路径字符串printf(DllPath is %sn, DllPath);DWORD Size;if(WriteProcessMemory(hRe
21、moteProcess, pRemoteDllPath, DllPath, strlen(DllPath) +1, &Size) = NULL)printf(WriteProcessMemory errorn);return-4;printf(WriteRrmoyrProcess Size is %dnn, Size);5、 程序源码FDLL源码:#include#include#includeBOOL APIENTRY DllMain(HINSTANCE hInstDll, DWORD fdwReason, PVOID fImpLoad)switch(fdwReason)caseDLL_PR
22、OCESS_ATTACH :/The DLL is being mapped into the processs address space./DWORD ThreadId;/CreateThread(NULL, NULL, MessageThread, NULL, NULL, &ThreadId);MessageBox(NULL, LDLL has been mapped!, L1st RemoteThread, MB_OK);/打开文件,定义文件指针,指定打开方式为写+追加FILE *fp = fopen(C:test.txt,w);/打开方式参数为字符串/文件读写函数:/读写字符:get
23、c(), putc();读写字符串:fgets(), fputs()/向标准输入输出读入写出:/getchar(), putchar();gets(0, puts(0;fputs(一个DLL测试文本n, fp);/printf(Test finishedn);/关闭文件指针,释放内存fclose(fp);caseDLL_THREAD_ATTACH:/A Thread is being created.MessageBox(NULL, LRemoteThread has been created!, L2nd RemoteThread, MB_OK);break;caseDLL_THREAD_D
24、ETACH:/A Thtread is exiting cleanly.MessageBox(NULL, LRemoteThread exit!, L13rd RemoteThread, MB_OK);break;caseDLL_PROCESS_DETACH:/The DLL is being ummapped from the process address spaceMessageBox(NULL, LDLL has been unmapped!, L4th RemoteThread, MB_OK);break;returnTRUE;/Used only for DLL_PROCESS_A
25、TTACHFRemoteInjectExe.cpp#include#include#include#include#includeexternintListProcess();externintEnableDebugPriv(constWCHAR *);int_tmain(intargc, TCHAR *argv, TCHAR *env)/为了成功使用CreateRemoteThread()函数,必须:/1.利用OpenProcess()获得远程进程的句柄/2.利用VirtualAllocEx(),WriteProcessMemory()写入DLL路径字符串/3.获得远程进程中LoadLibr
26、ary()的确切地址/输入进程ID获得进程句柄charYesNo;printf(是否查看当前进程列表获得进程ID: Y or N?);scanf(%c, &YesNo);Sleep(250);if(YesNo =Y| YesNo =y)ListProcess();printf(请输入要注入的进程ID【表示自身进程】:n);DWORD dwRemoteProcessId;scanf(%d,&dwRemoteProcessId);/如果输入“”表示向自身进程注入if(dwRemoteProcessId = 0)dwRemoteProcessId = GetCurrentProcessId();/获
27、得调试权限if(EnableDebugPriv(SE_DEBUG_NAME)printf(Add Privilege errorn);return-1;/调用OpenProcess()获得句柄HANDLE hRemoteProcess;if(hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId) = NULL)printf(OpenProcess errorn);printf(Error Code:%dn,GetLastError();system(pause);return-2;/在远程进程中分配内
28、存,准备拷入DLL路径字符串/取得当前DLL路径charDllPath260;/Windows路径最大为GetCurrentDirectoryA(260, DllPath);/获取当前进程执行目录printf(Proces*e Directory is %sn, DllPath);strcat(DllPath,.DebugMyDLL.dll);/链接到DLL路径LPVOID pRemoteDllPath = VirtualAllocEx(hRemoteProcess, NULL, strlen(DllPath) + 1, MEM_COMMIT, PAGE_READWRITE);if(pRemo
29、teDllPath = NULL)printf(VirtualAllocEx errorn);return-3;/向远程进程空间中写入DLL路径字符串printf(DllPath is %sn, DllPath);DWORD Size;if(WriteProcessMemory(hRemoteProcess, pRemoteDllPath, DllPath, strlen(DllPath) +1, &Size) = NULL)printf(WriteProcessMemory errorn);return-4;printf(WriteRrmoyrProcess Size is %dnn, Si
30、ze);/获得远程进程中LoadLibrary()的地址LPTHREAD_START_ROUTINE pLoadLibrary = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(kernel32.dll),LoadLibraryA);if(pLoadLibrary = NULL)printf(GetProcAddress errorn);return-5;elseprintf(LoadLibrarys Address is 0x%xnn, pLoadLibrary);/启动远程线程DWORD dwThreadId;HANDLE hThread;if(hThread = CreateRemoteThread(hRemoteProcess, NULL, 0, pLoadLibrary, pRemoteDllPath, 0, &dwThreadId) = NULL)printf(CreateRemoteThread errorn);retu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年眼科护理不良事件上报摸底试卷及答案
- 2026年公务员招考申论城市记忆传承保护模拟试卷及答案
- 蓝色卡通风幼儿园网络安全知识宣传班会课件
- 口服抗血栓药物患者发生创伤大出血的诊治共识
- 国家开放大学测量学核心内容精简版
- 2026年全国中小学生安全知识网络竞赛试题及参考答案
- 2026年国家注册内部审计师CIA《内部审计基础知识》真题卷(后附答案解析)
- 2026年吉林省检察官、法官入员额考试真题(附答案)
- 2026年初级低压电工考试试题库及答案解析
- 2026年秋季学期统编版小学语文六年级上册教学计划附进度表
- 2026年中秋国庆节前安全教育培训
- 第4课 夺取胜利的解放战争 第2课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 药物临床治疗学试题及答案2026年版
- 新生儿体温调节与护理
- 放射科CT检查辐射安全防护措施
- 乡镇街道政府内控制度
- 先天性肌性斜颈诊疗指南
- 门楼雨搭施工方案(3篇)
- 2025四川事业单位考试试题及答案
- 华为员工外派管理办法
- 粮食代烘干协议书
评论
0/150
提交评论