逆向 | 逃离鸭科夫 unity mono游戏hook

news/2025/11/11 1:22:02/文章来源:https://www.cnblogs.com/Mz1-rc/p/19208649

逆向 | 逃离鸭科夫 unity mono游戏hook

依旧是处理上一个博客的问题,这次直接用扫内存提jit的方式来找到目标函数,然后进行hook。
之后做详细视频发b站,这里就贴个代码。
好久不手搓硬编码和inlinehook犯了好多错,整个思路一团混乱,不过总算是最后弄对了,下次就思路清晰了。
依旧是frida来操作,方便。
不能信AI的代码,要自己去校验段protect,可能会有问题,AI会想当然的传参数然后没有成功获取到段执行权限(破口大骂)。

P.S.cheatengine的mono功能可以很好的利用,非常好使!事半功倍!!

py:

from __future__ import print_function    # 这里__future__的目的是引入新版本特性
import frida
import sys
import threadingimport timesession = frida.attach('Duckov.exe')# ---------------------------------------------old ver
# 读取js脚本
# with open('hook.js', 'r', encoding='utf-8') as f:
# 	js_hook = f.read()# script = session.create_script(js_hook)# def add_hp(args):
# 	while 1:
# 		time.sleep(5)
# 		print('call add hp')
# 		script.exports.addhp()# t1 = threading.Thread(target=add_hp, args=(0,)) 
# def on_message(message,data):
#     print(message)
# script.on('message', on_message)
# script.load()
# t1.start()
# sys.stdin.read()
# -----------------------------------------------with open('hook_new.js', 'r', encoding='utf-8') as f:js_hook = f.read()
script = session.create_script(js_hook)def on_message(message,data):print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()

js:

function hexToLittleEndianBytes(hexStr) {// 1. 移除0x前缀,确保只保留十六进制字符const pureHex = hexStr.replace(/^0x/i, '');// 2. 补全偶数位(十六进制字符串长度必须为偶数,才是完整字节)const evenHex = pureHex.length % 2 === 1 ? '0' + pureHex : pureHex;// 3. 小端序:从字符串末尾(低位)开始,每2个字符取1字节const bytes = [];for (let i = evenHex.length - 2; i >= 0; i -= 2) {// 截取2个字符(注意:substring(start, end),end是排他的)const byteHex = evenHex.substring(i, i + 2);// 转换为十进制字节值(0-255)const byteValue = parseInt(byteHex, 16);bytes.push(byteValue);}return bytes;
}function scan(pattern) {const locations = new Set();// console.log(Process.enumerateMallocRanges())console.log("-----start scan-----")var sections = Process.enumerateRanges("rwx")console.log(sections)console.log("----------")for (const r of sections) {console.log(`${r.base} : ${r.size} : ${r.protection} : ${r.file}`)for (const match of Memory.scanSync(r.base, r.size, pattern)) {locations.add(match.address.toString());}}var matches = Array.from(locations).map(ptr);console.log('Found', matches.length, 'matches');console.log(matches)return matches
}// Health.hurt函数
var Health_hurt_func = scan('55 48 8B EC 48 81 EC 90 06 00 00 48 89 5D C8')[0]
console.log(Health_hurt_func)// 手搓inlinehook
const codeSize = 1024;
const codeMemory = Memory.alloc(codeSize);
Memory.protect(codeMemory, codeSize, "rwx");
var codeMemoryBytes = hexToLittleEndianBytes(codeMemory.toString());
var Health_hurt_funcBytes = hexToLittleEndianBytes(Health_hurt_func.add(15).toString());var codeBuffer = [0x52,
0x48,0x8b,0x51,0x50,
0x83,0xfa,0x00,
0x75,0x07,
0x5a,
0x48,0xc7,0xc0,0x01,0x00,0x00,0x00,
0xc3,
0x5a,
0x55,
0x48,0x8b,0xec,
0x48,0x81,0xec,0x90,0x06,0x00,0x00,
0x48,0x89,0x5d,0xc8,
0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xe0]
// 修改跳转地址
for (let _i = 0; _i < Health_hurt_funcBytes.length; _i ++){codeBuffer[37+_i] = Health_hurt_funcBytes[_i]
}
console.log(codeBuffer)
codeMemory.writeByteArray(codeBuffer)   // 注入代码
console.log(`inject code addr: ${codeMemory}`)
console.log(codeMemory.toString())// 修改hook地址
//修改原函数
var jmp_code = [
0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xe0
]
for (let _j = 0; _j < codeMemoryBytes.length; _j ++){jmp_code[2+_j] = codeMemoryBytes[_j]
}
console.log(jmp_code)
// 启动hook
Health_hurt_func.writeByteArray(jmp_code)/*
思路:
0x52,
0x48,0x8b,0x51,0x50,
0x83,0xfa,0x00,
0x75,0x07,
0x5a,
0x48,0xc7,0xc0,0x01,0x00,0x00,0x00,
0xc3,
0x5a,
0x55,
0x48,0x8b,0xec,
0x48,0x81,0xec,0x90,0x06,0x00,0x00,
0x48,0x89,0x5d,0xc8,
0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xe0---
0x52,                       push rdx
0x48,0x8b,0x51,0x50,           mov rdx, [rcx+50]
0x83,0xfa,0x00,            cmp edx, 0
0x75,0x09,                 jne $9
0x5a,             pop rdx
0x48,0xc7,0xc0,0x01,0x00,0x00,0x00,        mov rax, 1
0xc3,                ret
0x5a,              pop rdx
0x55,               push rbp // yuan函数开头
0x48,0x8b,0xec,         mov rbp, rsp
0x48,0x81,0xec,0x90,0x06,0x00,0x00,
0x48,0x89,0x5d,0xc8,                    // 共15个字节
0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //跳回去mov rax, 0xxxxxxxxxxxx
0xff,0xe0           jmp rax
------------------------
var jmp_code = [
0x48,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xff,0xe0
]*/// var origin_code = Health_hurt_func.readByteArray(15)// hook不好返回
// Interceptor.attach(ptr(Health_hurt_func),{
//     onEnter: function(args){
//         console.log('[*] Health_hurt_func !!!')
//         var _rcx = this.context.rcx
//         var team = _rcx.add(0x50).readU64()
//         console.log(`team: ${team}`)
//         if (team == 0x100000000){
//             console.log("is player!")
//             // args.returnValue = 1
//             this.context.rax = ptr("0")
//             this.return()
//         }
//         console.log("\n-----------------------\n")
//     },
//     // onLeave: function(retval){
//     //     console.log("retval: "+retval)
//     // }
// });

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

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

