基于CallStack的Anti-Rootkit HOOK检测思路

伪造返回地址绕过CallStack检测以及检测伪造返回地址的实践笔记 Author:[CISRG]KiSSinGGerE-mail:kissingger@gmail.comMSN:kyller_clemens@hotmail.com题目有点搞......Anti-CallStack Check and Anti-Anti-CallStack Check...(;- -)发现最近MJ0011的“基于CallStack的Anti-Rootkit HOOK检测思路”和gy 阅读详情
基于CallStack的Anti-Rootkit HOOK检测思路:

MJ0011
2007-11-2
th_decoder@126.com

Anti-Rootkit目前扫描Hook的方法主要有以下几种:

1.对抗inline -hook ,IAT/EAT Hook

Anti-Rootkit使用读取磁盘上系统文件并将之进行map/重定位后,同内存中的代码进行对比的方法来检测inline hook(或EAT/IAT HOOK,后同),类似的工具例如Rootkit Unhooker, gmer, Icesword等等

为了对抗Anti-Rootkit的inline Hook扫描,Rootkit们使用一些方法来进行自己HOOK的隐藏

例如Shadow Walker的方法,HOOK Int 0Eh缺页中断来隐藏内存中被HOOK的代码

或者是例如流氓软件CNNIC中文上网,HOOK FSD的IRP_MJ_READ,当读取到ntfs.sys等文件时,修改数据,将错误的结果返回回去,导致Anti-rootkit工具误认为内存中的代码是正确的

多种方式都可以让这种传统的INLINE HOOK检测方法失效

2.Object Hook

Object Hook一般更隐藏,更难检测

为大家所熟知的Object hook例如有修改driver object中的MajorFunction dispatch表

或者是hook KeyObject(KCB)中的一些call back routine/GetCell Routine(zzzzevazzzz放出过相关代码)

又或者是hook Object中一些其他的通用链中的代码指针来进行自我隐藏/保护功能(例如tombkeeper的一些文章提到的细节)

目前的办法一般是扫描这些OBJECT的结构,找到对应指针,利用特征搜索、模块范围对比等方法,检测他们是否被HOOK

类似的工具例如 rootkit unhooker,gmer(rootkit unhooker中检测的object hook较多)

但这些工具都只能检测他们已知的object hook

一旦Rootkiter利用未知的object hook进行隐藏,或者是转换平台,数据结构发生变化,就很难检测到object hook, 传统的Object hook检测方式也很容易被rootkiter饶过,
详见我的<<绕过现代Anti-Rookit工具的内核模块扫描>>一文



这里提出一种新的hook检测方式: 即利用CallStack进行HOOK检测

让我们来看一种典型的rootkit的HOOK方式:

例如hook //FileSystem//Ntfs的 IRP_MJ_DIRECTORY_CONTROL来进行文件隐藏,rootkit.com有上相关的代码

它们的代码通常是这样的

NTSTATUS HookFsd(LPCWSTR DrvName)

{

//....获得ntfs的driver object

g_OldNtfsDriCtl = drvobj->MajorFunction[IRP_MJ_DIRECTORY_CONTROL];

//保存原始的dispatch 地址

drvobj->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = MyNtfsDriCtl ;

//用自己的dispatch 地址替换原始地址

//,,,,,

}



NTSTATUS   MyNtfsDriCtl(PDEVICE_OBJECT devobj , PIRP pIrp)

{

NTSTATUS stat ;

//一些初始化处理.....

  __asm

{

push  pIrp

push devobj

call g_OldNtfsDriCtl

mov stat ,eax

}

//首先调用原始函数,以便得到结果

//下面进行处理,hack CompletionRoutine,或者是直接修改 UserBuffer的数据

//...

}

上面就是一个hook fsd来隐藏文件的ROOTKIT的大概结构

让我们来看看,在MyNtfsDriCtl中call g_OldNtfsDriCtl时,发生了什么?

它会跳转到原始的g_OldNtfsDriCtl中,并且保存返回地址,这个返回地址在哪儿?rootkit的代码体内!

那么就简单了,我们简单地Hook 原始dispatch中的更深层的地方,例如,Ntfs的DriectoryControl快结束时会call KeLeaveCriticalRegion或者IofCompleteRequest

