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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL最全整理!西安java培训机构排名榜

    MySQL最全整理!西安java培训机构排名榜MySQL为何不选择平衡二叉树既然平衡二叉树解决了普通二叉树的问题,那么mysql为何不选择平衡二叉树作为索引呢?索引需要存储什么让我们想一想,如果我们要把索引存起来,那么应该存哪些信息呢,它应该存储三块信息:索引的值:就是表里面索引列对应的值。数据的磁盘地址(通过磁盘地址找到当前数据)或者直接存储整条数据。子节点的引用:我们需要从根节点往下走,所以需要知道左右子节点的地址。根据这三点,可以有如下大致的一个简单的结构图:上图中数字表示的是索引的值,0x开头的表示磁盘地址,根

    2022年9月25日
    3
  • 银河麒麟v10.1_银河麒麟v10系统

    银河麒麟v10.1_银河麒麟v10系统银河麒麟v10下载(服务器版桌面版)-2022-03-16更新银河麒麟桌面操作系统V10和银河麒麟高级服务器操作系统V10,分别推出了飞腾、鲲鹏、龙芯、申威、海光、兆芯六个版本银河麒麟高级服务器操作系统V10银河麒麟桌面操作系统V10…

    2022年10月16日
    16
  • 广东地区电信官方DNS服务器

    广东地区电信官方DNS服务器以下是广东地区电信官方DNS服务器,简单记录,以备后用!主解析服务器:202.96.128.143202.96.128.68202.105.80.210缓存服务器(亦可作DNS解析之用)cache-b

    2022年7月4日
    59
  • 5G NR SRS (R15)[通俗易懂]

    5G NR SRS (R15)[通俗易懂]一、SRS序列对于SRS序列生成,其延续了LTE中采用的ZC序列,具体公式如下:[参考协议382115.2.2][参考协议382116.4.1.4.2]二、SRS时频资源1.时频资源NR中网络可以为终端配置一个或多个SRS资源集,多个资源集的目的可能是为了上下行多天线预编码,也有可能是为了上下行波束管理。一个SRS资源集内可以包含一个或多个SRS资源,每个SRS资源占…

    2025年8月20日
    7
  • 2021-02-04-scrapy爬虫案例1:爬取博客园新闻版块详情页-基础入门篇[通俗易懂]

    2021-02-04-scrapy爬虫案例1:爬取博客园新闻版块详情页-基础入门篇[通俗易懂]作者:Barranzi_注:本文所有代码、案例测试环境:1.Linux–系统版本:Ubuntu20.04LTS2.windows–系统版本:WIN1064位家庭版所需第三方库安装pillowpipinstallpillow-ihttps://pypi.douban.com/simplemysqlclientpipinstallmysqlclient-ihttps://pypi.douban.com/simple新建scrapy项目

    2022年6月26日
    25
  • Ubuntu镜像名称解释

    Ubuntu镜像名称解释Ubuntu 镜像名称解释例如阿里源中 ubuntu 的镜像前面的 Footer 和 Header 的 Html 文件不用管它 这是非官方镜像特有的 是官方镜像页面的美化文件 MD5SUMS 是 md5 校验表 SHA1SUM SHA256SUMS 性质一样只不过不同方式 打开之后大概是 MD5SUMS 为例 fa0893ffe218 ubuntu 12

    2025年12月14日
    4

发表回复

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

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