API Hook); 五、 dll 注入 的方法 一般情况下有如下 dll 注入 方法: 1.修改注册表来 注入 dll ; 2.使用CreateRemoteThread函数对运行中的进程 注入 dll ; 3.使用SetWindowsHookEx 函数对应用程序挂钩(HOOK)迫使程序加载 dll ; 4.替换应用程序一定会使用的 dll ; 5.把 dll 作为调试 器 来 注入 ; 6.用CreateProcess对子进程 注入 dll 7.修改被 注入 进程的exe的导入地址表 当SetWindowsHookEx函数调用成功后,当某个进程生成这一类型的消息时,操作系统会判断这个进程是否被安装了钩子,如果安装了钩子,操作系统会将相关的 dll 文件强行 注入 到这个进程中并将该 dll 的锁计数 器 递增 这个函数调用成功后会使被 注入 过 dll 的锁计数 器 递减1,当锁计数 器 减到0时系统会卸载被 注入 的 dll 。 这种类型的 dll 注入 的优点是 注入 简单,缺点是只能对windows消息进行Hook并 注入 dll ,而且 注入 dll 可能不是立即被 注入 ,因为这需要相应类型的事件发生。
什么是 DLL 注入 由于 注入 的 dll 可以操纵正在运行的进程,因此它为我们提供了向应用程序添加我们想要的任何功能的绝佳机会。这通常在游戏黑客或当您想要对某些东西进行逆向工程并想要更多控制时完成。 这篇文章的目的 这篇文章将介绍如何使用 LoadLibrary 执行基本的 dll 注入 ,然后深入探讨 LoadLibrary 如何在幕后工作,并完成手动映射和将 DLL 注入 进程的步骤。 对于我们的 注入 器 ,我们可以只使用PROCESS_ALL_ACCESS访问权限。 您可以通过任务管理 器 通过转到详细信息并查看进程旁边的 PID 来找到进程 ID,但这需要时间并且不是我们想要的方式。 然而,这对我们的最终目标不起作用,因为我们想使用此代码将 dll 注入 另一个进程。由于我们将此 dll 注入 另一个进程,因此该进程将不得不进行导入解析。 dll 的任何进程中完成,但开始我们只是要像我们的 注入 器 是我们 注入 的进程一样行事。
2核2G云服务器首年95元,GPU云服务器低至9.93元/天,还有更多云产品低至0.1折…
---- DLL 注入 继续学习《逆向工程核心原理》,本篇笔记是第三部分: DLL 注入 ,主要包括三种 DLL 注入 、 DLL 卸载、修改PE、代码 注入 等内容 一、windows消息钩取 钩子(Hook DLL 文件强制 注入 相应进程 3、键盘消息钩取 如下图所示: KeyHook. dll 是个含有钩子过程的 DLL 文件 HookMain.exe是个加载KeyHook. dll ,并使用SetWindowsHookEx 根据上一小节的地址10001020找到钩子 二、 DLL 注入 DLL 注入 :向运行中的其他进程强制插入特定的 DLL 文件,如下图所示 原理:从外部促使目标进程调用LoadLibrary \n", dwPID, DEF_ DLL _NAME); return 0; 四、通过修改PE加载 DLL 上面是在运行的进程中 注入 DLL 本节直接修改目标程序的可执行文件,使其在运行时强制加载 代码 注入 (Code Injection):向目标进程插入独立运行代码并使之运行,一般调用CreateRemoteThread() API 比起 DLL 注入 内存占用更少 难以查找痕迹 不需要另外的
DLL 注入 DLL 注入 原理 dll 注入 实现过程 生成 DLL 手写 dll 注入 器 : APC实现 DLL 注入 反射型 dll 注入 DarkLoadLibrary DLL 注入 原理 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中 所谓的 dll 注入 即是让程序A强行加载程序B给定的a. dll ,并执行程序B给定的a. dll 里面的代码。 -o inject. dll 手写 dll 注入 器 : #include<Windows.h> #include<stdio.h> using namespace std; int main(int 而我们使用通过APC实现 Dll 注入 则可以绕过这种监控。 反射 DLL 注入 可以将加密的 DLL 保存在磁盘(或者以其他形式如shellcode等),之后将其解密放在内存中。
其和CreateRemoteThread一样也是分为两部分, 注入 器 和 注入 的 DLL 。 但是 注入 DLL 的装载由我们自主实现,由于反射式 注入 方式并没有通过LoadLibrary等API来完成 DLL 的装载, DLL 并没有在操作系统中”注册”自己的存在,因此用ProcessExplorer等软件也无法检测出进程加载了该 反射 注入 的流程 注入 器 将要 注入 的 DLL 打开,读进自己的内存空间。(注意不是映射。) 注入 器 提权,打开目标进程,申请内存空间,将 DLL 文件写入目标进程。 注入 器 手动搜索 DLL 的导出表,寻找 DLL 导出的自主实现的ReflectiveLoader函数。 注入 器 创建远程线程,线程启动点为ReflectiveLoader函数, DLL 会加载自身,并执行DllMain。
0×02 注射 器 实现 要实现反射式 注入 DLL 我们需要两个部分,注射 器 和被 注入 的 DLL 。 而注射 器 部分只需要将被 注入 的 DLL 文件写入到目标进程,然后将控制权转交给这个ReflectiveLoader即可。因此,注射 器 的执行流程如下: 在一份源代码编译、链接成为 DLL 时,编译 器 都是假设该 DLL 会加载到一个固定的位置,生成的代码也是基于这一个假设。 线程运行时,其FS段寄存 器 记录了其TEB的位置。 0×04 总结 反射式 DLL 注入 是一种新型的 DLL 注入 方式,它不需要像传统的 注入 方式一样需要 DLL 落地存储,避免了 注入 DLL 被安全软件删除的危险。
DLL 注入 可用于编写外挂和病毒不易发现。 CInjectDllToolDlg::StartInject(char *path, int pid) int pathLen = strlen(path)+sizeof(char);//获取 dll hThread) MessageBox(" 注入 失败", "警告", 0); VirtualFreeEx(hPro, dllAddr, pathLen, MEM_DECOMMIT); CloseHandle 卸载与 注入 流程大体相同,先创建 进程快照找到相应的线程模块,获取FreeLibrary地址,再创建远程线程卸载 void UnInjectDll(char *szDllName, DWORD dwPid OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid); FARPROC pFun = GetProcAddress(GetModuleHandle("kernel32. dll
0x00前言 RT,最近正在学习 DLL 注入 。尝试写篇总结 0x01正文 什么是远程线程 注入 ? 远程线程 注入 是指一个进程在另一个进程中创建线程的技术。 dll 远程线程 注入 的核心是CreateRemoteThread函数,利用该函数可以在个进程空间中创建一个线程。 但是由于Windows引入了基址随机化ASLR安全机制,每次开机or在不同的系统中,系统 DLL 的加载基址都不一样,也就是说 DLL 的导出函数地址也都不一样。 LoadLibrary的地址,最后利用CreateRemoteThread函数创建线程并 注入 进目标的进程当中,最后等待线程结束后释放 DLL 空间并关闭线程。 这样就实现了远程线程 注入 DLL 。
读《Windows核心编程》笔记一 DLL 注入 和API拦截 在Windows中,每个进程相互独立,都有自己的私有的地址空间,程序中使用的指针都是进程自己地址空间的一个内存地址,无法创建也没法使用其他进程的指针 这是最简单的方法,通过系统注册表来达到 注入 DLL 的目的,系统注册表中有个AppInit_DLLs键值,在如下路径: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows 不过这样的 注入 方式只适用于那些GUI程序,因为需要依赖程序是否映射User32. dll ,对于那些终端CUI应用程序则没法使用。 2.使用Windows挂钩 Windows提供的一种机制可以让我们的一个 DLL 注入 到另一个进程的地址空间,那就是安装WH_GETMESSAGE挂钩,例如: HHOOK hHook = SetWindowsHookEx 3.使用远程线程来 注入 DLL DLL 注入 技术唯一的目标就是让别的程序加载我们的 DLL ,这样我们就可以在我们自己的 DLL 中做任何我们想做的事情。
0x0 技术简介 系统:Windows 7 64bit 工具:VS+WDK 驱动 注入 我这里驱动 注入 的技术是:采用驱动向目标进程插入APC执行LdrLoadDll函数加载 Dll 模块。 可以 注入 64位 Dll 到64位进程或 注入 32位 Dll 到32位进程。暂时没有实现跨位数。 APC(异步过程调用)是一种内核机制,它提供了一种在特定线程上下文中执行定制例程的方法。 apc主要用于系统级组件,用于执行各种任务(例如促进I/O完成),但也可以用于 DLL 注入 目的。 0x1 主要思路 R3:加载驱动,打开驱动,控制驱动(发送需要 注入 的进程Pid和要 注入 的 Dll 模块路径给驱动)。 R0:1,通过进程Pid获取EProcess并判断是否为64位进程。 ShellCode,查找可用线程插入执行代码APC,插入警醒线程APC 0x2 主要代码 整体流程部分 初始化ShellCode 查找执行线程 插入APC代码部分 0x3 实现效果 注入 x64 dll 到
对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在 DLL 中实现。 : { g_hDllModule = hModule; break; } case DLL _THREAD_ATTACH: case DLL _THREAD_DETACH . dll 创建c++空项目 编译下面代码,将 Dll 1. dll 放在生成的exe下,运行 hook.cpp: #include <windows.h> #include <stdio.h> typedef / Dll 1. dll "); if (NULL == hDll) { printf("LoadLibrary Error[%d]\n", ::GetLastError()) 可以看到已经 注入 了 Dll 1. dll .sharePic { color:rgb(0, 0, 0);font-size:14px;padding-top:10px;padding-bottom
对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在 DLL 中实现。 对于全局钩子来说,它会影响所有应用程序,所以钩子函数必须在 DLL 中实现。 . dll 创建c++空项目 编译下面代码,将 Dll 1. dll 放在生成的exe下,运行 hook.cpp: #include <windows.h> #include <stdio.h> typedef / Dll 1. dll "); if (NULL == hDll) { printf("LoadLibrary Error[%d]\n", ::GetLastError()) 可以看到已经 注入 了 Dll 1. dll
进程 注入 是将任意代码写入已经运行的进程中并执行,可以用来逃避检测对目标目标进程中的敏感信息进行读/写/执行访问,还可以更改该进程的行为。 通过LoadLibrary 注入 DLL . dll ,动态链接库英文为 DLL ,是Dynamic Link Library的缩写。 DLL 是一个包含可由多个程序,同时使用的代码和数据的库。 那么 Dll 从一开始就可以映射到进程的内存中并执行,所以我们可以利用 Dll 把shell 注入 到进程中。 构造 注入 程序 LoadLibrary是Windows API中的一个函数,它可以将一个 DLL 加载到调用进程和调用的内存中DLLMain(将指定的模块加载到调用进程的地址空间中) HMODULE 使用解决方案资源管理 器 窗口添加/管理文件 // 2. 使用团队资源管理 器 窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4.
学习游戏辅助,根据郁金香的教学视频写了 Dll 注入 的代码,针对热血江湖进行 Dll 注入 ,失败(通过360任务管理 器 查看到 Dll 并未 注入 到游戏进程中)。 但 Dll 中的SetWindowsHookEx返回值不为空,说明Hook成功?但是为啥没有 注入 成功呢? 通过其他方式来验证,首先更换 注入 的目标进程,修改为计算 器 ,发现Hook成功,但通过360任务管理 器 查看到 Dll 并未 注入 到计算 器 进程中。 这时候发现计算 器 是64位的(win7系统自带)——疑问: Dll 是32位,目标进程时64位,在Hook时,也会返回非NULL值?? 更换目标进程为Potplayer播放 器 ,这次终于成功,通过360任务管理 器 查看到 Dll 已 注入 到Potplayer进程中【注意:在用FindWindow函数时,传入的窗口名称不应该是简单的Potplayer
所谓 DLL 注入 就是将一个 DLL 放进某个进程的地址空间里,让它成为那个进程的一部分。要实现 DLL 注入 ,首先需要打开目标进程。 3、将 DLL 文件路径,或者 DLL 文件,复制到目标/远程进程的内存空间 //使用WriteProcessMemory函数将 DLL 的路径名复制到远程进程的内存空间 iReturnCode = WriteProcessMemory GetProcAddress功能是检索指定的动态链接库( DLL )中的输出库函数地址。lpProcName参数能够识别 DLL 中的函数。 LoadLibraryA这个函数是在Kernel32. dll 这个核心 DLL 里的,而这个 DLL 很特殊,不管对于哪个进程,Windows总是把它加载到相同的地址上去。 因此你的进程中LoadLibraryA的地址和目标进程中LoadLibraryA的地址是相同的(其实,这个 DLL 里的所有函数都是如此)。至此, DLL 注入 结束了。
本文主要介绍 dll 注入 的方式,意在描述危险的来源,以及危险的执行的过程,以便于我们解决危险。 这篇文章介绍2大类: 序号 方式 1 调用API 2 直接修改源码 1.调用API 如果要实现 注入 ,那么需要一个目标,一个 DLL ,一个 注入 程序。 因此我们就需要把我们的 dll 加载到内存中。但目前有几个困难。 困难:由于每个应用程序都有自己执行的空间-虚拟空间,我们需要把 dll 注入 的目标空间才行。 我们应该如何找到目标空间呢? 直接修改源码 如果要实现 注入 ,那么需要一个目标,一个 DLL ,一个修改源码的程序。 原理:直接修改应用程序的二进制文件,达到 注入 的目的。 (注:这里只 注入 了 dll ,加壳代码未加) 安全与防护: 到地址什么原因导致了 dll 被加载呢? 我们一步步深入的了解下(贪心算法) 1.
3、调用WriteProcessMemory函数将指定的 DLL 路径写入到目标进程空间。 4、通过CreateRemoteThread函数加载LoadLibrary函数的地址,进行 DLL 注入 。 . dll "; CreateRemoteThreadInjectDll(9956, dllPath); return 0; DLL 代码: 该 DLL 项目由vs2019生成, 注入 后自动弹出消息框 . dll "; ZwCreateThreadExInjectDLL(2940, dllPath); return 0; 执行结果: 0x05 踩坑记录 1、如果 注入 到x64程序,最好 exe、 dll 都编译成x64 2、 注入 dll 需要与 注入 进程的字符集相同,vs2019可以在项目属性->高级处选择字符集(被这里坑了好久,普通session层可以 注入 ,session0 注入 不了,查了好久, 最后一个大佬说字符集要相同,后面将 dll 、exe字符集改成多字符集 注入 成功了)
内存 注入 远远领先于时代,并允许所有 APT 等轻而易举地通过 AV。2015 年,Dan Staples ( @_dismantl ) 发布了RDI的重要更新,称为“改进的反射 DLL 注入 ”。 因此,您需要访问两端( 注入 器 和被 注入 者)的源代码,或者使用已经支持 RDI 的工具。 与 shellcode 注入 相比,RDI 需要大量代码来加载。这会影响隐身性并使stagers更容易签名/监控。 我们现在有一个基本的 PE 加载 器 作为 shellcode。 完成后,blob 看起来像这样: image.png 当从引导程序的顶部开始执行时,一般流程如下所示: 获取内存中的当前位置(引导程序) 计算和设置寄存 器 (引导程序) 使用目标 DLL 的函数哈希、 用例 #1 – 隐秘的持久性 使用服务 器 端 Python 代码 (sRDI) 将 RAT 转换为 shellcode 将 shellcode 写入注册表 设置计划任务以执行基本加载程序 DLL Loader
DLL 注入 方式较多,包括API拦截与替换、消息钩子、远程进程 注入 。通常这些 注入 都是针对第三方程序(下面简称目标程序)的操作。 目标程序主要分为两种,解释型和编译型。 解析型可以在解释权解释之前做很多事情,解释之前的代码不是二进制代码,而是解释 器 可以看懂的代码,比较简单,也比较可行。 编译型则无法在编译前做任何事情,因为目标程序一般是第三方编译完成之后发布出来的。 这种情况下,如果拿不到真正的地址,则即使 注入 到主线程(UI线程)中,依然没有任何作用。除非程序调用的 dll 包含导出函数,我们可以实现函数地址的替换。
Dll 注入 技术之劫持 注入 系统:Windows 7 32bit 工具:FileCleaner2.0 和 lpk. dll 利用Window可以先加载当前目录下的 dll 特性,仿造系统的LPK. DLL 如果这个 DLL 和系统目录下的某个 DLL 同名,导出表也相同,功能就是加载系统目录下的那个 DLL ,并且将导出表转发到那个真实的 DLL 。这时 DLL 劫持就发生了。 ● DLL 劫持的实现● 这一步我们的工作就是通过编程来实现一个LPK. DLL 文件,它与系统目录下的LPK. DLL 导出表相同,并能加载系统目录下的LPK. DLL ,并且能将导出表转发到真实的LPK. DLL 。 实现伪造的LPK. DLL // LPK. DLL 劫持 注入 源码 // 头文件 #include "stdafx.h"