【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权)
▒ 目录 ▒
- 🛫 问题
- 描述
- 环境
- 1️⃣ 代码编写
- 开源代码搜索
- 自己撸代码
- procexp确定句柄对应的文件名并过滤
- 2️⃣ PsExec.exe提权
- 定位找不到`EABackgroundService.exe`的问题
- PsExec.exe提权
- PsExec.exe原理
- 🛬 结论
- 📖 参考资料
🛫 问题
描述
由于工作原因,需要对EA平台进行分析,其中一项就是监控文件操作。
本篇文章主要目的是Frida实操应用,如果有更深入的需求,推荐使用ProcMon.exe
,通过各种删选条件进行监控操作。
ps: 对于有些软件,会检测
ProcMon.exe
等各种软件,需要这时候可以使用frida进行监控。
环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2023-05-05 | |
操作系统 | Win11 - 21H2 - 22000.1335 | |
Python | 3.7.1 | |
frida.exe | 15.0.18 | |
1️⃣ 代码编写
开源代码搜索
首先想到的就是找下有没有开源的代码,结果找到一个
https://github.com/nowsecure/frida-fs
,代码下好,编译好了,结果发现,只是个文件操作的库。
后来有找了该作者的另一个库
https://github.com/nowsecure/fsmon
,这次看清楚了,支持Android、ios、mac,唯独不支持windows!!!
总之,没有找到合适的监控文件的frida代码。
自己撸代码
文件读写相关的函数有ReadFile、WriteFile、CreateFileW(CreateFileA最终调用的也是CreateFileW)等,我们以
CreateFileW
为例,讲解下frida提供的各种接口及含义。
Module.findExportByName
,根据模块名(“kernel32.dll”)和导出函数名(“CreateFileW”),获取目标函数地址。Interceptor.attach
,执行hook的函数,传递一个目标函数地址和hook后的处理方法集合。onEnter & onLeave
,处理函数集合的两个常见方法,分别代表调用函数前和调用后的处理。
- 对于
onEnter: function (args)
,我们可以查看并修改参数相关值。- 对于
onLeave: function (retval)
,这里我们查看并修改函数返回结果。
完整代码:
const win32 = Process.platform === 'windows';if (win32) {Interceptor.attach(Module.findExportByName("kernel32.dll", "ReadFile"), {onEnter: function (args) {const hFile = args[0];const lpBuffer = args[1];const nNumberOfBytesToRead = args[2];const lpNumberOfBytesRead = args[3];const lpOverlapped = args[4];console.log(`ReadFile called with hFile: ${hFile}, lpBuffer: ${lpBuffer}, nNumberOfBytesToRead: ${nNumberOfBytesToRead}, lpNumberOfBytesRead: ${lpNumberOfBytesRead}, lpOverlapped: ${lpOverlapped}`);},onLeave: function (retval) {console.log(`ReadFile returned: ${retval}`);}});Interceptor.attach(Module.findExportByName("kernel32.dll", "CreateFileW"), {onEnter: function(args) {var fileName = args[0].readUtf16String();console.log("Opening file: " + fileName);if (fileName.endsWith('\\IS')) {// Thread.sleep(5*1000)}},onLeave: function (retval) {console.log(`Opening returned: ${retval}`);}});Interceptor.attach(Module.findExportByName("kernel32.dll", "WriteFile"), {onEnter: function(args) {var fileHandle = args[0];// console.log("Enter Writing ", fileHandle.toInt32() === 0xbc4);if (fileHandle.toInt32() === 0xbc4) {return}console.log("Writing " + '0' + " bytes to file handle " + fileHandle);var buffer = args[1];var length = args[2];console.log("Writing " + length + " bytes to file handle " + fileHandle);},onLeave: function (retval) {// console.log(`Writing returned: ${retval}`);}});
}
procexp确定句柄对应的文件名并过滤
上述代码执行后,会有大量的日志输出,我们可以通过
fileHandle.toInt32()
过滤我们关心的句柄。
比如,我们不关心frida自己的句柄产生的日志,我们通过procexp
查看frida相关句柄(0xb3c),当fileHandle.toInt32() === 0xb3c
时,直接返回,不再输出日志。
代码如下:
Interceptor.attach(Module.findExportByName("kernel32.dll", "WriteFile"), {onEnter: function(args) {var fileHandle = args[0];// console.log("Enter Writing ", fileHandle.toInt32() === 0xbc4);if (fileHandle.toInt32() === 0xb3c) {return}
2️⃣ PsExec.exe提权
定位找不到EABackgroundService.exe
的问题
代码写完后,发现直接执行frida命令,会提示找不到进程。
排查一圈后,发现EABackgroundService.exe
进程是SYSTEM
权限,frida无权查看该进程。
PsExec.exe提权
很自然的,想到了PsExec.exe,查了资料,发现增加
-i -d -s
这三个参数就能将frida提取为SYSTEM,这三个参数的含义如下:
- -i 运行程序,使其与远程系统上指定会话的桌面进行交互。 如果未指定会话,则进程在控制台会话中运行。 尝试使用重定向的标准 IO) 以交互方式 (运行控制台应用程序时 ,需要 此标志。
- -d 不要等待进程终止 (非交互式) 。
- -s 在系统帐户中运行远程进程。
PsExec.exe原理
PsExec.exe是Sysinternals Suite中的一个工具,它可以在本地或远程计算机上启动进程。它的原理是通过在远程计算机上安装一个服务程序(PsExecSvc.exe),该服务程序允许PsExec.exe在远程计算机上执行命令。
它的提权原理是利用 Windows 系统中的一个名为“服务控制管理器”的组件,该组件可以启动和停止系统服务。
PsExec.exe 利用这个组件启动一个新的服务,该服务的权限可以被设置为 LocalSystem,这是 Windows 系统中最高的权限级别之一。一旦服务被启动,PsExec.exe 就可以在该服务的上下文中启动进程,从而获得了更高的权限。
具体来说,PsExec.exe 的提权过程如下:
- PsExec.exe 启动一个新的服务,该服务的权限可以被设置为 LocalSystem。
- 在该服务的上下文中,PsExec.exe 启动一个新的进程。
- 新的进程继承了服务的权限,因此具有更高的权限。
需要注意的是,使用 PsExec.exe 进行提权需要具有管理员权限。否则,PsExec.exe 将无法启动新的服务。此外,使用 PsExec.exe 进行提权也可能会被杀毒软件视为恶意行为,因此需要谨慎使用。
🛬 结论
EA平台使用了很多技术,如protobuf、rpc、各种加密等,有需要分析的,可以一起探讨。
📖 参考资料
- PsExec.exe下载地址及使用说明 https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。
相关文章:

【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权)
▒ 目录 ▒ 🛫 问题描述环境 1️⃣ 代码编写开源代码搜索自己撸代码procexp确定句柄对应的文件名并过滤 2️⃣ PsExec.exe提权定位找不到EABackgroundService.exe的问题 PsExec.exe提权PsExec.exe原理 🛬 结论📖 参考资料 🛫 问题…...

可视化和回归分析星巴克咖啡在中国的定价建议
可视化和回归分析星巴克咖啡在中国的定价建议。星巴克的拿铁大杯Tall 在各国的价格。 Claude AI | 代码自动生成的数据可视化代码 选择Claude AI 而非 ChatGPT的理由是前者更懂中文!具体可以参见我前面的两篇文章对比两者的中英文翻译的表现及使用安装等难易程度…...

热门影片怎么买票比较便宜,低价买电影票的方法,纯攻略!
有时候真的有被自己蠢到!看电影看了这么多年,竟然不知道电影票价格才9.9元、19.9元就能买到。之前我看电影动不动就是几十上百块,感觉好亏啊。 其实,我也不敢相信的,通过这些平台,同时在节假日甚至春节档期…...
Python通过SWIG调用C++时出现的ImportError问题解析
摘要 win10系统,编译器为mingw,按照教程封装C的一个类并用python调用,一步步进行直到最后一步运行python代码时,在python代码中import example时报错ImportError: DLL load failed while importing _example: The specified modul…...

3ds Max云渲染有多快,3ds Max云渲染怎么用?
本地渲染效果图和动画3D项目是一个非常耗时的过程,当在场景中使用未优化的几何体或在最终渲染中使用大量多边形模型时,诸如此类的变量最终会增加渲染项目所需的时间和处理器能力。随着提供的渲染服务的云渲染平台出现,越来越多动画师、艺术家…...

Java之线程安全
目录 一.上节回顾 1.Thread类常见的属性 2.Thread类中的方法 二.多线程带来的风险 1.观察线程不安全的现象 三.造成线程不安全现象的原因 1.多个线程修改了同一个共享变量 2.线程是抢占式执行的 3.原子性 4.内存可见性 5.有序性 四.解决线程不安全问题 ---synchroni…...
我有一个方法判断你有没有编程天赋
我有一个方法判断你有没有编程天赋 一 前言 基于知识的诅咒的原理 做一个敲击者很难。问题在于敲击者已拥有的知识(歌曲题目)让 他们想象不到缺乏这种知识会是什么情形。当他们敲击的时候,他 们不能想象听众听到的是那些独立的敲击声而不是…...
python 生成chart 并以附件形式发送邮件
import requests import json import pandas as pd import numpy as np import matplotlib.pyplot as plt data np.random.randn(5, 3)#生成chart def generate_line_chart(data):df pd.DataFrame(np.abs(data),index[Mon, Tue, Wen, Thir, Fri],columns[A, B, C])df.plot()…...
leetcode-035-搜索插入位置
题目及测试 package pid035; /*35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums …...

读书笔记--数据治理之法
继续延续上一篇文章,对数据治理之法进行学习。数据治理之法是战术层面的方法,是一套涵盖8项举措的数据治理实施方法论,包括梳理现状与确定目标、能力成熟度评估、治理路线图规划、保障体系建设、技术体系建设、治理策略执行与监控、绩效考核与…...

送了老弟一台 Linux 服务器,它又懵了!
大家好,我是鱼皮。 前两天我学编程的老弟小阿巴过生日,我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的,结果小阿巴说:我想要一台服务器。 鱼皮听了,不禁称赞道:真是个学编程的好苗…...

CentOS 7(2009) 升级 GCC 版本
1. 前言 CentOS 7 默认安装的 gcc 版本为 4.8,但是很多时候都会需要用到更高版本的 gcc 来编译源码,那么本文将会介绍如何在线升级 CentOS 的 gcc 版本。 2. 升级 GCC (1). 安装 centos-release-scl; [imaginemiraclecentos7 ~]$ sudo yum…...

java非静态代码块和静态代码块介绍
代码块 SE.10.0…02.28 非静态普通代码块:定义在方法内部的代码块,不用任何关键字修饰,又名构造代码块、实例代码块 静态代码块:用static修饰的代码块 非静态代码块 public class Test {public static void main(String[] args…...
Golang中接口类型详解与最佳实践(二)
之前的文章《Golang中的interface(接口)详解与最佳实践》详细介绍了接口类型的定义、使用方法和最佳实践。接口类型使得编写可扩展、可维护和可复用的高质量代码变得更加容易。 如何判断是否实现了某个接口? 还是使用之前文章的例子,例如声明了如下一个…...
ChatGPT 探讨内存屏障的意内存
一、与 ChatGPT 探讨内存屏障的意内存 轻松的氛围,跟 ChatGPT 从内存屏障问题一直扯到CAP原理 我: 2023/4/14 17:48:09 那我可以理解为{ shared_var 1; asm volatile ("sfence" ::: "memory"); asm volatile ("lfence" …...

P1039 [NOIP2003 提高组] 侦探推理
此题难度为:提高/省选- 作者为:CCF_NOI 题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明…...
模拟电路学习笔记 - 概念与结论
真空二极管,电子管ENIAC发源地,基础方法二极管双极管三极管场向管学习特性,最终运放运方的目的是运用,射频,计算…放大电路大功率元器件和微元器件学习他们的特性分粒 集成设计的角度,不要仅仅分析设计的前…...
Linux驱动开发:I2C子系统
目录 1、I2C简介 1.1 两根线 1.2 信号 1.3 写时序 1.4 读时序 1.5 I2C速率 1.6 I2C驱动框架简介 2、I2C设备驱动 2.1 I2C相关API 2.1.1 i2c_driver 2.1.2 注册:i2c_add_driver 2.1.3 注销:i2c_del_driver 2.1.4 module_i2c_driverÿ…...
[C++] 动态内存与智能指针
众所周知,C五大内存区:全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区):存放全局变量,静态数据和常量; 代码区:存放所有类成员函数和非成员函数代码,函数体的二进制代码。…...

多态的原理
有了虚函数,会在类的对象增加一个指针,该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时,是对父类的虚表指针进行了拷…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...