#逆向?-Bro
2025-04-01
3 min read
😲5ea1
没活了,咬个打火机,搞点杂七杂八的
24D601C9D80
24D601C70E0
存放血量的内存位置会变
操作血量位置的一共有三个地方
7FF7E14CA895 - 48 8B 47 08 - mov rax,[rdi+08] 持续不断的维护血量
7FF7E14C2558 - 48 89 43 08 - mov [rbx+08],rax 受到伤害维护血量
7FF7E14C2554 - 48 8B 47 08 - mov rax,[rdi+08] 升级或者战斗结束,重置血量
具体血量的计算逻辑是操作其他变量
两个变量跟血量有关,一个持久,一个一局换一次
重新开了把新的,再监视了一下,发现一点妙妙的东西
虽然存放血量的位置变化了,但是操作血量的汇编代码地址保持不变
即使重新打开游戏,修改血量的逻辑还是保持在同一个地址,所以只需要hook操作血量的汇编代码即可
小结
对于血量而言,持久显示的是用于展示血量的变量,该变量末尾为0;定时清除的是当前血量数据,该变量末尾为8。
血量存储的位置在内存中不固定,汇编代码的地址偏移固定;但是可能有素材数据加载的情况,用在进程中的基址在ida中直接找不到这段代码。
代码直接能改,但是这段mov指令复用很高,[rbx+08]地址指向的内存值是一个0-5(?的一个int,这个int可能代表了mov指令处于的一个情况;血量的跳转和ZF指示器相关;
修改jmp指令构建永恒跳转无效,代码进入口和jmp无关
改汇编
附加调试器
地址表(已弃用)
打mod
test.zip
mods-unpacked
└───test
│ manifest.json
│ mod_main.gd
│
└───extensions
└───singletons
player_run_data.gd
manifest.json
{
"name": "test",
"namespace": "seal",
"version_number": "0.0.0",
"description": "Change init stat",
"website_url": "",
"dependencies": [],
"extra": {
"godot": {
"incompatibilities": [],
"authors": ["seal"],
"compatible_mod_loader_version": ["6.2.0"],
"compatible_game_version": ["1.1.0.0"],
"config_defaults": {}
}
}
}
mod_main.gd
extends Node
const TEST_DIR := "test"
const TEST_LOG := "test:Main"
var mod_dir_path := ""
var extensions_dir_path := ""
var translations_dir_path := ""
# Before v6.1.0
# func _init(modLoader = ModLoader) -> void:
func _init() -> void:
mod_dir_path = ModLoaderMod.get_unpacked_dir().plus_file(TEST_DIR)
# Add extensions
install_script_extensions()
# Add translations
#add_translations()
func install_script_extensions() -> void:
extensions_dir_path = mod_dir_path.plus_file("extensions")
ModLoaderMod.install_script_extension(extensions_dir_path.plus_file("singletons/player_run_data.gd"))
# extensions_dir_path = mod_dir_path.path_join("extensions") # Godot 4
#func add_translations() -> void:
# translations_dir_path = mod_dir_path.plus_file("translations")
# ModLoaderMod.add_translation(translations_dir_path.plus_file(...))
func _ready() -> void:
ModLoaderLog.info("Ready!", TEST_LOG)
# var subscribed_items = Platform.get_subscribed_mods()
# for item_dir in subscribed_items:
# ModLoaderLog.info(item_dir,TEST_LOG)
# ModLoaderLog.info("get_subscribed_mods success!",TEST_LOG)