dll攻击原理分析

什么是dll

动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式。

这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。

为何有dll

由于进程的地址空间是独立的(保护模式),当多个进程共享相同的库时,每个库都在硬盘和进程彼此的内存存放一份的话,对于早期的计算机来说,无疑是一种极大的浪费,于是windows系统推出了dll机制,dll在硬盘上存为一个文件,在内存中使用一个实例(instance)。

详细如下:

在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,

每个进程都认为自己拥有计算机的整个内存空间,这些假象都是操作系统创造的(操作系统控制CPU使得CPU启用保护模式)。

理论上而言,运行在操作系统上的每一个进程之间都是互不干扰的,即每个进程都会拥有独立的地址空间。比如说进程B修改了地址为0x4000000的数据,

那么进程C的地址为0x4000000处的数据并未随着B的修改而发生改变,并且进程C可能并不拥有地址为0x4000000的内存(操作系统可能没有为进程C映射这块内存)。

因此,如果某进程有一个缺陷覆盖了随机地址处的内存(这可能导致程序运行出现问题),那么这个缺陷并不会影响到其他进程所使用的内存。

什么是dll注入

我们可以利用dll机制来实现进程通信或控制其他进程的应用程序。

所谓的dll注入正是是让进程A强行加载程序B给定的a.dll,并执行程序B给定的a.dll里面的代码,从而达到A进程控制B进程的目的

'''

注意,程序B所给定的a.dll原先并不会被程序A主动加载,但是当程序B通过某种手段让程序A“加载”a.dll后,

程序A将会执行a.dll里的代码,此时,a.dll就进入了程序A的地址空间,而a.dll模块的程序逻辑由程序B的开发者设计,

因此程序B的开发者可以对程序A为所欲为。

'''

什么时候需要dll注入

'''

应用程序一般会在以下情况使用dll注入技术来完成某些功能:

1.为目标进程添加新的“实用”功能;

2.需要一些手段来辅助调试被注入dll的进程;

3.为目标进程安装钩子程序(API Hook);

'''

dll注入的方法

'''

一般情况下有如下dll注入方法:

1.修改注册表来注入dll;

2.使用CreateRemoteThread函数对运行中的进程注入dll;

3.使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll;

4.替换应用程序一定会使用的dll;

5.把dll作为调试器来注入;

6.用CreateProcess对子进程注入dll

7.修改被注入进程的exe的导入地址表。

'''

ps:

杀毒软件常用钩子来进行处理

使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll

ctypes是Python的外部函数库,从Python2.5开始引入。它提供了C兼容的数据类型,并且允许调用动态链接库/共享库中的函数。它可以将这些库包装起来给Python使用。

ctypes.windll.user32下主要用到三个函数,分别是SetWindowsHookEx() 、CallNextHookEx()和

UnhookWindowsHookEx()

消息钩子:Windows操作系统为用户提供了GUI(Graphic User Interface,图形用户界面),

它以事件驱动方式工作。在操作系统中借助键盘、鼠标、选择菜单、按钮、移动鼠标、改变窗口大小与位置等都是事件。

发生这样的事件时,操作系统会把事先定义好的消息发送给相应的应用程序,应用程序分析收到的信息后会执行相应的动作。

也就是说,在敲击键盘时,消息会从操作系统移动到应用程序。

所谓的消息钩子就是在此期间偷看这些信息。以键盘输入事件为例,消息的流向如下:

1.发生键盘输入时,WM_KEYDOWN消息被添加到操作系统的消息队列中;

2.操作系统判断这个消息产生于哪个应用程序,并将这个消息从消息队列中取出,添加到相应的应用程序的消息队列中;

3.应用程序从自己的消息队列中取出WM_KEYDOWN消息并调用相应的处理程序。

当我们的钩子程序启用后,操作系统在将消息发送给用用程序前会先发送给每一个注册了相应钩子类型的钩子函数。钩子函数可以对这一消息做出想要的处理(修改、拦截等等)。多个消息钩子将按照安装钩子的先后顺序被调用,这些消息钩子在一起组成了"钩链"。消息在钩链之间传递时任一钩子函数拦截了消息,接下来的钩子函数(包括应用程序)将都不再收到该消息。