我们HOOK这个地方,然后,当这个调用触发时,我们检查esp,并向上回溯堆栈,找到call stack,我们发现了什么?

哈哈!rootkit的返回地址!

再简单的使用ZwQuerySystemInformation,就可以知道这个地址位于哪个模块中,ROOTKIT定位成功!(如果抹去了模块,可以定位这块内存为unknow image)

这样,只要HOOK特定的地方,再在ring3调用相关服务,触发hook,检查call stack,就可以轻松得到rootkit的返回地址了(或者hooker的返回地址,不一定是rootkit :p )

示例代码就不写了,有几个注意问题:
1.call stack中会有其他一些系统的模块或者硬件驱动的模块,要考虑如何把他们区分出来的问题,相信这个很简单了,呵呵

2.使用这种方式,只要你HOOK的地方正确恰当

可以检测到90%以上的object hook,无论object结构如何变化,或者是未知的object hook,或者使用一些方式进行object hook的隐藏

(例如<<绕过现代Anti-Rookit工具的内核模块扫描>>中提到的方法),
都会被检测出来

但并非所有的inline hook方式都可能被检测出来,例如修改被HOOK函数参数后使用jump 指令而不是call指令跳转到原始函数,这样就检测不出来

另外HOOK的位置也十分关键,HOOK的位置不对,一些ROOTKIT可能HOOK的路径就会被放过,HOOK得过深的话,进程context就会丢失(例如hook到disk或atapi来检测文件/磁盘HOOK时),这样判断上就会有一定的困难

3.call stack的分析方法,这个也很简单了,这里就不多说了  
防破解_call栈帧检测 call栈帧检测,检测目标函数的返回地址,防止目标函数被hook,可用于软件防破解全程伪代码讲解知识点1 函数的返回地址所在范围----------通常,call一个函数会形成一个栈帧,例如:void msg()//无参call{信息框("我是信息框")}void msg1(整数型 句柄,文本型 标题,文本型 内容,整数型 类型)//有参call{信息框(句柄,标题,内容,类型)}不管有参还是无参... 阅读详情

相关推荐

《游戏外挂攻防艺术》学习笔记【一】

1. R3隐藏模块 断LDR 链+ 抹去PE头 2. 如何防止通过call stack 检测调用的合法性 跳过目标call内检测的代码,因为检测一般也是通过hook实现,所以我们可以直接跳过这段检测代码。 建立假的栈帧 ,具体为我们先构造好我们自定义的栈帧,再通过jmp 指令跳到指定call 的内部,这样就避开了使用call导致自动创建栈帧。 3.定位call 1.虚函数差异调用定位...

weixin_42832173的博客 1403

hook WRITE_PORT_UCHAR

hook WRITE_PORT_UCHAR 懒得打字了,直接copy答案提交区的帖子吧,有什么不好的不要笑俺,俺是初学 由于里面废话太多,大概内容为:mbrprot.sys会定时检查01号扇区,发现不对就清0。我的方法是阻止mbrprot.sys清0,通过hookHAL!WRITE_PORT_UCHAR,控制对硬盘端口的访问使得任...

weixin_34184158的博客 457

Linux平台下木马rootkit的检测和防范

近些年来,在网络安全攻击中,高隐匿、高持久化的Rootkit技术成为黑客操控的主要手段,本文,我首先对Rootkit的几种类型进行介绍,主要让大家了解内核态Rootkit的高度定制化需求和Linux系统上存在的其他类型Rootkit,最后从攻防视角给出对Rootkit进行检测和防范的工具和方法。rootkit是Linux平台下最常见的一种木 马后门工具,它主要通过替换系统文件来达到攻 击和和隐蔽的目的,这种木 马比普通木 马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现这种木 马。

靠谱运维 2844

Linux系统安全加固指南(二)

Linux系统安全加固指南(二)

君逍遥o 772

一款手工杀毒/Anti-rootkit工具-ixer 0.11开源版

前言:       随着信息科技的迅速发展,Internet已经成为全球最重要的信息传播工具。当人们在享受网络为我们的工作、生活带来方便和效率的同时,但它们潜在地也带来了安全问题。据统计,凡是刚开始接触过互联网的人,大部分人都或多或少的被入侵、恶意攻击过,并且安全威胁事件逐年上升。可见黑客如此猖獗,应该采取什么手段来防止黑客入侵是大家普遍关心的问题。 长期以来,最为严重的安全威胁就是恶意程序。

