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

🛫 系列文章导航

  • 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
  • 【Frida】 01_食用指南 https://blog.csdn.net/kinghzking/article/details/126849567
  • 【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: 文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

AI程序员诞生:对程序员的影响与未来展望

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 方向一&#xff1a;AI程序员的优势分析 方向二&#xff1a;AI程序员局限性 方向三&#xff1a;对程序员职业的影响 方向四&…

【吊打面试官系列】Redis篇 - Redis 的回收策略(淘汰策略)?

大家好&#xff0c;我是锋哥。今天分享关于 Redis 的回收策略&#xff08;淘汰策略&#xff09;面试题&#xff0c;希望对大家有帮助&#xff1b; volatile-lru &#xff1a;从已设置过期时间的数据集&#xff08;server.db[i].expires&#xff09;中挑选最近最少使用的数据淘汰…

高通8255芯片首次烧写方法

高通8255芯片首次烧写需要进行分区烧写&#xff0c;方法如下&#xff1a; 目录 一&#xff1a;QFIL安装 二&#xff1a;关于QFIL详细文档 三&#xff1a;简要分区烧写方法 1烧写 meta build 2 然后重启一下机器 3 烧写 flat build 四&#xff1a;正常烧写程序 一&#…

成为高效Java工程师的干货笔记

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技术交流群】 作为一名Java工程师&…

好用电脑桌面便签是什么?电脑好用便签软件推荐

面对电脑屏幕&#xff0c;我常常感到一种无形的压力。繁杂的工作、琐碎的事务&#xff0c;仿佛都在这个小小的屏幕里与我争夺注意力。每当这时&#xff0c;我就特别需要一个能随时记录我重要事项的工具&#xff0c;让我能在忙碌中保持清醒的头脑。 有一天&#xff0c;我发现了…

产品|快!精!强!点点田企业版功能大升级

在诸如农业补贴、农情监测以及种植监管等场景中&#xff0c;农业遥感数据获取门槛高、行业客户软件开发经验不足等痛点一直存在。 针对这一挑战&#xff0c;珈和科技开发了点点田企业版产品&#xff0c;提供农业遥感数据服务&#xff0c;以API交付的方式降低数据获取门槛&…

外包干了1个月,技术明显进步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年8月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

Uibot (RPA设计软件)财务会计Web应用自动化(批量开票机器人)

Uibot (RPA设计软件&#xff09;Mage AI智能识别&#xff08;发票识别&#xff09;———机器人的小项目友友们可以参考小北的课前材料五博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们…

[MTK6771] android13系统启用OMAPI 支持esim.me

OMAPI是啥&#xff1f;看看谷歌的解释&#xff1a; 说了一大堆懂的人不需要看&#xff0c;不懂的还是看不懂&#xff0c;我就是后者 总之说人话就是&#xff0c;像SIM卡&#xff0c;NFC这类模块需要用到这个东西&#xff0c;那么接着往下看 上层APP想要使用这个OMAPI供应商稳…

五、分支结构

一、程序的组织结构 无论程序是大是小&#xff0c;都可以用顺序结构、选择结构和循环结构表示 二、单分支结构 单分支结构&#xff1a;如果表达式的值是True就执行代码&#xff0c;如果表达式的值是False就跳过语句执行后面语句 ageint(input(请输入你的年龄&#xff1a;)) i…

C语言例3-31:位移位运算的例子

1. 位移位运算符 左移 <<右移 >>运算对象只能是整型或字符型数据参与位移位运算时&#xff0c;运算对象以二进制形式进行相应的按位运算。 2. 运算规则 移位时&#xff0c;移出的位数全部丢弃&#xff0c;移出的空位补入的数与左移还是右移有关。若是左移&#…

“贷”动“新质生产力”?各大银行出手了!(附产业图谱下载)

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 自去年9月首次提出以来&#xff0c;新质生产力的重要性不断得到强化&#xff0c;今年两会期间&#xff0c;更是被写入了政府工作报告并被列为了十大任务之首。 伴随新质生产力培育元年拉开序幕&#xff0c;金融…

HarmonyOS应用开发者高级认证流程及其题库

一、HarmonyOS应用开发者高级认证 掌握鸿蒙的核心概念和端云一体化开发、数据、网络、媒体、并发、分布式、多设备协同等关键技术能力,具备独立设计和开发鸿蒙应用能力。认证流程如下: 1.1 课程学习 通过在线课程学习,掌握HarmonyOS高级知识。 1.2 考试说明 1、考试需实…

深度学习 精选笔记(12)卷积神经网络-理论基础1

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

Docker启动失败,报错Is the docker daemon running? Is the docker daemon running?

问题&#xff1a; docker没有正常启动 解决方法&#xff1a; systemctl daemon-reload systemctl restart docker.service

【MySql实战--日志系统:一条SQL更新语句是如何执行的?】

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是怎…

LeetCode-60题:排列序列解法一(原创)

【题目描述】 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a;"123" 、"132" 、"213" 、"231"、"312"、…

用户需求沟通的4大常见障碍及解决方案

有效的用户需求沟通对于软件项目的成功至关重要。它可以帮助项目团队更好地理解用户需求&#xff0c;从而设计出更符合用户期望的产品&#xff0c;有助于建立和维护良好的客户关系&#xff0c;提高客户满意度。 因此&#xff0c;我们需重视用户需求沟通中的常见障碍&#xff0c…

低功率接地故障断路器(GFI)控制芯片D4147简介

应用领域 D4147主要用于三线制GFCI输出接口、GFCI芯片断路器、便携式GFCI线路等领域的产品&#xff0c;侦测并防护火线对地故障和零线对负载短路故障。 功能介绍 D4147 为低功率接地故障断路器&#xff08;GFI&#xff09;控制器芯片&#xff0c;用于检测危险的接地故障电流路径…

【原创】JDK17获取CPU占用率、内存占用率以及堆内存使用情况

前言 我之前一篇文章&#xff1a; 【原创】Java获取CPU占用率、内存占用率最简单的方式_java获取cpu使用率-CSDN博客 这篇文章虽然简单&#xff0c;但是只能针对JDK8&#xff0c;换成现在模块化的JDK后&#xff0c;OperatingSystemMXBean类就无法反射获取其中的信息了&#…