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


相关推荐

  • git常见问题之git pull时Please specify which branch you want to merge with.

    git常见问题之git pull时Please specify which branch you want to merge with.

    2022年2月9日
    108
  • tinyXml生成XML文件

    tinyXml生成XML文件1.tinyXMl生成XML文件#include<stdio.h>#include<string>usingnamespacestd;#include”../tinyxml/tinyxml.h”inttest1(){ TiXmlDocumentxml_doc; //添加XML声明 xml_doc.LinkEndChild(n…

    2022年6月5日
    67
  • isnotempty和isnotnull_BlankBlood

    isnotempty和isnotnull_BlankBlood先看看isEmpty和isBlank  从效果来看,当a=””,字符中有空格时,IsEmpty是算他不为空的本质上讲:isEmpty等价于str==null||str.length==0isBlank等价于str==null||str.length==0||str.trim().length==0我们再来看非空:is…

    2022年8月12日
    7
  • 判断一个数是否为素数c#(判断一个数是否为素数的算法)

    C++判断一个数是否为素数算法C++判断一个数是否为素数算法完整源码(定义,实现,main函数测试)C++判断一个数是否为素数算法完整源码(定义,实现,main函数测试)#include<cassert>#include<iostream>template<typenameT>boolis_prime(Tnum){boolresult=true;if(num<=1){return0;

    2022年4月15日
    41
  • Linux服务.NO6——http协议

    Linux服务.NO6——http协议9.http9.1.http概念http协议即超文本传输协议,用于从万维网服务器传输超文本到本地浏览器的传送协议。http是基于TCP/IP通信协议来传递数据的一个属于应用层的面向对象的协议。http协议工作于c/s架构,浏览器作为客户端通过url向http服务端(即web服务器)发送所有请求,web服务器根据受到的请求后,向客户端发送响应。9.2.http特点1.简单快速:客户向服务…

    2025年7月24日
    3
  • avx2指令集对php有用吗,AVX2指令集的作用[通俗易懂]

    avx2指令集对php有用吗,AVX2指令集的作用[通俗易懂]AVX2指令集的作用介绍AVX指令集之前,先要引入一个向量的概念。所谓向量,就是多个标量的组合,通常意味着SIMD(单指令多数据),就是一个指令同时对多个数据进行处理,达到很大的吞吐量。早在1996年,Intel就在X86架构上应用了MMX(多媒体扩展)指令集,那时候还仅仅是64位向量。到了1999年,SSE(流式SIMD扩展)指令集出现了,这时候的向量提升到了128位。SandyBridge的…

    2022年5月29日
    41

发表回复

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

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