windows DLL注入之注册表注入

windows DLL注入之注册表注入windows下的注入之注册表注入:1.概念介绍:注入与Hook:注入与hook经常被人们混淆,其实注入和hook是两种windows下的编程技术(当然,其他平台也有相关的技术),由于在安全编程中,两项技术经常被同时结合起来使用,所以常常导入混淆。今天我们就谈谈windows下的注入技术。1.1Hook:hook的中文名叫钩子,hook是程序设计中最为灵活多变的技巧之一,hook对指…

大家好,又见面了,我是你们的朋友全栈君。

windows下的注入之注册表注入:

1.概念介绍:

注入与Hook:注入与hook经常被人们混淆,其实注入和hook是两种windows下的编程技术(当然,其他平台也有相关的技术),由于在安全编程中,两项技术经常被同时结合起来使用,所以常常导入混淆。今天我们就谈谈windows下的注入技术。

1.1 Hook:
hook 的中文名叫钩子,hook 是程序设计中最为灵活多变的技巧之一,hook对指定的进程 API 设置钩子,当指定的API 在调用的情况下,执行自己定义的钩子回调函数,同样实现的代码逻辑的改变(代码逻辑改变或者代码控制权的获取是黑客编程的根本目的,代码控制权被恶意代码获取,就会执行恶意代码中的逻辑),hook 我自己更愿意理解为一种机制,类似于中间人攻击(第三个人在通信的甲方与乙方之间,获取了通信的内容,并构造了假消息发送给甲或者乙方,从而对甲方或者乙方进行欺骗),hook技术也分为很多种(具体以后介绍)。windows中,hook有两种含义:

1.1.1 windows 系统提供的消息 hook 机制
​ 由系统提供的消息钩子机制是由一系列的 API 提供的一种服务,这个系列的 API 可以完成对大多数应用程序的关键节点的函数API 或者消息做 hook 操作,为此,windows 为美中 hook 类型维护了一个钩子链表,我们可以通过一个系统 API 来完成对整个系统中所符合此机制的函数 API 或者消息 hook。

1.1.2 自定义的 hook 编程技巧
自定义的 hook 编程技巧是不使用 windows 下的 API, 在基于特定系统结构、文件结构、汇编语言的一种高级技术。
以下用一个表格来对个中hook(按照技术本质,不按照技术实现的具体细节)做一个分类:

windows提供的消息hook
hook 技术
自定义hook inline Hook
EAT hook(用户层hook),IAT hook(用户层hook),SSDT hook(内核层hook)

以上是对hook的介绍,具体的技术实现其他博文中讲解。

2.注入:
注入(windows下的注入多指的是DLL的注入,也有代码片段的注入),DLL注入指的是将一个DLL文件注入到目标进程的进程空间(空间大小与运行平台有关),windows 32平台下,进程的虚拟内存空间通常是4GB,高2GB是系统内核空间(使用3ring API无法操作,需要提权技术),低2GB是用户态空间,用户态空间是程序员使用 3ring API 可以进行操作。DLL 注入技术最开始是用来满足程序员其他第三方的应用程序进行功能扩展的愿望,通俗的说:就是别人开发的程序,自己想要在这个程序上添加一下额外的功能,那么自己写一个 DLL 文件,DLL中实现了自己想要的功能,然后在程序运行的时候加载这个 DLL ,并调用里边的方法,使得原来的程序功能得到扩展。但是,技术出发点是好的,慢慢就会被别有用心的人用来做坏事,在 DLL 中写恶意代码,注入到计算机上的其他进程,结合 hook 技术,可以干很多的坏事。

2.1 :DLL 注入的几种技巧或者方法:
a) 注册表注入
b) ComRes 注入
c) APC 注入
d) 消息钩子注入
e) 远程线程注入
f) 依赖可信进程注入
g)劫持进程创建注入
h) 输入法注入

3 .DLL注册表注入技术的具体实现案例:

3.1 注册表注入的原理:
在windows系统中,整个系统的配置都保存在了注册表中,我们通过修改注册表中的配置来改变系统的行为,也可以改变某个进程的某些行为。当windwos中创建的进程,当User32.dll 被映射到这个进程中时,User32dll会收到 DLL_PROCESS_ATTACH通知,当User32.dll对这个通知进行处理的时候,会读取注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows 对应的值,并且调用 Loadlibrary 来载入这个字符串中指定的每个 DLL的时候,会调用每个DLL中的DLLMain函数,并将参数 fdwReason 的值设置为 DLl_PROCESSS_ATTACH,这样每一个DLL就能对自己进行初始化。由于注册表项中的DLL 在进程创建的早期就被User32.dll加载到了进程中,User32.dll不会检测每个DLL的载入是否成功,所以调用这些DLL中的函数可能会出问题。

