15.1 DLL注入 目前公开的DLL注入技巧共有以下几种: 1.注入表注入 2.ComRes注入 3.APC注入 4.消息钩子注入 5.远线程注入 6.依赖可信进程注入 7.劫持进程创建注入 8.输入法注入 远程线程注入的方式在于使用一个Windows API函数CreateRemoteThread,通过它可以在另外一个进程中注入一个线程并执行. 实验环境 操作系统:win10_64位 被注入程序:系统自带notepad_32位 工具整理 Procexp : 查看进程模块是否被注入成功的工具…
### 32位:远程线程注入 远程线程注入是最常用的一种注入技术,该技术利用的核心API是 `CreateRemoteThread()` 这个API可以运行远程线程,其次通过创建的线程调用 `LoadLibraryA()` 这个函数动态载入指定的DLL即可实现运行DLL,而`LoadLibrary()`函数在任何一个可执行文件中都可以被调用到,这就给我们注入提供了有效的条件. #include <windows.h> #include <stdio.h> void InjectDL…
今天介绍第三种远程执行shellcode的思路:函数回调: 1.所谓回调,简单理解: windows出厂时,内部有很多事务的处理无法固化(无法100%预料外部会遇到哪些情况),只能留下一堆的接口,让开发人员根据实际情况完善这些事务的处理过程,比如多线程:windows提供了创建线程的接口CreateThread.CreateRemoteThread,线程创建好后干啥了? 当然是执行开发人员个性化的代码了! 所以这些API的参数也预留了开发人员自定义代码的入口: windows内部:不同模块有不同…
https://www.cnblogs.com/theseventhson/p/13199381.html 上次分享了通过APC注入方式,让目标线程运行shellcode.这么做有个前提条件:目标线程是alertable的,否则注入了也不会立即被执行,直到状态改为alertable,但笔者暂时没找到能把目标线程状态主动改为alertable的办法,所以只能被动“听天由命”地等.今天介绍另一种远程线程注入的方式:hook 线程: 先说第一种思路,如下: 核心代码解析如下: 1.用于测试的目标进程:…
int main() { BOOL bFlag = FALSE; char *szDllName = "MSGDLL.dll"; //bFlag = EnablePrivilege(SE_DEBUG_NAME); //返回值为1时代表成功 //得到目标进程句柄 HANDLE hDestProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ); LPTHREAD_START_ROUTINE dwAddr = (LPTHREAD_START_RO…
第2 0章 D L L的高级操作技术 看了下这章的内容,谈不上高级,都是些常用相关,但是还是有一些细节需要注意. 20.1 DLL模块的显式加载和符号链接 如果线程需要调用D L L模块中的函数,那么D L L的文件映像必须映射到调用线程的进程地址空间中.可以用两种方法进行这项操作.第一种方法是让应用程序的源代码只引用 D L L中包含的符号.这样,当应用程序启动运行时,加载程序就能够隐含加载(和链接)需要的 D L L. 第二种方法是在应用程序运行时让应用程序显式加载需要的 D L L并且显式…
前面几篇文章介绍了通过APC注入.进程注入.windows窗口处理函数回调.kernercallback回调执行shellcode,今天继续介绍通过heap Spray(翻译成中文叫堆喷射)执行shellcode的方法: 所谓堆喷射,本质上是在堆上分配空间,然后拷贝shellcode到这里执行,思路和之前分享的驱动隐藏(https://www.cnblogs.com/theseventhson/p/13170445.html)方法类似.不一样的地方在于:这里会申请大量空间(业界常见的是200M)…
https://www.cnblogs.com/theseventhson/p/13218651.html   上次分享了基本的远程注入方法,遗留了一个问题:shellcode执行完后怎么回到线程supend之前的地址继续执行原线程的代码了?当时想的动态获取context中eip的地址,再把push eip 转成机器码,最后放到shellcode的头部.由于shellcode是C3(ret)结尾了,自然会把栈顶的4字节弹出来赋值给EIP,达到回到原线程代码继续执行的目的.但实际操作时,地址往往会…
线程局部存储TLS, Thread Local Storage TLS是C/C++运行库的一部分,而非操作系统的一部分. 分为动态TSL 和 静态TLS 一.动态TLS 应用程序通过调用一组4个函数来使用动态TLS, 这些函数实际上最为DLL所使用. 系统中的每个进程都有一组 正在使用标志(in-use flag), 每个标志可被设置为FREE 或者 INUSE, 表示该TLS元素是否正在使用. 微软平台保证至少有TLS_MINUMUM_AVALIABLE个标志位可供使用, TLS_MINUMU…
当系统创建线程的时候,会为线程栈预订一块地址空间区域,并给该区域调拨一些物理存储器.默认会预订1MB的地址空间并调拨两个页面的存储器.但是在构建 应用程序的时候可以改变这个默认值 在构建应用程序的时候链接器会把栈的大小写入到exe和dll文件的pe文件头中,当创建线程的时候会根据PE文件头中的大小来预订空间区域.在调用CreateThread或_beginthreadex的时候开发人员可以指定需要在一开始就调拨的地址空间大小和存储器大小. 下面显示了一台页面大小为4KB的机器上线程栈的地址空间区…