N种内核注入DLL的思路及实现

应用层无痕注入Dll 【代码】应用层无痕注入Dll。 阅读详情
Author :  sudami  [sudami@163.com]
Time  :  01-11-2008
Links  :   http://hi.baidu.com/sudami
 
    内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。
 
    若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同样的技术发现、清除RK,保证用户电脑的正常使用。在此,我将探讨几种内核注入DLL的思路及实现原理。
 
                                          (1) APC 技术
 
    给一个Alertbale的用户态线程插APC,让其执行其中的ShellCode,来执行我们的代码。这个方法简单易行,但是不够稳定,兼容性不好。测试中发现经常出现Explorer.exe等插崩溃的情况,而且有杀软在的情况下,插入有时会被拦截,起不到应有的效果。 (可参考我以前逆过的一个驱动:逆向fuck.sys--编译通过--源码)
   
                 (2) 内核Patch  //KnownDLLs//Kernel32.dll CreateThread
 
     //KnownDLLs 是系统加载时对象管理器加载最新磁盘DLL到内存的,当其他进程想调用某个DLL时,就不用重复从磁盘加载了,而会从这里映射一份到自己的进程空间中去。这样给我们做全局Patch提供了一个很好的机会:
        ZwOpenSection打开 //KnownDlls//kernel32.dll,调用ZwMapViewOfSection映射一份到自己进程空间,然后寻找kernel32.dll在内存中代码节的空隙,选择这里作为我们fake函数的存储Buffer。修改CreateThread函数的开头5字节跳转到这个间隙,当系统任何一个线程创建时,会走到CreateThread函数,然后执行空隙中的ShellCode,其负责调用LoadLibrary加载我们的DLL。DLL一经加载,会发IOCTL通知本驱动,让驱动卸载HOOK。这样就完成了内核注DLL的过程。测试时发现Svchost.exe进程调用CreateThread函数很频繁,所以触发也会很快,基本1秒不到就能将DLL加载进去,而我们的HOOK也卸掉了。所以稳定性提高不少。示意图如下:
hook.gif
Effect.1.gif
   
 
(3) 内核 HOOK ZwMapViewOfSection
 
    有部分模块加载时会调用ZwMapViewOfSection,比如进程创建时映射N份DLL到自己的虚拟空间中去.我们替换SSDT中的这个函数,过滤出是加载Kernel32.dll的情况,从参数中取得其基址,Inline Hook其EAT中的CreateThread函数,跳转到在这个进程虚拟地址空间中申请的Buffer,在其中完成DLL的加载过程.
 
关键API: 
ZwAllocateVirtualMemory ---- 在此进程空间中分配内存,存放Shellcode 
ZwProtectVirtualMemory ---- 使当前内存块具有可读可写属性
IoAllocateMdl ---- 创建MDL
 
关键Code如下:
Tmpcode_show_1.gif 
Tmpcode_show_2.gif
 
    同方法2相比,原理类似。但修改时机不同,效果差不多,只是注入DLL的时间会慢一些。至于Shellcode的编写,就大同小异了.萝卜白菜各有所爱,主要看个人发挥。要是闲写shellcode麻烦,请到看雪学院去查资料,模板很多,在这里就不YY了。
     【看雪读书月】学习ShellCode编写
     [note]一个简单的Shellcode
     shellcode之小小琢磨
     Add_Section
 
(4) 内核  HOOK   NtCreateThread
 
    跟踪进程创建的流程,会很明晰的发现有多点可以patch来实现DLL的注入。
 
    进程创建完时是一个空水壶,里面没有沸腾的热水(threads),于是系统调用NtCreateThread创建其主线程(给空水壶注水 – 凉水),在这个暂停的线程里面折腾了一阵后完事了也厌倦了,于是系统跳了出来,回到进程空间中,调用Kernel32.dll去通知CSRSS.EXE,对它说:“这里有一个新进程出生了,你在你的表里标记一下”。然后就开始加载DLL啦,把系统KnownDLLs中的自己需要的DLL都Map一份到这个大水壶中。接着KiThreadStartup加热水壶中的凉水,于是水就开始沸腾了,此时主线程开始工作。。。
 
    拦截NtCreateThread,取得当前线程上下文,保存它要返回的地址(会回到空水壶中去),劫持为我们自己分配的地址,在其中填充ShellCode来加载目的DLL。至于选择Buffer,思路很多。这里可简单的Attach到当前进程,在充足的虚拟2GB进程地址空间中分配属于你自己的一块小内存,够放ShellCode足矣。示意图如下:
绘图2.jpg
 
 
                   (5) 内核感染常用模块,让感染模块帮我们Load DLL
    这个方法就有点绕远了,开始了最本质最原始的感染,可增加新节,可插空隙,总之,让别人的模块 Load 进内存时顺路的帮我们加载下 DLL , DLL 一旦加载就可以恢复感染,清除痕迹。至于感染代码,网上一堆。只要不是驱动感染驱动(多了个校验和),其他性质都一样,看自己发挥啦。
 
 
          (6)  拦截NtCreateUserProcess、NtCreateSymbolicLinkObject
 
    前者在 Vista 下才有 .  拦截后通过 PsLookupProcessThreadByCid 得到 ETHREAD / EPROCESS, 判断是否是 CSRSS.EXE 引起的,若是则在此进程空间内分配一块内存,调用 NtGetContextThread 得到当前的线程上下文,调用 ZwWriteVirtualMemory 填充 Shellcode 区域,取得 LdrUnloadDll 、 LdrGetDllHandle 等函数地址,通过他们加载 DLL 。然后调用 NtSetContextThread 恢复原始的 Context 。关于这种方法,可参考 DriverDevelop 上某人发的 BIN 。
[”内核实现DLL注入.可以完美绕过KAV瑞星等杀毒软件”]
 
(7) 内核拦截NtResumeThread
(8)NtUserSetWindowsHookEx 注入
 
 
 
顺便提下 R3 上 DLL 的注入 :
  1. CreateRemoteThread (or NtCreateThreadEx (Used in Vista))
  2.SetThreadContext (change the EIP)
  3.NtQueueAPCThread 
4.RtlCreateUserThread
5. SetWindowHookEx
 
 
小结:
 
    纵观进程启动的全过程,可patch的地方很多,只要保证进程、线程上下文不被破坏,注入的手法可多种多样。只要保证我们的DLL注入时间足够短,稳定性足够高即可。当我们迫不得已要从内核注入DLL到用户进程去时,系统已经中毒很深,此时运用类似上面提到的技术来加载DLL,让DLL做我们驱动无法完成的任务,是可以接受的。
 
    上面提到的思路是我暂时想到并且已经实现了的,详细过程可参见代码。欢迎积极探讨更好更稳定而且不邪恶的方法。
 
-----------------------------------------------------------------------------------
参考资料:
1.       Windows Internals---Processes,Threads,Jobs
2.       漫谈兼容内核系列:WINDOWS进程的用户空间
3.       WRK 1.2 ,windbg
    
上传的图像
文件类型: pdfN种内核注入DLL的思路及实现.pdf (2008-11-02 16:53, 557.8 KB, 505 次下载)
使用NtCreateThreadEx将Dll注入目标进程 第一遍学习这个注入方法时候,只知道NtCreateThreadEx是未公开的nt函数,当时要定义一个函数指针出来,好像在看雪上找到的这个函数的声明,,太久远了,记不清了。 在Windows2000的源码和Reactos中都无法找到NtCreateThreadEx的函数声明和实现,所以试了下用IDA看看ntdll的导出表,哇,好开心找到了,但是,,好像什么都没有,只有一个系统调用号,没有任何参数的信息。 我最后在https://securityxploded.com/ntcreatethreadex.php 阅读详情

相关推荐

内存注入dll 无痕迹

内存中 注入dll 需要黑月编译 任何32位进程

无痕注入dll_如何在R3尽量完美的隐藏一个DLL

