我是靠谱客的博主 安详月饼,这篇文章主要介绍远程线程注入,现在分享给大家,希望可以做个参考。

声明一下:这里的技术在Win10中对于系统的应用例如自带的计算器、(除非是以管理员身份运行程序的)记事本已经不起作用。就是运行程序时候选择以管理员身份运行或者在项目属性-》链接器-》清单文件-》UAC执行级别改成highestavailable就可以注入了。

在dll文件中写一个MessageBox()就会有弹窗出现。

这里的 远程线程,并不是指跨计算机的,而是跨进程的,简单地说就是进程A要在进程B中创建一个线程。

无论是木马或者病毒,如果它们是EXE文件的话,运行时必定会产生一个进程,这样很容易被发现,为了不被发现,在编写病毒或者木马时,可以选择将其编写为DLL文件。DLL文件的运行不会单独创建一个进程,它的运行会被加载到进程的地址空间中,这一样以来,其隐蔽性相对较好。而人家进程本身不会加载额外的DLL文件,所以就需要强制的手段-》远程线程。

 

//注意notepade是64位的程序所以dll文件和下边的程序在编写的时候应该用64位

实现DLL远程注入的主要步骤:

1.通过系统进程快照(获得系统中所有的进程名),和想要注入的已知的进程名称匹配来获得该进程ID(因为后边需要通过ID得到进程句柄)

2.利用上一步获得的目标进程ID打开进程

3.在目标进程内存空间中申请大小为Length的内存空间,Length:  .dll 文件的完整路径长度  我建的DLL文件名称是 DLL.lib

4.将想要注入的DLL文件的完整路径写在目标进程中刚才申请的内存空间内。

5.创建远程线程,执行注入 

(1)得到目标进程的ID:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DWORD GetProcId() { char *TargetProcessName="notepad.exe"; //先要打开记事本 //或者一个非授信的事件将程序进程阻塞不让进程结束 BOOL IsOk; PROCESSENTRY32 ProcInfo; //这个结构体的内容包含进程的信息,在下边解释 //获取当前运行进程快照 HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); //填充该结构体的大小 ProcInfo.dwSize = sizeof(ProcInfo); //得到第一个进程 IsOk = Process32First(hSnapShot,&ProcInfo); while (IsOk) { if (_tcscmp(TargetProcessName, ProcInfo.szExeFile)==0) //比较是否是目标进程名称 { return ProcInfo.th32ProcessID; //返回目标进程ID } //继续获得下一个进程快照 IsOk = Process32Next(hSnapShot,&ProcInfo); } return 0; }

PROCESSENTRY32:   需要包含头文件:# include <Tlhelp32.h>  

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct tagPROCESSENTRY32 { DWORD dwSize; //结构体大小 DWORD cntUsage; //此进程的引用计数 DWORD th32ProcessID; // 此进程ID ULONG_PTR th32DefaultHeapID; //进程默认堆ID DWORD th32ModuleID; // 进程模块ID DWORD cntThreads; //进程开启的线程数 DWORD th32ParentProcessID; // 父进程ID LONG pcPriClassBase; // 线程优先权 DWORD dwFlags; //保留参数 CHAR szExeFile[MAX_PATH]; // 进程名称 } PROCESSENTRY32;

(2)注入DLL

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
VOID InjectDll(DWORD TargetProcId,char *DllName) { //如果自己的程序时ANSCII就用LoadLibraryA,如果是UNICODE版本就获得LoadLibraryW函数 char *pFunName = "LoadLibraryA"; //LoadLibrary 是一个宏 而不是一个真正的函数 所以这里要确切的函数地址 //指定获取LoadLibraryA的地址还是LoadLibraryW的地址 //打开目标进程 HANDLE hTargetProc = OpenProcess(PROCESS_ALL_ACCESS,FALSE,TargetProcId); if (hTargetProc == NULL) { return; } //获得 完整的 DLL文件路径长度 int DllLength = strlen(DllName)+sizeof(char); //‘’ //在目标进程中申请DllLength大小的内存空间 //返回值是申请的地址 第二个参数是要申请的位置一般NULL 最后一个参数是内存属性 可读可写 PVOID pDllAddress = VirtualAllocEx(hTargetProc,NULL,DllLength,MEM_COMMIT,PAGE_READWRITE); if (pDllAddress == NULL) { CloseHandle(hTargetProc); return; } //DWORD ActWriteNum = 0; SIZE_T ActWriteNum = 0; //将完整的 DLL文件路径写入 目标进程中申请的内存 空间 WriteProcessMemory(hTargetProc,pDllAddress,DllName,DllLength,&ActWriteNum); //获得LoadLibraryA的函数地址 FARPROC pFunAddress = GetProcAddress(GetModuleHandle("kernel32.dll"),pFunName); //创建远程线程 //等价于 在 目标进程执行 LoadLibraryA("F:\NewDemo\Debug\DLL.dll") 加载该DLL HANDLE hRemoteThread = CreateRemoteThread(hTargetProc,NULL,NULL, (LPTHREAD_START_ROUTINE)pFunAddress, pDllAddress,0,0); WaitForSingleObject(hRemoteThread,INFINITE); CloseHandle(hRemoteThread); CloseHandle(hTargetProc); }

(3)测试:

在dll文件中这样写:

 

 

 

 

操作该注入工程的第三方项目中main函数:

复制代码
1
2
char *DllName = "F:\NewDemo\Debug\DLL.dll"; InjectDll(GetProcId(),DllName);

运行后:

 

最后

以上就是安详月饼最近收集整理的关于远程线程注入的全部内容,更多相关远程线程注入内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部