当前位置: 首页 > news >正文

【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
Python3.7.1
frida.exe15.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提供的各种接口及含义。

  1. Module.findExportByName,根据模块名(“kernel32.dll”)和导出函数名(“CreateFileW”),获取目标函数地址。
  2. Interceptor.attach,执行hook的函数,传递一个目标函数地址和hook后的处理方法集合。
  3. 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 的提权过程如下:

  1. PsExec.exe 启动一个新的服务,该服务的权限可以被设置为 LocalSystem。
  2. 在该服务的上下文中,PsExec.exe 启动一个新的进程。
  3. 新的进程继承了服务的权限,因此具有更高的权限。

需要注意的是,使用 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&#xff…...

[C++] 动态内存与智能指针

众所周知,C五大内存区:全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区):存放全局变量,静态数据和常量; 代码区:存放所有类成员函数和非成员函数代码,函数体的二进制代码。…...

多态的原理

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

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...