3.2 实验步骤:
在windows桌面,使用 win + r:打开快速运行,输入 regedt32,回车打开注册表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46TOdccb-1573112579696)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573091871950.p在这里插入图片描述ng)]

进入到注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyLxcxrr-1573112579698)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573107745472.png)]在这里插入图片描述

修改注册表后,重启系统,随意打开一个进程,这里我打开LordPE ,使用PCHunter查看进程空间的模块情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n3a4AivQ-1573112579698)(C:\Users\bsm\AppData\Roaming\Typora\typora-user-images\1573108312734.png)]在这里插入图片描述

至于Dll模块中的代码,可以自行发挥想象。

3.3 注意事项:
在众多的DLL注入方法中,使用注册表注入是最简单的一种方式。但是有一点要注意:
被注入的进程时64位,那么注入的DLL也应该是64位,32位对应32位。
注入32位进程,应该修改的注册表键为:

# 将下面注册表的键对应的值设置为 1
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs 
# 将下面注册表的键对应的值设置为要注入的 DLL的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs 

注入64位进程,应该修改的注册表键为:

# 将下面注册表的键对应的值设置为 1
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs
# 将下面注册表的键对应的值设置为要注入的 DLL的路径
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\Windows\LoadAppInit_DLLs

3.4 注册表注入的缺点:
a) 注册表注入的方法只能将DLL注入到使用了User32.dll的GUI程序中(GUI程序中大多使用了User32.dll)。CUI程序大多不使用User32.dll,所以就不能使用注册表注入。

使用了User32.dll的GUI程序中(GUI程序中大多使用了User32.dll)。CUI程序大多不使用User32.dll,所以就不能使用注册表注入。

b) 注册表注入的方法会将DLL注入到系统中所有使用了User32.dll的所有GUI进程。但是如果我们的DLL中有错误导致崩溃,那么会影响到被注入的所有进程。影响范围会很大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145681.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NET Framework 类库 OleDbCommand 成员

    NET Framework 类库 OleDbCommand 成员公共构造函数OleDbCommand构造函数已重载。初始化OleDbCommand类的新实例。公共属性CommandText获取或设置要对数据源执行的SQL

    2022年5月19日
    40
  • 一代、二代、三代测序技术原理与比较「建议收藏」

    一代、二代、三代测序技术原理与比较「建议收藏」从1977年第一代DNA测序技术(Sanger法)1,发展至今三十多年时间,测序技术已取得了相当大的发展,从第一代到第三代乃至第四代,测序读长从长到短,再从短到长。虽然就当前形势看来第二代短读长测序技术在全球测序市场上仍然占有着绝对的优势位置,但第三和第四代测序技术也已在这一两年的时间中快速发展着。测序技术的每一次变革,也都对基因组研究,疾病医疗研究,药物研发,育种等领域产生巨大的推动作用。在这里我主要对当前的测序技术以及它们的测序原理做一个简单的小结。

    2022年5月17日
    92
  • Linux磁盘阵列

    Linux磁盘阵列一、磁盘阵列1基础知识磁盘阵列(RedundantArraysofIndependentDisks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成一个容量巨大的磁盘组,利用多个磁盘组合在一起,提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。磁盘阵列还能利用同位检查(ParityCheck)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算

    2022年5月25日
    37
  • spring boot框架介绍_Spring框架是什么

    spring boot框架介绍_Spring框架是什么前面的铺垫文章已经连着写了六篇了,主要是介绍了Spring和SpringMVC框架,小伙伴们在学习的过程中大概也发现了这两个框架需要我们手动配置的地方非常多,不过做JavaEE开发的小伙伴们肯定也听说过“约定大于配置”这样一句话,就是说系统,类库,框架应该假定合理的默认值,而非要求提供不必要的配置,可是使用Spring或者SpringMVC的话依然有许多这样的东西需要我们进行配置,这样不仅徒增工作量

    2022年8月12日
    10
  • android开发之做一个竖着的seekbar

    工作繁忙,总想有机会停下来喘口气,整理一下思路,做一些积累,但是这样的机会很少。要做android的界面,基础的要求是熟悉那些内置的组件(prebuilt componments),而有时候这些组件是不够用的,这时候我们就需要自己写一个新的,或者修改内置的。这就要求我们了解更多知识,比如各个View是怎么画出来的,UI上各种事件是如何分发和处理的等等。这些我都计划写出来和大家分享,网络上中文资料,

    2022年3月10日
    39
  • python进阶(1)Lambda表达式「建议收藏」

    python进阶(1)Lambda表达式「建议收藏」Lambda表达式lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数语法函数名=lambda参数:返回值注意点1.函数的参数可以有多个,多个参数之间用逗号隔

    2022年7月30日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号