chinghoi's blog 3218

PINN for PDE(偏微分方程)4 - 反向问题 - Burgers’ equation

PINN for PDE(偏微分方程)4 - 反向问题 - Burgers’ equation

m0_62030579的博客 3003

防止stack buffer overflows攻击的方法 : ShadowCallStack

1、介绍 ShadowCallStack 是一个检测通道,目前只为 aarch64 实现,它可以保护程序免受返回地址覆盖(例如堆栈缓冲区溢出 : stack buffer overflows)。它的工作原理是将函数的返回地址保存到函数序言中单独分配的“shadow call stack”,子函数并从函数结语中的shadow call stack加载返回地址。 2、用法 要启用 ShadowCallStack,只需将-fsanitize=shadow-call-stack 标志传递给编译和链接命令行。在 aa

baron-周贺贺-代码改变世界ctw 1422

相机标定-张正友棋盘格标定法

(X,Y,Z)为在世界坐标系下一点的物理坐标 ( u , v ) 为该点对应的在像素坐标系下的像素坐标 引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。 2.相机成像过程 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 (1)世界坐标系(,,) 描述目标在真实世界中的位置引入的参考坐标系。 (2)相机坐标系(,,) ...

qq_41275123的博客 1万+

安全防护机制

应用层安全防护 ASLR (Address space layout randomization,地址空间布局随机化) 在windows上ASLR主要包括堆栈随机化、PEB与TEB随机化、映像随机化,windows系统上虽然xp时代就提出来了,但是从vista开始ASLR才真正发挥作用。 在linux上ASLR主要包括栈地址随机化、LIBS/MMAP随机化、EXEC随机化、BRK随机化、VDSO随...

我多么希望明天有太阳,来灼烧我腐烂的梦想 1795

从Simulink到Amesim:一份FMU联合仿真的避坑指南(含UDP通讯完整配置)

本文详细解析了从Simulink到Amesim的FMU联合仿真全流程,重点介绍了UDP通讯配置中的常见陷阱与解决方案。通过实战案例,帮助工程师规避编译器不兼容、步长设置冲突等典型问题,提升复杂系统仿真的效率与准确性。

weixin_34046298的博客 336

地平线天工开物AI开发平台实战:从量化训练到模型部署的完整指南

本文提供了地平线天工开物(OpenExplorer)AI开发平台的实战指南,详细解析了从量化训练到模型部署的完整流程。文章重点对比了量化感知训练(QAT)与训练后量化(PTQ)两条核心路径的优劣与适用场景,并分享了图像分类模型PTQ部署的实战经验与常见问题调试技巧,旨在帮助开发者高效地将AI模型部署到地平线AI芯片上。

weixin_29046035的博客 456

Shadow Call Stack and Branch Target Identification for improved security on ARM64

Shadow Call Stack and Branch Target Identification for improved security on ARM64

小立仔 1734

百度新闻评论内容抓取

通过抓包分析发现,百家号手机app端文章评论内容接口为:https://ext.baidu.com/api/comment/v1/comment/getlist?appid=101&sid=1008524_2-1010050_1-1007549_23033-1007550_23035&cuid=01B5EAF73E8A83BB842BE04E4FB6C656|23200201047...

codingforhaifeng的博客 2420

基于CallStack的反Rootkit HOOK检测

Anti-Rootkit目前扫描Hook的方法主要有以下几种:   1.对抗inline -hook ,IAT/EAT Hook   Anti-Rootkit使用读取磁盘上系统文件并将之进行map\重定位后,同内存中的代码进行对比的方法来检测inline hook(或EAT/IAT HOOK,后同),类似的工具例如Rootkit Unhooker, gmer, Icesword等等。

1553

Qt —— 百度地图 - 3、Qt调用高德在线地图功能示例(附源码)

Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)

497

2.1 amdgpu BO的类型和用途

AMDGPU驱动中,amdgpu_bo_create_user和amdgpu_bo_create_kernel分别用于创建用户空间和内核空间的buffer对象(BO)。用户空间BO支持元数据、tiling flags等属性,由GEM handle管理生命周期;内核BO则用于驱动内部资源如ringbuffer,自动pin并可选CPU映射。二者在返回类型、生命周期管理和使用场景上存在根本差异,前者面向图形渲染/AI等应用,后者服务于驱动内部任务。

