一、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 反射注入相关推荐

  1. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言 2. 使用注册表注入DLL 3. 使用Windows挂钩来注入DLL 4. 使用远程线程来注入DLL 5. 使用木马DLL来注入DLL 6. 把DLL作为调试器来注入 ...

  2. DLL的远程注入技术详解

    DLL的远程注入技术详解 2008-12-01 20:28 DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中, 在系统启动的时候,一个EXE程序会将 ...

  3. 后渗透篇:劫持技术(lpk.dll劫持游戏注入【Win7 实例】)

    当你的才华 还撑不起你的野心时 那你就应该静下心来学习 lpk.dll劫持游戏注入 由于 输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索 DLL文件.首先会尝试从当前程序所在的目 ...

  4. python dll注入监听_HOOK -- DLL的远程注入技术详解(1)

    DLL 的远程注入技术是目前 Win32 病毒广泛使用的一种技术.使用这种技术的病毒体通常 位于一个 DLL 中,在系统启动的时候,一个 EXE 程序会将这个 DLL 加载至某些系统进程 (如 Exp ...

  5. DLL的远程注入与远程卸载卸载

    DLL的远程注入与远程卸载卸载 涉及Windows API FindWindow GetWindowThreadProcessId OpenProcess VirtualAlloc WriteProc ...

  6. Kali渗透测试:远程控制被控端免杀及DLL生成、注入反弹

    Kali渗透测试:远程控制被控端免杀及DLL生成.注入反弹 ​ 长期以来,杀毒软件厂商和黑客一直处于博弈的状态,杀毒软件厂商研究了各种检测和清除远程控制被控端的方法,而黑客也在一直致力于研究避开检测的 ...

  7. 安装全局消息钩子实现dll窗体程序注入

    说明{      通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...

  8. DLL 远程线程注入

    远程线程注入 首先 , 这里讲和为注入 , 通俗讲 , 就是把自己的东西强加给别人 也就是在 其他程序的运行的内存空间里面 插入自己的代码 这里提到的远程线程注入 这个算是很常用,也算是用的比较多的一 ...

  9. Win7下实现 lpk.dll劫持游戏注入

    由于输入表中只包含DLL名而没有它的路径名,因此加载程序必须在磁盘上搜索DLL文件.首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个 ...

最新文章

  1. PHP之使用网络函数和协议函数
  2. Windows核心编程 第十七章 -内存映射文件(下)
  3. 网络001 交换机基本配置
  4. java编译的语句_在Java语言中,下列语句能通过编译的是()。
  5. POPUP_GET_VALUES
  6. 【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
  7. JS之 if语句函数 对接事件动作 函数更改css css对接需要换妆的区id或class
  8. vitualbox命令操作VBoxManage
  9. PTA编程总结3:抓老鼠
  10. Delphi窗体显示Echarts图表
  11. Silverlight图片处理——(伸展,裁剪,蒙版)
  12. mysql 创建外键语句,MySQL 创建主键,外键和复合主键的语句 | 很文博客
  13. Python--随机森林模型
  14. 读书笔记-《20世纪最伟大的心理学实验》读后感1
  15. 我怎样从珍爱网拿回18800会员费:交友平台相亲不靠谱
  16. html网页文字链接的若干问题
  17. 清明节---山东又叫寒食节--吃冷食
  18. 城市选择插件 V-Distpicker 组件详解以及全套用法
  19. 【FineReport】--填报报表
  20. R语言可视化探索BRFSS数据并逻辑回归Logistic回归预测中风

热门文章

  1. 通过options探测服务器信息,OPTIONS 方法在跨域请求(CORS)中的应用
  2. 工控设备 如何将数据发送到串口_实现4G无线通信透传的远程通信多组网5个PLC相互交换数据...
  3. DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
  4. Keras之ML~P:基于Keras中建立的回归预测的神经网络模型(根据200个数据样本预测新的5+1个样本)——回归预测
  5. Python自定义:粒子群优化算法
  6. AtCoder Regular Contest 092 Two Sequences AtCoder - 3943 (二进制+二分)
  7. linux下的/dev/shm/ 以及与swap目录的区别【转】
  8. 2019.1.11英语笔记1
  9. 51Nod --1133 不重叠的线段
  10. Java学习手记2——多线程