reflective dll injection 反射注入
一、reflective dll injection 反射注入介绍
网上对反射注入的定义是只通过内存把DLL注入到特定进程中,也就是说整个过程都不涉及文件操作。
优点
规避杀软基于文件系统的检测
不会在进程的DLL链表里留下记录
通过特殊处理,可以使用正常的方式编写DLL,实现shellcode的效果
缺点
- DLL体积较大,相比于shellcode注入,更容易被检测
二、修改dos头,填入精心构造的 bootstrap shellcode
metasploit 实现的bootstrap shellcode非常精妙,它保留了正常DLL的特征
dec ebp ; M
pop edx ; Z
call 0 ; call next instruction
pop ebx ; get our location (+7)
push edx ; push edx back
inc ebp ; restore ebp
push ebp ; save ebp
mov ebp, esp ; setup fresh stack frame
add ebx, 0x???????? ; add offset to ReflectiveLoader
call ebx ; call ReflectiveLoader
mov ebx, eax ; save DllMain for second call
push edi ; our socket
push 0x4 ; signal we have attached
push eax ; some value for hinstance
call eax ; call DllMain( somevalue,
DLL_METASPLOIT_ATTACH, socket )
push 0x???????? ; our EXITFUNC placeholder
push 0x5 ; signal we have detached
push eax ; some value for hinstance
call ebx ; call DllMain( somevalue,
DLL_METASPLOIT_DETACH, exitfunk )
; we only return if we don't set a valid
EXITFUNC
Listing 1: Bootstrap Shellcode.
我这里自己实现了一个更简单的。
将DOS头从MZ标记开始的字节替换为shellcode,功能是跳转到ReflectiveLoader函数
shellcode如下:
E8 00000000 | call $0 | 将下一条指令的地址压栈
58 | pop eax | 将当前指令的地址弹到eax
83E8 05 | sub eax,5 | 减5字节得到第一条指令的地址,得到DLL基址ImageBase
50 | push eax | ImageBase压栈,传给ReflectiveLoader函数
05 00100000 | add eax,1000 | 基址+偏移找到ReflectiveLoader函数地址
FFD0 | call eax | 调用ReflectiveLoader函数
E8 00 00 00 00 58 83 E8 05 50 05 60 15 00 00 FF D0
其中倒数第二条指令 add eax,xx 每次编译后可能都会变,因此指令也要每次修改。
然后,把DLL拉伸成内存镜像的形式,实际上就是遍历节表,把所有的节从文件对齐的位置复制到内存对齐的位置。
这样处理之后,DLL已经初步具备了shellcode的特征,它可以像shellcode一样被执行了,但是还有很多重要的工作没有完成。
三、ReflectiveLoader 函数
需要完成两项工作:
- 修复重定位表
- 修复IAT表
完成这两项之后,就可以调用任意API和自己编写的函数,到此为止,这个DLL在使用上已经和普通shellcode没什么区别了(除了体积比shellcode大得多)。
显然,这样写代码比写shellcode简单多了,shellcode需要时刻注意不能使用全局变量,字符串常量,还不能调用别的函数,所有功能都要在一个函数里完成;而使用反射注入方式编写的DLL,绝大部分代码都是正常编写的,我们只需要写非常少的shellcode以及编写几个用于修正DLL内数据的函数就行了。
extern "C" __declspec(dllexport) void ReflectiveLoader(DWORD dwImageBase)
{// 需要先修复重定位表,因为此时所有硬编码跳转的地址都是错的// ReflectiveLoader可以调用SetNewImageBase是因为编译器使用E8 CALL,这两个函数之间的偏移在编译时就确定了,就不会出错// 如果编译器使用 FF 15 CALL ,就不能这么做了,所以最安全的做法就是把修复重定位表的工作放在ReflectiveLoader里做完// 修复重定位后,就可以调用DLL内的函数和全局变量了SetNewImageBase((LPVOID)dwImageBase, dwImageBase);// 通过PEB获取 LoadLibrary 和 GetProcAddress// 获取这两个函数,待会修复IAT表要用GetLoadlibAndGetproc();// 修复IAT表// 修复IAT表后,就可以调用API了RepairIAT((LPVOID)dwImageBase);// 执行任意正常编写的代码,从这开始就不需要写shellcode了MessageBoxA(0, "Reflective Inject success, now we can call any API normally!", 0, MB_OK);printf("printf test.\n");system("calc.exe");ExitProcess(0);
}
四、注意事项
关闭 C/C++ 常规 支持仅我的代码调试/JMC
这玩意开了的话会在代码里加一些栈溢出校验函数,这些函数会在我们修复重定位IAT之前使用错误的地址,所以必须关掉。
同理,也要把/GS运行时安全检查关掉,这个选项也会加入一些校验函数。这个选项在debug模式下没有影响,release下就会运行时崩溃。
总结一下就是,我们要把所有编译器链接器可能自己添加代码的功能尽可能关掉,不然它们在修复工作开始前就调用,就会出错。
下面给出编写shellcode的典型配置,出自《Rootkit 系统灰色地带的潜伏者 原书第2版》
reflective dll injection 反射注入相关推荐
- Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术
catalogue 1. 引言 2. 使用注册表注入DLL 3. 使用Windows挂钩来注入DLL 4. 使用远程线程来注入DLL 5. 使用木马DLL来注入DLL 6. 把DLL作为调试器来注入 ...
- DLL的远程注入技术详解
DLL的远程注入技术详解 2008-12-01 20:28 DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中, 在系统启动的时候,一个EXE程序会将 ...
- 后渗透篇:劫持技术(lpk.dll劫持游戏注入【Win7 实例】)
当你的才华 还撑不起你的野心时 那你就应该静下心来学习 lpk.dll劫持游戏注入 由于 输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL文件.首先会尝试从当前程序所在的目 ...
- python dll注入监听_HOOK -- DLL的远程注入技术详解(1)
DLL 的远程注入技术是目前 Win32 病毒广泛使用的一种技术.使用这种技术的病毒体通常 位于一个 DLL 中,在系统启动的时候,一个 EXE 程序会将这个 DLL 加载至某些系统进程 (如 Exp ...
- DLL的远程注入与远程卸载卸载
DLL的远程注入与远程卸载卸载 涉及Windows API FindWindow GetWindowThreadProcessId OpenProcess VirtualAlloc WriteProc ...
- Kali渗透测试:远程控制被控端免杀及DLL生成、注入反弹
Kali渗透测试:远程控制被控端免杀及DLL生成.注入反弹 长期以来,杀毒软件厂商和黑客一直处于博弈的状态,杀毒软件厂商研究了各种检测和清除远程控制被控端的方法,而黑客也在一直致力于研究避开检测的 ...
- 安装全局消息钩子实现dll窗体程序注入
说明{ 通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...
- DLL 远程线程注入
远程线程注入 首先 , 这里讲和为注入 , 通俗讲 , 就是把自己的东西强加给别人 也就是在 其他程序的运行的内存空间里面 插入自己的代码 这里提到的远程线程注入 这个算是很常用,也算是用的比较多的一 ...
- Win7下实现 lpk.dll劫持游戏注入
由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件.首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个 ...
最新文章
- PHP之使用网络函数和协议函数
- Windows核心编程 第十七章 -内存映射文件(下)
- 网络001 交换机基本配置
- java编译的语句_在Java语言中,下列语句能通过编译的是()。
- POPUP_GET_VALUES
- 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
- JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class
- vitualbox命令操作VBoxManage
- PTA编程总结3:抓老鼠
- Delphi窗体显示Echarts图表
- Silverlight图片处理——(伸展,裁剪,蒙版)
- mysql 创建外键语句,MySQL 创建主键,外键和复合主键的语句 | 很文博客
- Python--随机森林模型
- 读书笔记-《20世纪最伟大的心理学实验》读后感1
- 我怎样从珍爱网拿回18800会员费:交友平台相亲不靠谱
- html网页文字链接的若干问题
- 清明节---山东又叫寒食节--吃冷食
- 城市选择插件 V-Distpicker 组件详解以及全套用法
- 【FineReport】--填报报表
- R语言可视化探索BRFSS数据并逻辑回归Logistic回归预测中风
热门文章
- 通过options探测服务器信息,OPTIONS 方法在跨域请求(CORS)中的应用
- 工控设备 如何将数据发送到串口_实现4G无线通信透传的远程通信多组网5个PLC相互交换数据...
- DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
- Keras之ML~P:基于Keras中建立的回归预测的神经网络模型(根据200个数据样本预测新的5+1个样本)——回归预测
- Python自定义:粒子群优化算法
- AtCoder Regular Contest 092 Two Sequences AtCoder - 3943 (二进制+二分)
- linux下的/dev/shm/ 以及与swap目录的区别【转】
- 2019.1.11英语笔记1
- 51Nod --1133 不重叠的线段
- Java学习手记2——多线程