【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关)

2024-03-22 11:52

本文主要是介绍【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🛫 系列文章导航

  • 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
  • 【Frida】 01_食用指南 https://blog.csdn.net/kinghzking/article/details/126849567
  • 【Frida】02_常见API示例及功能函数封装(snippets)https://blog.csdn.net/kinghzking/article/details/136903974
  • 【Frida】 03_初识frida-node https://blog.csdn.net/kinghzking/article/details/136685316
  • 【Frida】 04_Frida中使用TypeScript脚本(采坑) https://blog.csdn.net/kinghzking/article/details/136772475
  • 【Frida】 05_读取扫雷游戏的数据 https://blog.csdn.net/kinghzking/article/details/136781623
  • 【Frida】 06_分析扫雷游戏的数据,显示地雷位置 https://blog.csdn.net/kinghzking/article/details/136685316
  • 【Frida】 07_让系统重新绘制指定窗口 https://blog.csdn.net/kinghzking/article/details/136829854
  • 【Frida】 08_将目标窗口切换到前台 https://blog.csdn.net/kinghzking/article/details/136837275
  • 【Frida】 09_获取软件窗口位置,设置鼠标指针位置 https://blog.csdn.net/kinghzking/article/details/136854052
  • 【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关) https://blog.csdn.net/kinghzking/article/details/136854020
  • 【frida-实战】“一行”代码教你获取WeGame平台中所有的lua脚本 https://blog.csdn.net/kinghzking/article/details/125590584
  • 【Frida-实战】EA游戏平台的文件监控(PsExec.exe提权) https://blog.csdn.net/kinghzking/article/details/130512479

▒ 目录 ▒

    • 🛫 系列文章导航
    • 🛫 导读
      • 开发环境
    • 1️⃣ 需求分析
      • 获取游戏地图区域位置(软件窗口固定偏移)
      • 模拟点击:mouse_click
    • 2️⃣ 代码编写测试
    • 🛬 文章小结

🛫 导读

开发环境

版本号描述
文章日期2024-03-17
操作系统Win11 - 22H222621.2715
node -vv20.10.0
npm -v10.2.3
yarn -v3.1.1
frida-compile10.2.1高版本各种异常
扫雷程序下载地址https://download.csdn.net/download/kinghzking/88979919
课程源码https://gitcode.net/kinghzking/MyOpen所在目录:/course/frida

1️⃣ 需求分析

流程:

  • 将目标窗口切换到前台(参考历史文章)
  • 获取游戏地图区域位置(软件窗口固定偏移)
  • 遍历棋盘,按行遍历
    • 如果是地雷(0x8F),标记为地雷(右键点击)
    • 如果是无雷区(0x0F),左键点击。
  • 重绘窗口区域(参考历史文章)

获取游戏地图区域位置(软件窗口固定偏移)

  • 我们先看下从基址拿到的内存数据,地址0x01005340对应的是(0,0)元素,该元素值为0x10,表示边界,不需要点击。真正需要点击的是0x01005361,该元素才是界面上的第一个元素。
    在这里插入图片描述

有了上面的介绍,我们可以假设一个虚拟的(0,0)点,如下图所示,该点相对于窗口的坐标为(6,88),所以,起始点的计算如下(lpRect为窗口在屏幕中的左上角位置):

  • this.start_x = lpRect.readU32() + 6;
  • this.start_y = lpRect.add(4).readU32() + 88;
    在这里插入图片描述

完整的代码如下:

class L07 {// 设置鼠标位置_自动点击鼠标private start_x = 0;private start_y = 0;private step = 16;获取软件窗口位置_设置鼠标指针位置() {let lpRect = Memory.alloc(4 * 4);User32.GetWindowRect(this.hWnd, lpRect);this.start_x = lpRect.readU32() + 6;this.start_y = lpRect.add(4).readU32() + 88;console.log("start_x", this.start_x);console.log("start_y", this.start_y);}

模拟点击:mouse_click

模拟鼠标操作,我们需要使用Windows API函数MouseEvent。该函数是一个Windows API函数,用于模拟鼠标的各种操作,例如移动鼠标、点击鼠标按键等。但需要注意的是,由于其在新版本的Windows中已经被标记为过时,推荐使用更现代的方法,如SendInput函数来模拟输入事件。
函数原型:

void MouseEvent(DWORD dwFlags,  // 指定鼠标动作的标志,可以是以下值的组合:// MOUSEEVENTF_ABSOLUTE:指定x和y参数是绝对坐标// MOUSEEVENTF_LEFTDOWN:模拟鼠标左键按下// MOUSEEVENTF_LEFTUP:模拟鼠标左键释放// MOUSEEVENTF_RIGHTDOWN:模拟鼠标右键按下// MOUSEEVENTF_RIGHTUP:模拟鼠标右键释放// MOUSEEVENTF_MIDDLEDOWN:模拟鼠标中键按下// MOUSEEVENTF_MIDDLEUP:模拟鼠标中键释放// MOUSEEVENTF_WHEEL:模拟鼠标滚轮滚动// MOUSEEVENTF_XDOWN:模拟鼠标X按钮按下// MOUSEEVENTF_XUP:模拟鼠标X按钮释放DWORD dx,       // x坐标变化量或绝对坐标(取决于dwFlags)DWORD dy,       // y坐标变化量或绝对坐标(取决于dwFlags)DWORD dwData,   // 滚轮滚动量ULONG_PTR dwExtraInfo // 额外信息,一般设为0
);

mouse_click实现逻辑:

  • User32.SetCursorPos移动到指定位置
  • 当为左键时,模拟鼠标左键按下和弹起。
  • 当为右键时,模拟鼠标右键按下和弹起。
  mouse_click(x: number, y: number, left_click: boolean = true) {User32.SetCursorPos(this.start_x + this.step * x, this.start_y + this.step * y);if (left_click) {User32.MouseEvent(User32.Const.MOUSEEVENTF_LEFTDOWN, 0, 0, 0,  User32.GetMessageExtraInfo());User32.MouseEvent(User32.Const.MOUSEEVENTF_LEFTUP, 0, 0, 0, User32.GetMessageExtraInfo());}else {User32.MouseEvent(User32.Const.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, User32.GetMessageExtraInfo());User32.MouseEvent(User32.Const.MOUSEEVENTF_RIGHTUP, 0, 0, 0, User32.GetMessageExtraInfo());}}

2️⃣ 代码编写测试

核心的函数都已经封装完毕,最后我们遍历地雷数据,执行点击事件,这里需要注意几点内容:

  • for循环中的长宽范围需要+2,因为有边界0x10
  • byte_data为head的偏移j + 0x20 * i,这是因为每行数据是固定的0x20(这也是为什么扫雷最大宽为30的原因)
  • 程序只有初始的时候有两种状态:0x8F0x0F,如果已经开始游戏的情况,会出现未处理的按钮。

具体代码如下:


class L07 {run() {this.将目标窗口切换到前台()this.获取软件窗口位置_设置鼠标指针位置()//遍历棋盘,按行遍历for (let i = 0; i < this.height + 2; i++) {//按列遍历let data = [];for (let j = 0; j < this.width + 2; j++) {let byte_data = this.head.add(j + 0x20 * i).readU8();data.push(byte_data.toString(16).padStart(2, "0"));// 标记地雷if  (byte_data == 0x8F) {this.mouse_click(j, i, false);}// 点击无雷区if (byte_data == 0x0F) {this.mouse_click(j, i);}}console.log(data.join(" "));}// 重绘窗口区域this.board_repaint()}
}let l07 = new L07();
l07.run();

代码已上传gitcode:https://gitcode.net/kinghzking/MyOpen 。 所在目录为:/course/frida/11_用鼠标自动标记棋盘上的雷区/index.ts
配置脚本如下:
在这里插入图片描述

执行npm run watch11,以监视模式编译脚本。
执行npm run runx,运行编译后的脚步,最终1秒过关。
在这里插入图片描述

🛬 文章小结

到此为止,我们通过TypeScript方式进行开发,通过扫雷程序,实战了Frida的基本使用。
当然,Frida的路途还很遥远,期待下次再见。

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

这篇关于【Frida】10_用鼠标自动标记棋盘上的雷区(一键过关)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835245

相关文章

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机