相关文章

AI降重避坑指南:如何有效降低论文AI检测率?

AI降重避坑指南:如何有效降低论文AI检测率? 一、AI检测原理简析:为何普通改写难以奏效? 随着AI写作工具的普及,学术论文的AI检测也日益严格。目前主流的AI检测系统,如知网、维普、万方等平台的相关机制,不仅仅是…

降AI攻略:博主实测经验分享

降AI攻略:博主实测经验分享 一、为什么AI生成的文本容易被检测? 现在AI写作工具越来越普及,但随之而来的是AI检测技术的升级。很多同学和我抱怨,自己用AI写的内容很容易被系统识别出来,尤其是学术论文,一旦被判定…

论文降AI,如何高效又保真? - BUAA

一、为何论文降AI成为科研刚需? 随着AI写作工具的普及,学术论文中的AI生成痕迹检测日益严格。学校和期刊不仅要求查重率达标,更对AI生成内容零容忍。一旦被判定为AI辅助过度,轻则要求重写,重则影响答辩甚至学术信…

20251110 之所思 - 人生如梦

20251110 之所思今天来了很多国外的同事,有印度的,德国的,韩国的,一起开workshop讨论一些事情,但是感觉到自己面对不太熟的同事发言时有点紧张,到网上查了一下,可能有轻微的社交恐惧:恐惧的表面原因:总是担心…

import { random, guid } from uview-plus;报错找不到uview-plus

官方文档很多这种import { random, guid } from uview-plus; 这会报错,说找不到uview-plus,因为我使用的Hbuilder的导入方式,我猜要使用npm的方式才能用from "uview-plus",而Hbuilder方式采用 @/uni_modul…

*题解:P3960 [NOIP 2017 提高组] 列队

原题链接 解析 考虑 \(x = 1\) 怎么做,可以发现此时只有第 \(1\) 列和第 \(m\) 行会发生变动,将其拼起来可以视作一个数列,操作就是单点删除和结尾插入。怎么维护呢?不一定要平衡树,有一种用树状数组的做法:维护…

