【游戏逆向】探索可靠的线程检查方法

一、关键的线程检查

在对抗外挂和木马的方案中,不可能将所有的检查操作放在主线程中,因此,在方案中总有一个扫描线程或者环境检查线程必须保持工作,而它们也就成了外挂和木马的重要攻击目标,外挂和木马只要搞定了它们,就能很方便地在客户端肆虐。

在客户端反木马方案SafeLogin和TEdit中,就经历过很长一段时间线程保护的对抗,通过了解客户端反外挂系统以及壳和Sanlix中的线程保护,现在在对抗线程保护方面,木马的对抗手段相对外挂跑在了前面,这和木马本身的特性关系很大,如果不搞定扫描线程和环境检查线程,那么它们在特征扫描、键盘钩子和窗口行为等检查过程下将无法遁形。

二、外挂和木马常用的攻击手段

外挂和木马对线程的攻击不外乎这样的几种手段:

1)最简单的,篡改线程函数代码,很容易被通过特征检查扫描到;

2)简单阻止线程创建,通过hook线程创建相关函数,也很容易被发现;

3)这种办法相对隐蔽,通过hook ntdll!CsrNewThread函数,替换线程函数地址,这样绕过了壳中通过GetExitCodeThread和ResumeThread的检查方法;

4)更为隐蔽,通过hook kernel32!Sleep, 当线程内调用Sleep的时候,通过篡改参数,让这个Sleep永远进行下去,不过在SafeLogin的根据数据的线程检查方法可以发现它;

5)非常隐蔽,通过hook ntdll!ZwDelayExecution, 并不是让线程永远Sleep下去(Sleep函数最终会调用这个native API),而是让线程Sleep的时间更长一些,而在这个间隙,木马一则掌握了检查线程的活动规律(相当于一个潜入者掌握了流动岗哨的活动规律)二则可以让检查线程的循环执行缓慢(相当于一个潜入者控制流动岗哨巡查变慢),为自己做坏事争取了时间。

其实这些手段也是我们在和木马对抗的过程中,木马不断进化出来的,尤其最后一种,其实在实际中,木马对ntdll!ZwDelayExecution的hook也不是长时间存在的,而是hook一下,如果拦截到了,则拦截,如果没拦截到,则赶紧恢复,以避开扫描线程的hook检查,整个过程更加隐蔽。

三、结合线程上下文切换和数据变化检测的方法

熟悉了外挂和木马的对抗手段,我们可以看出,如果仅对线程的代码,或者线程句柄进行检查,都将是不可靠的,我们需要有一种办法,让线程活动即对线程检查数据进行更新(对抗木马的手段4和5),如果发现线程长时间不活动,或者线程活动但是每没有更新线程检查数据,则可以判断这个线程有问题了。

简单介绍了背景,多余的内容不再赘述,直接描述方法。

我们知道在Windows系统的内核,会对所有的线程进行调度执行,当一个线程被切换到时,就会把它的上下文信息换入到CPU寄存器等环境中,而这时,内核中有一线程上下文切换次数(thread context switch count)会被自增1, 而一个线程在两个时刻这个数据的差值(下文简称delta值),即thread context switch delta, 反映了它在这两个时刻之间被切换的次数。

在sysinternals的process explorer工具中,对这个数据进行的显示,并可以看到它在不断更新。
在这里插入图片描述
通过对process explorer的研究,它以5号功能调用了系统函数NtQuerySystemInformation, 通过查阅第三方文档,线程切换记数存在与这个结构中(见图1),通过以5号功能调用NtQuerySystemInformation即可获取它(见图2)

图一
在这里插入图片描述
图二
通过检查线程在两个时刻的delta值,结合对线程活动更新数据的检查(见图3),就能有效发现木马手段4和5。另外,在检查过程中,如果通过delta值和更新数据都没有发现线程的活动,是否是线程始终没有被系统调度呢,通过Sleep或者SwitchToThread的方法,就可以主动触发线程调度(见图4),如果被检查的线程被“变慢”了,那么主线程也会跟着罢工。这样,一个比较可靠的线程检查方法就实现了。
在这里插入图片描述
图三
在这里插入图片描述
图四

四、小结

这种检查方法也是在对抗过程中进化出来的,当然现在它很可能继续被对抗,总之,在线程的对抗、防御和检查中,这样的思路是贯穿始终的,也就是对线程的代码、活动性同时进行多线程交叉检查,让一个线程不正常工作,其他线程全罢工。