像这样的消息钩子功能是Windows提供的最基本的功能,MS Visual Studio中提供的SPY++就是利用了这一功能来实现的,SPY++是一个十分强大的消息钩取程序,它能够查看操作系统中来往的所有消息。

消息钩子是使用SetWindowsHookEx来实现的。函数的原型如下:

HHOOK WINAPI SetWindowsHookEx(

_In_ int idHook,

_In_ HOOKPROC lpfn,

_In_ HINSTANCE hMod,

_In_ DWORD dwThreadId

);

idHook参数是消息钩子的类型,可以选择的类型在MSDN中可以查看到相应的宏定义。比如我们想对所有的键盘消息做挂钩,其取值将是WH_KEYBOARD,WH_KEYBOARD这个宏的值是2。

lpfn参数是钩子函数的起始地址,注意:不同的消息钩子类型的钩子函数原型是不一样的,因为不同类型的消息需要的参数是不同的,具体的钩子函数原型需要查看MSDN来获得。注意:钩子函数可以在结束前任意位置调用CallNextHookEx函数来执行钩链的其他钩子函数。当然,如果不调用这个函数,钩链上的后续钩子函数将不会被执行。

hMod参数是钩子函数所在的模块的模块句柄。

dwThreadId参数用来指示要对哪一个进程/线程安装消息钩子。如果这个参数为0,安装的消息钩子称为“全局钩子”,此时将对所有的进程(当前的进程以及以后要运行的所有进程)下这个消息钩子。注意:有的类型的钩子只能是全局钩子。

注意:钩子函数应当放在一个dll中,并且在你的进程中LoadLibrary这个dll。然后再调用SetWindowsHookEx函数对相应类型的消息安装钩子。

当SetWindowsHookEx函数调用成功后,当某个进程生成这一类型的消息时,操作系统会判断这个进程是否被安装了钩子,如果安装了钩子,操作系统会将相关的dll文件强行注入到这个进程中并将该dll的锁计数器递增1。然后再调用安装的钩子函数。整个注入过程非常方便,用户几乎不需要做什么。

当用户不需要再进行消息钩取时只需调用UnhookWindowsHookEx即可解除安装的消息钩子,函数的原型如下:

BOOL WINAPI UnhookWindowsHookEx(

_In_ HHOOK hhk

);

hhk参数是之前调用SetWindowsHookEx函数返回的HOOK变量/句柄。这个函数调用成功后会使被注入过dll的锁计数器递减1,当锁计数器减到0时系统会卸载被注入的dll。

这种类型的dll注入的优点是注入简单,缺点是只能对windows消息进行Hook并注入dll,而且注入dll可能不是立即被注入,因为这需要相应类型的事件发生。其次是它不能进行其他API的Hook,如果想对其它的函数进行Hook,你需要再在被注入的dll中添加用于API Hook的代码。

dll注入代码包含两部分,一部分是dll的源文件,另一部分是控制台程序的源代码。

HMODULE Hmod = LoadLibraryA("hookdll.dll");

准备工作

1、最新anocoda3.7

2、提速下载可以改变源

3、安装pywin32,安装时指定安装目录,默认为C:\Python37\Lib\site-packages\

4、安装opencv-python

pip install opencv-python

5、安装pyinstaller,依赖pyin32

pip install pyinstaller

6、ico文件准备好

ps:也可以在线制作