哈哈哈专栏开通啦!咳咳..这个专栏主要写一些和安全开发的东西,需要一定的相关知识,并且不(定期)更新,恩,就这样主要是前几天群里师傅提出了这个问题,所以就去实现下,现将操作记录与此0x01 从加载开始要注入一个DLL的方法很多,但是我们希望一切在Exe知道之前就能完成(这样最不容易被发现对不),所以NTCreateThread和置换Dll就显得不好使了NTCreateThread创建线程的时间靠后...

weixin_39669761的博客 2608

通过TMS320F28335学习DSP的开发流程——28335的基础知识(1)

1、TMS320F28335内核的主要特点 ①F28335 DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28335能够在一个周期内完成32x32位的乘法累加运算,或者两个16x16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成 ②快速的中断响应 ③可在任何内存位置进行单周期读、修改、写操作 ④可采用C/C++编程软件,效率非常高 2、处理器的主要资源 ①32位浮点DSP,主频是150MHz,方便电机控制、电力设备控制及工业控制等。 ②片上存储器:FLASH–

Kayboy的博客 2万+

无痕注入dll_[讨论]是什么留下了注入DLL的痕迹?

很普通的用VirtualAllocEx和CreateRemoteThread对目标进程A注入了自己的dll。在Loader.exe退出之后,再运行一个检测程序B,依然被检测出了Loader.exe的存在并且给出了文件路径,而且改名了Loader.exe都没有用,显然是留下了File Object的痕迹。而且考虑到检测程序是在Loader已经执行完退出之后才运行的,那么应该是VirtualAlloc...

weixin_29131709的博客 1405

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解(一)查看当前 locale 设置(二)查看当前系统所有可用 locale(三)设置系统的 locale 命令介绍 locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。 通过 locale 来设置程序运行的不同语言环境,locale 由ANSI C提供支持。locale 的

liaowenxiong的博客 3万+

C# 开发 ACS 运动控制系统:从入门到高阶应用实践

起始位置</param>/// <param name="endPos">结束位置</param>/// <param name="maxVelocity">最大速度</param>/// <param name="maxAcceleration">最大加速度</param>/// <param name="maxJerk">最大加加速度

品质生活,极致编程。 2843

Hook : N种内核注入DLL的思路及实现

内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。

it技术学习 2402

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2395

《N种内核注入DLL的思路及实现》

Author : sudami [sudami@163.com]Time : 01-11-2008Links :http://hi.baidu.com/sudami 内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件...

weixin_30302609的博客 145

从FPGA/ASIC工程师视角看DDR:手把手拆解Memory Controller、PHY与DRAM芯片的协作流程

本文从FPGA/ASIC工程师视角深入解析DDR内存子系统,详细拆解Memory Controller、PHY与DRAM芯片的协作流程。通过系统架构分解、接口标准解析和实战调试技巧,帮助工程师优化DDR性能并解决常见问题,涵盖地址映射、命令调度、时序校准等关键技术要点。

weixin_42548888的博客 458

《QT+PCL》点云配准进阶——GROR配准

GROR点云配准

阁楼 1318

N种内核注入DLL的思路及实现(转自http://devil209.blog.163.com/blog/static/50820980201041391645319/)

<br />内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 <br />    若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用

zhuerhua的专栏 857

OPTEE常见13类问题与解答

OPTEE常见13类问题并解答

AI-安全-功耗 1204

内核注入

<br />内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能 干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要 驱动中去做的事,进程 / DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。<br /><br /> 若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时

wowbell的专栏 1642

isaaclab无法识别NVIDIA显卡,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1147

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

内核层注入的N种方法

内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。

o330820350的专栏 4587

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Session注入

在进行Dll注入的时候,我们发现没法注入一些系统进程提示我们缺少权限或者拒绝访问,甚至干脆就是什么反应都没有这时候我们考虑往更加底层去跟函数,我们不能再使用在用户层所给我们的函数,我们自己去寻找内核层的函数。

m0_68259687的博客 1226

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: MS08-066 Microsoft Ancillary Function Driver Elevation of Privilege exploit
下一篇: Reversing MFC App Modified(通用 查找MFC消息事件
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值