远程线程注入方法CreateRemoteThread
最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理,
需要源码的可以到我的github上下载。
链接是 https://github.com/Arsense/WindowsCode
首先先来说说什么是注入,为什么要注入
0x00 Baise
注入就是把自己的Dll注入到人家的代码中,被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该
向某个进程注入DLL时的方法主要有以下三种:
- 创建远程线程(CreateRemoteThread() API)
- 使用注册表(AppInit_DLLs值)
- 消息钩取(SetWindowsHookEx())
1.CreateRemoteHook 实际上是个比较简单的HOOK
下面看HOOK的步骤
技术向目标程序增加或修改某些功能
0×01 远程线程注入方法CreateRemoteThread
1. 使用VirtualAllocEx在目标进程的地址空间中创建一块我们DLL所在路径长度的内存空间。
2. 使用WriteProcessMemory将DLL路径写入分配的内存。
3. 一旦DLL路径写入内存中,再使用CreateRemoteThread(或者其他无正式说明的功能),它再调用LoadLibrary函数将DLL注入目标进程中。
0×02 Windows功能的暗点
在Windows中无正式说明的功能是指在微软当中没有详细文档介绍其信息的这些功能。这样在使用这些功能就会存在一些问题。最明显的问题就是没有一个特定功能的文档。不过在 ReactOS项目中对许多这种功能做了文档说明,而这篇文章则给了我们最直观的理解。此外在微软没有正式通过的情况先,这些功能可能最终会被“越界”使用。最后呢,他们都需要更多的代码,了解并需要正确使用。
试想一下这些问题,为何要使用这些无正式说明的功能?基本的原因就是自从Vista之后,如果目标进程不在当前会话中而是在一个不同的会话中,那么CreateRemoteThread将会失效。而这些无正式说明功能就不会。当然这个从逆向工程的角度也不会立即就能理解。最后这个只过是在Windows中一些不知名的功能中捣点小乱而已。
在我们的代码中,我们使用CreateRemote 线程和两个无正式说明的函数NtCreateThreadEx 和RtlCreateUserThread。也许你听说过Mimikatz 和 Metasploit。这两个都是使用RtlCreateUserThread来实现DLL注入的。如果你想看这些代码,Mimikatz可以在这里找到,Meterpreter则在这里。需要说明的是Mimikatz的博客是法语,如果有语言障碍则可以看这里。
那么这两个函数该挑选哪一个呢?NtCreateThreadEx是一个系统调用,是用户空间应用和内核打交道的方法。快速在IDA中查通过名字标签找到看一下RtlCreateUserThread。将ntdll.dll拖进IDA中,通过名字标签找到RtlCreateUserThread,
后面会发现发现,RtlCreateUserThread调用NtCreateThreadEx 。因此RtlCreateUserThread应该是NtCreateThreadEx 的封装。我们想调用RtlCreateUserThread是因为NtCreateThreadEx 的系统调用选项可以在Windows版本间改变。因此,RtlCreateUserThread更好用一些。 Mimikatz 和Meterpreter使用RtlCreateUserThread是由于这个选项更加安全。
0×03 代码
对下面的代码进行一些改进,下面使用CreateRemoteThread方法一步步实现上述步骤:
1. 使用VirtualAllocEx在目标进程的地址空间中创建一块我们DLL所在路径长度的内存空间。
//This dll path should be relative to the target process or an absolute path char* dll = "inject.dll"; //We need a handle to the process we will be injecting into HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); //Create the space needed for the dll we are going to be injecting LPVOID lpSpace = (LPVOID)VirtualAllocEx(hProcess, NULL, strlen(dll), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
2.使用WriteProcessMemory将DLL路径写入分配的内存
//Write inject.dll to memory of process int n = WriteProcessMemory(hProcess, lpSpace, dll, strlen(dll), NULL);
3. 一旦DLL路径写入内存中,再使用CreateRemoteThread(或者其他无正式说明的功能),它再调用LoadLibrary函数将DLL注入目标进程中。
HMODULE hModule = GetModuleHandle("kernel32.dll");
LPVOID lpBaseAddress = (LPVOID)GetProcAddress(hModule,"LoadLibraryA");
//Create Remote Thread using the address to LoadLibraryA and the space for the DLL
hThread = CreateRemoteThread(hProcess, NULL, , (LPTHREAD_START_ROUTINE)lpBaseAddress, lpSpace, NULL, NULL);
远程线程注入方法CreateRemoteThread的更多相关文章
- 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程
简介 大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...
- 安全之路 —— 无DLL文件实现远程线程注入
简介 在之前的章节中,笔者曾介绍过有关于远程线程注入的知识,将后门.dll文件注入explorer.exe中实现绕过防火墙反弹后门.但一个.exe文件总要在注入时捎上一个.dll文件着 ...
- 【windows核心编程】使用远程线程注入DLL
前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写. 示意图如下: ...
- 详细解读:远程线程注入DLL到PC版微信
一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一个 LoadLibrary() 函数,可以 ...
- 远程线程注入dll,突破session 0
前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...
- windows-CODE注入(远程线程注入)
远程线程注入(先简单说,下面会详细说)今天整理下代码注入(远程线程注入),所谓代码注入,可以简单的理解为是在指定内进程里申请一块内存,然后把我们自己的执行代码和一些变量拷贝进去(通常是以启线程的方式) ...
- 远程线程注入DLL突破session 0 隔离
远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...
- 远程线程注入DLL
远程线程注入 0x00 前言 远程线程注入是一种经典的DLL注入技术.其实就是指一个新进程中另一个进程中创建线程的技术. 0x01 介绍 1.远程线程注入原理 画了一个图大致理解了下远程线程注入dll ...
- 远程线程注入突破SESSION 0
远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...
随机推荐
- 利用openURL,在IOS应用中打开另外一个应用
在IOS中,实现一个应用启动另外一个应用,使用UIApplication的openURL:方法就可实现,这里以test跳到test02为例.(需要先创建这两个工程) 注册自定义URL协议(在test中 ...
- 微信小程序登录
一. 小程序不支持cookie会话 1. 通过传递与检验3rd_session来保持会话 2. 3rd_session可以执行'`head -n 80 /dev/urandom | tr -dc A- ...
- svn无法提交
svn无法提交, 错误信息:Commit failed. svn: E200007: CHECKOUT can only be performed on a version resource... 解 ...
- UVa 11495 - Bubbles and Buckets
题目大意:给一个有n个数的序列,通过交换相邻的逆序数使这个序列最终有序,求需要交换的次数. 本来可以用冒泡排序解决,但是n达到105,用冒泡排序会超时,用O(nlogn)的归并排序可以达到要求.< ...
- Iphone安装铃声
PP助手 应用列表中打开铃声多多文档. 5点击铃声下载,找到下载的铃声,按下图所示步骤导出至电脑. 6在PP助手界面内,找到"视频音乐"标签,然后进入视频音乐分类下的铃声分类,点击 ...
- 漂亮的PHP验证码
<?php class Imagecode{ private $width ; private $height; private $counts; private $distrubcode; p ...
- mysql调优 参数说明
原文地址:http://wenku.baidu.com/view/49087bbafd0a79563c1e72c8.html 关键字: mysql *1, 查看 MySQL 服务器配置信息 *1. m ...
- MySQL 替换部分电话号码为000
要做敏感信息剔除,要求又不能全换成同一个号码影响测试,想了几个方法,最终采用替换部分电话号码为000来做到敏感信息覆盖. mysql>update phone setb=replace(b,su ...
- HTML 颜色值
HTML 颜色值 颜色由红(R).绿(G).蓝(B)组成. 颜色值 颜色值由十六进制来表示红.绿.蓝(RGB). 每个颜色的最低值为0(十六进制为00),最高值为255(十六进制为FF). 十六进制值 ...
- PayPal为什么从Java迁移到Node.js
前言 大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因: 开发效率提高一 ...