python注入_Python——dll注入相关推荐

  1. 远程代码注入及DLL注入教程(InlineHook)---植物大战僵尸为例

    远程代码注入及DLL注入教程 说明 ​ 本人刚开始学习逆向,不知道有没有动力学下深去,这一块也没有详细的实战教学,学多少就上传多少,希望能给想学的朋友一点帮助吧,本教程想通过植物大战僵尸这一经典游戏来 ...

  2. python hook dll_Python——dll注入

    dll攻击原理分析 什么是dll 动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式. 这些库函数的扩展名是 ".dll".".ocx"( ...

  3. 进程注入之DLL注入

    前言 DLL注入是我在大一的时候接触的一种技术,那时候还不懂,最近结合小程序详细的理解了一下. DLL注入是将代码注入到一个远程进程中,并让远程进程调用LoadLibrary()函数,从而强制远程进程 ...

  4. python模板注入_Python模板注入(SSTI)深入学习

    前言 一直对模板注入似懂非懂的,打算在这篇文章中深入的研究一下模板注入以及在ctf中bypass的办法. Learning 什么是模板&模板注入 小学的时候拿别人的好词好句,套在我们自己的作文 ...

  5. 1.DLL注入相关概念

    DLL注入相关概念 DLL注入与DLL劫持的比较: DLL劫持相当于一个定时的炸弹,只等待可执行文件双击运行,拔出导火线,而DLL注入,目标必须处于运行状态,而且DLL注入很容易被拦截. DLL注入需 ...

  6. 【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

    麻了,之前写的博客全是收藏,没人点赞,来点赞行不行! GitHub同步更新(已分类):DLL_Injection Gitee同步更新(已分类)DLL_Injection 公众号:URLeisure 的 ...

  7. 实战dll注入(原理, 踩坑及排雷)

    摘要 使用vs2019编写注入器程序, 在生成的注入器可用前, 踩了不少坑, 因此记录一下. 本文涉及三种恶意代码注入方法: 直接dll注入, 反射式dll注入, 镂空注入. 之所以选这三种注入方法, ...

  8. python语言编写的DLL注入工具

    一.流程 1.第一步,获取要注入进程快照: 2.第二步,在快照中比对进程名,得到进程PID: 3.第三步,用pid去打开进程获取到句柄: 4.第四步,在要注入的进程内申请一块内存: 5.第五步,把要注 ...

  9. Python并发编程——paramiko远程控制的模块、病毒攻击原理、dll注入、

    文章目录 paramiko模块 作业 攻击原理解析 一.什么是dll 二.为何要有dll 什么是dll注入: 什么时候需要dll注入 dll注入的方法 使用SetWindowsHookEx函数对应用程 ...

最新文章

  1. PHP微信公众号开发插件,基于ThinkCMF1.5.0开发的微信公众号插件
  2. shell脚本编程基础(1)及RAID阵列
  3. VS2012编译PCL1.70的过程
  4. Android之面试题总结加强版(一)
  5. (四)十大经典排序算法(动画图解,代码完全)
  6. VSTA InfoPath如何实现下拉列表联动
  7. g30u盘启动 中科曙光1620_曙光超融合一体机,让用户业务上云更简单
  8. 如何在 Mac 上使用任务控制空间?
  9. 参加一场 Google IO 需要多少资金?
  10. 工业互联网平台基本架构
  11. EF There is already an open DataReader associated with this Command
  12. 计算机美术设计基础教案,电脑美术美术教案
  13. Windows环境下edge浏览器点击下载没有反应
  14. c语言 pause,C语言中的pause()函数和alarm()函数以及sleep()函数
  15. SEO人员,如何保持创新思维?
  16. php破解referer防盗链解析,Referer原理与图片防盗链实现方法详解
  17. iTron3学习笔记(一) System Calls of Memory Pool Management Functions
  18. 改变exe文件图标的方法
  19. 已经围上为何不算目_有答案的小学语文教师教材过关考试模拟试卷1
  20. 机器人(ROS)理实融合课程设计与开展

热门文章

  1. 小红书自营店入驻需要哪些资料,难不难
  2. html 数组为空 报错,php 判断数组是否为空的几种方法
  3. 使用ZipOutputStream实现web端批量下载文件到浏览器
  4. 企业级服务器内存位置,真相!企业级内存条到底牛在哪儿?
  5. .NET 6 实现敏感词过滤
  6. cruise软件模型,混动仿真模型,cruise与simulink联合仿真模型
  7. python应用如何实现升级_一种基于Python实现BMC批量升级的方法与流程
  8. 计算机图形学第二次作业:画三角形
  9. 自制2.4G ELRS接收机,不需要打板,容易制作
  10. pop3接收邮箱/pop3_ssl接收邮箱