PyTorch - whats the difference between models training mode and evaluation mode?

PyTorch - whats the difference between models training mode and evaluation mode?In PyTorch, a model can operate in two main modes:Training mode — activated by calling model.train()Evaluation mode — …

【CI130x 离在线】C++ 11智能指针 std::unique_ptr

std::unique_ptr 是 C++11 引入的特性! C++ 智能指针的发展历程版本 年份 智能指针特性C++98 1998 std::auto_ptr(有缺陷,已废弃)C++11 2011 ✅ std::unique_ptr✅ std::shared_ptr✅ std::weak_ptrC++14 2014 std…

Doxygen 入门

Doxygen 可以通过解析代码中的特殊注释来生成详细的文档。以下是完整的操作流程: 1. 安装 Doxygen Windowsbash# 使用 Chocolatey choco install doxygen# 或从官网下载安装包 # https://www.doxygen.nl/download.htm…

第21天(简单题中等题 二分查找、排序)

打卡第二十一天 3道简单题+1道中等题题目:两个数组的交集 给定两个数组nums1和nums2,返回它们的交集.输出结果中的每个元素一定是唯一的。可以不考虑输出结果的顺序。 思路: 排序+双指针代码: class Solution { publi…

CSAPP学习笔记(施工中)

CSAPP 信息的处理和表示 数字的存储 内存被划分为不同大小的字块,32位CPU->4字节,64位CPU->8字节 对字长\(w\)的机器而言,虚拟地址范围为\(0~2^w-1\),即有\(2^w\)个字节 64位架构地址空间限制为48位虚拟地址…

当Mb连不上虚拟机的时候,这是因为啥?我应该怎么解决?? - fish666

就是当Mb连不上虚拟机的时候,这是因为啥?我应该怎么解决?? 首先,就是物理机ping一下虚拟机,看看能不能ping通,,虚拟机ping一下物理机(192.168.236.1)他是1,看看能不能ping通。 如果不能ping通的话,表明物理机…

计算不确定度

假如有数据,13.99 15.07 13.98 14.12 14.69 15.31 14.82 15.01 14.71,要计算其不确定度u A=[13.99 15.07 13.98 14.12 14.69 15.31 14.82 15.01 14.71]; col=size(A,2); s=zeros(1,col); B=A-mean(A); C=B.*B; u=sqr…

会议开了一整天,记录却只有三行?

你知道67%的会议没有有效纪要吗?本文分享一个专业的会议纪要AI指令,能将混乱的会议内容快速转化为结构化、可追踪的专业文档。完整引用原始指令,支持DeepSeek、通义千问等国产AI工具,30分钟生成专业纪要,让每次会…

Day17盒子模型中设置外边距时的问题

外边距问题1之合并现象<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initia…

基于Github Action 配置Java Python Go. Rust Nodejs C++ 实现自动发布功能

需求:基于Github Action 配置Java Python Go. Rust Nodejs C++ 实现自动发布功能。 Java Python Go Rust C++ NodeJshttp://www.cnblogs.com/Jame-mei

File文件

1.读取文件内容读取方法 底层操作(核心) 上层处理(对字节的后续操作) 适用场景read 读取字节到 &mut [u8] 数组 直接使用字节(不做任何转换) 二进制文件分块读、大文件read_to_end 读取所有字节到Vec<u8&…

2025 年 11 月蔬菜配送厂家推荐排行榜,新鲜生鲜水果,有机食堂食材,生鲜蔬菜配送中心,蔬菜配送平台,新鲜蔬菜配送上门公司推荐

2025年11月蔬菜配送行业权威推荐榜单:专业采购决策指南 一、行业背景与发展趋势 随着现代生活节奏的加速和食品安全意识的提升,蔬菜配送行业正经历着前所未有的变革与发展。作为连接农业生产与消费终端的重要纽带,蔬…

TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归

TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

2025 年 11 月食堂承包厂家推荐排行榜:学校、工厂、企业、单位、医院、工地、科技园、工业园、产业园、养老院食堂承包公司精选

2025 年 11 月食堂承包厂家推荐排行榜:学校、工厂、企业、单位、医院、工地、科技园、工业园、产业园、养老院食堂承包公司精选 行业背景与发展趋势 随着企事业单位后勤服务社会化改革的深入推进,食堂承包行业已发展…