硬件安全与恶意代码: Linux Hooking(钩子)机制原理与实现

2 篇文章 0 订阅
1 篇文章 0 订阅

Hooking简介

Hooking技术是一系列技术的通称,通过拦截在软件构件之间传递的 函数调用(function calls)/信息(messages)/事件(events) 来改变OS, 应用(application)或者其他软件构件的行为. 譬如改变准备调用的函数指针使之指向需要的hook函数,在执行了hook函数之后再返回原来的函数指针。

当我们试图用一段代码来分析程序中某段逻辑路径被执行的频率,或者想要在其中插入更多功能时就会用到钩子.
通过Hook, 我们可以暂停系统调用,或者通过改变系统调用的参数来改变正常的输出结果,甚至可以中止一个当前运行中的进程并且将控制权转移到自己手上.
这种用来实现hooking技术的代码叫做hook(钩子).

调试(debugging)
拓展函数功能

  • 拦截键盘/鼠标信息
  • 拦截操作系统调用
  • 度量3D游戏帧率

恶意代码(rootkits)

Hook实现的一般方法

1.在应用运行之前更改源

通过逆向工程修改可执行文件或者库,通常用来拦截函数调用,从而监控或者完全替换掉调用

1.1

通过反汇编器,可以找到在一个模块里面的函数入口点。更改入口点从而动态地加载我们需要的库

1.2

修改可执行文件的入口表
入口表修改之后可以加载任何附加的的库模块,同时在应用程序调用函数时修改外部代码的调用

1.3

通过包装库(wrapper library)拦截函数调用。
包装库:满足所有原库可调用的函数,并附加了自己的实现

2.运行时(runtime) 修改

操作系统和会提供途径让我们在运行时很容易地插入hook(需要插入hook的进程有足够的权限)
当操作系统没有提供这一功能时。可以使用修改内存中的中断向量表,入口描述符表的方法(对于有共享库的操作系统)。(实质上这种办法也是修改代码,只是在运行时更改进程内存中的指令和结构).
Unix系统用LD_PRELOAD环境变量轻松地实现了函数重载,当你在创建了一个已经存在的共享函数库中的函数时,你会在DYLD_INSERT_LIBRARIES注册你自己的函数,这样就会调用自己的函数了。

Linux的Hook应用

ptrace(在执行系统调用之前)

linux下系统调用hook机制主要靠下面两个机制
LD_PRELOAD机制:允许用户手动指定使用的动态链接库,将系统库函数hook->lib.so.6
dlyopen,dlsym: 通过句柄和连接符名称获取真实库函数名或者变量名

ptrace由linux操作系统内核提供,可观察和控制其他进程的执行, 并且可以检查和修改其内核镜像和寄存器. 通常用来
作为调试器(例如gdb)或用来跟踪各种其他系统调用.

ptrace追踪示意图
系统追最常见流程

一个使用gdb调试,修改printf打印内容的例子
https://www.linuxidc.com/Linux/2012-04/57910p5.htm

pcileech3.7中的钩子

https://github.com/ufrisk/pcileech
to do

基础知识补充

Rootkit

Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层,每一层只能访问本层以及权限更低层的数据。

这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层——R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情,而所谓的rootkit也就随之而生了。

rootkit是一组计算机软件(通常为恶意),旨在允许访问计算机或其软件的某个不允许访问的区域(例如未经授权的用户访问),并常常隐藏其存在。

Rootkit安装可以自动化,或者攻击者可在获得root或管理员访问权限后安装rootkit。获得这种访问权是直接攻击系统的结果,即利用已知的漏洞(如特权升级)或密码(通过破解或“网络钓鱼”之类的社会工程策略获得)。一旦安装,就可以隐藏入侵并维护特权访问(关键是root或管理员的特权)。对一个系统的完全控制意味着可以修改现有的软件,包括可能被用来检测或绕过它的软件。

Rootkit检测是困难的,因为Rootkit可能会阻碍自己可能被检测到的途径。检测方法包括使用可信操作系统、基于行为的方法、签名扫描、差异扫描和内存转储分析等等。删除可能很复杂,或者实际上是不可能的,特别是在rootkit驻留在内核中的情况下;重新安装操作系统可能是解决这个问题的唯一可行方案。当处理固件rootkit时,删除可能需要更换硬件。

共享库(shared library)

共享库是可以在执行过程中加载到与进程关联的内存空间中的代码对象。库代码可以在内存中由多个进程共享,也可以在磁盘上共享。如果使用虚拟内存,进程执行相同的RAM物理页面,并映射到每个进程的不同地址空间。这是有好处的。例如,在一些系统上,应用程序的大小通常只有几百kb,并且加载速度很快;它们的大部分代码位于已经被操作系统加载用于其他目的的库中。

为了改变另一个进程里面的代码,我们需要在另一个进程的地址空间中载入自己的共享库。在Unix平台上用LD_PRELOAD环境变量可以实现这个功能
ps: 在windows平台上需要用DDL注入(事实上windows的.dll==linux的.so==MAC-OSX的 .dylib)

参考文献

[1] https://en.wikipedia.org/wiki/Hooking
[2] http://ntvalk.blogspot.com/2013/11/hooking-explained-detouring-library.html
[3] https://www.cnblogs.com/pannengzhi/p/5203467.html
[4]https://www.linuxidc.com/Linux/2012-04/57910.htm
[5]https://blog.csdn.net/swartz_lubel/article/details/79312047

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值