图形/计算GPU的驱动与虚拟化技术分享园地 2203

绕过目前主流的现代Anti-rootkit工具

本文描述了一些方法,可以绕过目前主流的现代Anti-rootkit工具,包括但不限于:Icesword 最新版、Gmer最新版、Rootkit unhooker 最新版、DarkSpy 最新版以及AVG Anti-rootkit最新版等等  目前的anti-rootkit工具中,对于内核模块主要采用如下几种扫描方式:  1.恢复ZwQuerySystemInformation的hook,然

yaneng的专栏 8608

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2784

保护函数返回的利器——Linux Shadow Call Stack

0x01 写在前面提到内核栈溢出的漏洞缓解,许多朋友首先想到的是栈内金丝雀(Stack Canary)。今天向大家介绍一项在近年,于Android设备中新增,且默默生效的安全机制——影子调用栈:SCS(Shadow Call Stack)。0x02 功能介绍在通常的函数调用中,被调用函数的返回地址存储在栈上,攻击者可以通过篡改栈上返回地址劫持程序的执行流,常见的攻击方式如通过溢出覆盖返回地址、RO...

内核工匠 1072

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

分歧还是共存?详解Android内核安全

现如今,世界上越来越多的智能终端包括手机、TV、SmartBox和IoT、汽车、多媒体设备等等,均深度使用Android系统,而Android的底层正是Linux内核,这也让Linux内核的安全性对Android产生重大影响,随着Android的演进,Android内核在集成Linux内核主线版本的优势下,再发展适合自身生态的内核安全方案,在庞大数量设备的基础上,既是挑战,也是机遇,期待Android能给出完美的答案。...

Rethinking the Kernel 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

打算利用过年时间写一个Anti-Rootkit工具

年后发布,计划功能:1.核心级文件访问,byPass any api/ifs/fsd hook 或过滤,对付目前的RK流氓该够了,如果真有人变态到做磁盘级在考虑加更强的功能2.摘各种ROUTINE或Notifiction的功能3.隐藏进程检测、终止4.文件句柄关闭5.注册表HIVE访问6.各种inline hook非inline hook的检测及修复7.系统image还

mj0011的Rootkit科技实验室 3790

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

调试技巧之调用堆栈 - Call stack

简单介绍   调试是程序开发者必备技巧。如果不会调试,自己写的程序一旦出问题,往往无从下手。本人总结10年使用VC经验,对调试技巧做一个粗浅的介绍。希望对大家有所帮助。      今天简单的介绍介绍调用堆栈。调用堆栈在我的专栏的文章VC调试入门提了一下,但是没有详细介绍。      首先介绍一下什么叫调用堆栈:假设我们有几个函数,分别是function1,function2,functi

zhg598242449的专栏 2万+

CFI/CFG 安全防护原理详解

文章目录1. 简介1.1 控制流攻击历史1.2 CFI的基本概念1.3 CFI发展历史2. Orig CFI2.1 Windows CFG的实现3. CCFIR4. VTV5. Kernel CFI5.1 forward-edge protection CFI(Control-Flow Integrity)5.2 backward-edge protection SCS(Shadow Call Stack)5.3 Shared library support(Cross-DSO)6. 利用硬件来提升CF

pwl999的博客 1万+

LWN:kernel代码执行流程如何确保不被篡改?

关注了就能看到更多这么棒的文章哦~Control-flow integrity for the kernelByJake EdgeJanuary 22, 2020LCA原文来自:ht...

Linux News搬运工 1055

获取call stack的几种方法

<br />madExcept 有个方法叫StackTrace (在单元 madStackTrace)可以提取<br />JEDI Code Library 也有类似的东西,在unit JclDebug.<br /> Exceptional Magic也不错,代码如下:<br />try raise Exception.Create('Something bad happened...'); except on e: Exception do begin Ca

Avan_Lau的专栏 2644
上一篇: 伪造返回地址绕过CallStack检测以及检测伪造返回地址的实践笔记
下一篇: 新版“机器狗”病毒详细分析资料
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值