#逆向?-Bro

😲5ea1


没活了,咬个打火机,搞点杂七杂八的

24D601C9D80
24D601C70E0
存放血量的内存位置会变
1


操作血量位置的一共有三个地方
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] 升级或者战斗结束,重置血量
2
具体血量的计算逻辑是操作其他变量
两个变量跟血量有关,一个持久,一个一局换一次
3
重新开了把新的,再监视了一下,发现一点妙妙的东西
4
5
虽然存放血量的位置变化了,但是操作血量的汇编代码地址保持不变
即使重新打开游戏,修改血量的逻辑还是保持在同一个地址,所以只需要hook操作血量的汇编代码即可
6


小结

对于血量而言,持久显示的是用于展示血量的变量,该变量末尾为0;定时清除的是当前血量数据,该变量末尾为8。
血量存储的位置在内存中不固定,汇编代码的地址偏移固定;但是可能有素材数据加载的情况,用在进程中的基址在ida中直接找不到这段代码。
代码直接能改,但是这段mov指令复用很高,[rbx+08]地址指向的内存值是一个0-5(?的一个int,这个int可能代表了mov指令处于的一个情况;血量的跳转和ZF指示器相关;
修改jmp指令构建永恒跳转无效,代码进入口和jmp无关

改汇编

附加调试器

地址表(已弃用)

8
9


打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)