作为积累和分享,将这种其实很简单的办法描述了一下,后续的对抗中,如果有更好的办法,也会接着分享出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4958.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步 典型的一次IO的两个阶段是什么?数据就绪和数据读写 数据就绪:根据IO操作的就绪状态 阻塞非阻塞 数据读写:根据应用程序和内核的交互方式 同步异步 陈硕:在处理IO的时候,阻塞和非阻塞都…

架构分层方法指导

在《不过时的经典层架构》里讲了经典的四层架构怎样对易变性做封装。咱们实际项目中,如果没有足够的实践和关键性思考,还是很可能使用名义上科学的分类理论,却在按照功能进行架构分层。今天咱们就通过一些简单的指导来尽量减少这种风险。 四问…

PDF转换软件有哪些?分享免费好用的PDF转换工具!

PDF是在办公和学习中常用的文件格式,它包含文字、图片、数据等各种信息,可以说是功能丰富。然而,有时我们需要将PDF转换为PPT格式以便于演示,或者将其转换为Word格式以节省内存空间。这时候就需要使用PDF转换软件。下面我将介绍一…

java投票管理系统小程序

投票管理系统小程序 演示视频 技术: 基于springbootvue小程序的投票管理系统的设计与实现 运行环境: JAVA版本:JDK1.8 IDE类型:IDEA、Eclipse都可运行 微信开发这工具 数据库类型:MySql(8.x版本都可&am…

#10048 「一本通 2.2 练习 4」Censoring(内附封面)

[USACO15FEB] Censoring S 题面翻译 Farmer John为他的奶牛们订阅了Good Hooveskeeping杂志,因此他们在谷仓等待挤奶期间,可以有足够的文章可供阅读。不幸的是,最新一期的文章包含一篇关于如何烹制完美牛排的不恰当的文章,FJ不愿…

机器学习6:使用 TensorFlow 的训练线性回归模型

纸上得来终觉浅,绝知此事要躬行。前面 5 篇文章介绍了机器学习相关的部分基础知识,在本章,笔者将讲解基于 TensorFlow 实现一个简单的线性回归模型,以便增强读者对机器学习的体感。 目录 1.环境准备 1.1 安装 Python3 1.2 安装…

尚硅谷微信小程序开发 仿网易云音乐App 小程序 后端接口服务器搭建

小程序学习 尚硅谷微信小程序开发 项目网易云小程序学习地址: 01-尚硅谷-小程序-课程介绍_哔哩哔哩_bilibili 视频相关的教程文档与笔记分享 链接:https://pan.baidu.com/s/1aq7ks8B3fJ1Wahge17YYUw?pwd7oqm 提取码:7oqm 配套服务器 老师…

品牌方的brief怎么写,注意事项

我们都知道,对于产品传播来说,达人起着重要的作用。可又是什么影响着达人的传播结果呢?今天给大家分享下,品牌方的brief怎么写的注意事项。 一、什么是brief 可能有的朋友,还不太清楚,到底什么是brief。Brief&#xf…

用python实现调用百度图片搜索的API

前言:这段代码是一个简单的图片爬虫程序它可以通过输入关键词,在百度图片中搜索相关图片,并返回一张随机的图片。代码使用Flask框架搭建了一个简单的Web应用,将用户输入的关键词作为参数传递给爬虫程序,然后从百度图片…

linux 资源包安装详细教程

linux 资源包安装详细教程 一、离线下载安装1.1 下载1.2 安装1.3 错误:依赖检测失败 - 解决方案1.4 查看安装的包情况 二、在线安装 一、离线下载安装 1.1 下载 点击进入网页:linux资源包下载链接:pkgs.org在搜索栏输入需要的包&#xff0c…

7.3 SpringBoot整合MyBatis分页插件github.pageHelper:实现图书列表API

文章目录 前言一、自己实现分页第一步,count 查询 总记录数(totalCount),计算总页数(totalPages)第二步,limit 查询 指定页数据 二、不考虑分页的查询图书列表MapperBookServiceImplBookListPar…

CSS_高度自动过渡 auto height

方法一 grid 布局中的 fr 单位&#xff08;推荐使用&#xff09; <div class"wrap"><button class"trigger">鼠标放上来试试</button><div class"grid"><div><p>高度自动过渡</p></div></d…