首页 > 其他分享 >游戏中脚本方式值修改-Godot Engine

游戏中脚本方式值修改-Godot Engine

时间:2024-10-10 10:34:02浏览次数:7  
标签:Engine __ Godot 游戏 text void Variant Hook pReg

游戏为 Tower.Tactics.Liberation
游戏使用引擎 Godot Engine, 版本3.5.2
游戏中的数值全是脚本中修改, 内部名称为GDScript

游戏运行中脚本的主函数为GDScriptFunction__call, 脚本运行时的ip值只有在栈上储存, 需要在函数中间Hook, 获取到脚本的ip, 顺便一起获取codeptr

AsmHook::HOOK_INFO	Info_GDScript_CodeIp;
BOOL WINAPIV Hook_GDScript_CodeIp(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	COtherHook	*pThis = (COtherHook *)pUserParam;

#ifdef _WIN64
	gpCodePtrRun = (int *)pReg->rdx;
	codeip = (int)pReg->rax;

	return TRUE;
#endif

	return TRUE;
}

/*
.text:000000014025DE9A 4C 8B 65 38                                mov     r12, [rbp+5D0h+script]
.text:000000014025DE9E 4C 8B 75 18                                mov     r14, [rbp+5D0h+p_stack]
.text:000000014025DEA2 E9 49 93 FF FF                             jmp     loc_1402571F0
.text:000000014025DEA7                            ; ---------------------------------------------------------------------------
.text:000000014025DEA7
.text:000000014025DEA7                            loc_14025DEA7:                          ; CODE XREF: GDScriptFunction__call+A45↑j
.text:000000014025DEA7 48 8D 42 FC                                lea     rax, [rdx-4]
*/
BOOL	COtherHook::HookGDScript_CodeIp()
{
	BOOL	bRetVal;

	bRetVal = m_pMgr->HookItem(Hook_GDScript_CodeIp, this, &Info_GDScript_CodeIp, 0, "4C8B65384C8B7518E94993FFFF488D42FC");
	return TRUE;
}

实际修改值在 Variant__SetVal, 如游戏中gold修改
判断条件:

  1. 修改的值类型 double
  2. 当前的ip
  3. 当前ip的代码片段hash
AsmHook::HOOK_INFO	Info_Variant__SetVal;
BOOL WINAPIV Hook_Variant__SetVal(VOID *pUserParam, AsmHook::PUSHAD_DAT *pReg)
{
	COtherHook	*pThis = (COtherHook *)pUserParam;
	static	void *	DbgPtr = (void *)0x16059768;
#ifdef _WIN64
	void		*param64[8];
	void		*backaddr;
	void		*Self, *Value;
	Variant		*pValue, *pSelf;
	DWORD		dwHash;
	double		dAddVal;

	Self = (void *)pReg->rcx;
	Value = (void *)pReg->rdx;

	pSelf = (Variant *)Self;
	pValue = (Variant *)Value;
	if(pSelf->type == Variant::REAL)
	{
		if(DbgPtr == &pSelf->_data._real)
			int ccc = 0;
		if(codeip == 0x0b)
		{
			dwHash = NData::HashData(gpCodePtrRun+codeip, sizeof(int)*16);
			if(dwHash == 0x120ec788)
			{
				dAddVal = pValue->_data._real - pSelf->_data._real;
				if(dAddVal > 0.0)
				{
					dAddVal *= 8;
					pValue->_data._real = pSelf->_data._real + dAddVal;
					NSys::TraceL("Gold add mul 8");;
				}
			}
		}
	}

	return TRUE;
#endif

	return TRUE;
}


/*
.text:0000000141A93090 48 3B CA                                   cmp     rcx, rdx
.text:0000000141A93093 0F 84 73 03 00 00                          jz      locret_141A9340C		//	包含jmp  无法Hook
.text:0000000141A93099 48 89 5C 24 10                             mov     [rsp+arg_8], rbx		//	从这开始Hook
.text:0000000141A9309E 48 89 6C 24 18                             mov     [rsp+arg_10], rbp
.text:0000000141A930A3 56                                         push    rsi
.text:0000000141A930A4 57                                         push    rdi
.text:0000000141A930A5 41 54                                      push    r12
.text:0000000141A930A7 41 56                                      push    r14
.text:0000000141A930A9 41 57                                      push    r15
.text:0000000141A930AB 48 83 EC 40                                sub     rsp, 40h
*/
BOOL	COtherHook::HookVariant__SetVal()
{
	BOOL	bRetVal;

	bRetVal = m_pMgr->HookItem(Hook_Variant__SetVal, this, &Info_Variant__SetVal, 0, 
							   "483BCA0F847303000048895C241048896C241856574154415641574883EC40", NULL, 9);
	return TRUE;
}

标签:Engine,__,Godot,游戏,text,void,Variant,Hook,pReg
From: https://www.cnblogs.com/zzz3265/p/18455812

相关文章

  • 游戏百科网站系统,这个项目要怎么去设计呢?附源码
    其实设计一个游戏百科网站系统,如同打造一把钥匙,开启通往无限游戏世界的门户。这个系统将是一座桥梁,连接着热爱游戏的玩家们与无尽游戏知识。它不仅需要是信息丰富的百科全书,还应是活泼、互动的社区。现在,让我们开始这段设计之旅。需求分析与目标设定玩家的声音:我们深入论坛,......
  • 蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推
    蓝禾,汤臣倍健,三七互娱,得物,顺丰,快手,游卡,oppo,康冠科技,途游游戏,埃科光电25秋招内推①蓝禾【岗位】国内/国际电商运营,设计,研发,营销,职能,工作地:深圳【校园大使推荐码】71T3HES【一键内推】https://sourl.cn/68rjxY②得物【八大职类】技术、供应链、产品、运营、设计、职能、商......
  • C++消灭星星游戏编程【目录】
    欢迎来到zhooyu的专栏。主页:【zhooyu】专栏:【C++消灭星星游戏编程】特色:【保姆级教程,含每一课程源码】致力于用最简洁的语言,最简单的方式,最易懂的知识,带大家享受编程的快乐。消灭星星游戏编程演示效果消灭星星游戏编程演示效果本专栏内容:消灭星星的小游戏保姆......
  • Unity ML-Agents: 革新游戏AI开发的开源工具包
    ml-agentsUnityML-Agents:革新游戏AI开发的开源工具包UnityML-Agents(MachineLearningAgents)是UnityTechnologies推出的一个开源项目,旨在将游戏和模拟环境转变为训练智能代理的平台。这个工具包为游戏开发者和AI研究人员提供了一个强大而灵活的框架,使他们能够轻松地在Un......
  • 创建一个类实现一个打字小游戏(利用time.time()计算参赛者的打字时间,进而利用时间计算
    #打字小游戏面向过程,面向对象#游戏类==》属性、行为##1.外部传入一些数据,数据单词列表[movies,add,open]#2.随机的抽取这个单词列表中的一个单词,作为本局游戏的单词!#3.游戏开始,游戏的展示,游戏的结束,游戏时间,游戏的正确率等importrandom#随机给出列表......
  • 陪玩系统软件平台如何搭建?游戏陪玩陪聊公众号小程序源码
    陪玩管理系统建立一个陪玩团的流程陪玩工作室运营模式陪玩管理系统登录游戏陪玩怎么做陪玩接待怎么做系统之最强陪玩游戏陪玩系统源码下载一、陪玩行业:游戏陪玩领域国内已经很成熟。二、陪聊行业:同上。三、技能服务:家政、保洁等其他服务领域。系统基于TP6+Uni-app框架开......
  • d3drm.dll文件丢失修复指南:恢复游戏和软件正常运行
    d3drm.dll是DirectX3DRetainedMode(Direct3D保留模式)的一部分,这种模式在较旧的DirectX版本中使用。如果你遇到这个DLL文件缺失的问题,可以尝试以下几种方法来解决:重新安装或更新DirectX修复工具:访问微软官方网站下载并安装最新的DirectX修复工具。如果你运行的是较老的游......
  • 头脑游戏
    MSIAhgdAHAGOOOOAybcsiQOSDhsm.[ARC154D]A+B>C?先看看什么是我们容易得到的:排列的边界情况要么是\(1\)要么是\(n\),对于\(n\),我们并不能方便的找到什么性质,但是对于\(1\),\(1+1=2\not>\operatorname{others}\),而且\(1\)容易和大于号联系起来。再观察一下询问:可以......
  • 学霸带你游戏化 GameMaker 引擎世界你好
    学霸带你游戏化GameMaker引擎世界你好得分系统与玩家控制在现代游戏开发中,得分系统和玩家控制是构建互动游戏体验的核心元素。得分系统不仅用来衡量玩家的表现,也为游戏增添了挑战和激励。而玩家控制则包括了角色的移动、旋转等操作,这些控制方式直接影响到游戏的流畅......
  • 学霸带你游戏化反馈机制助力个人成长和发展
    反馈的重要性在学习和工作中,反馈的作用不可忽视。它不仅帮助个人识别优缺点,还能引导有效的改进。通过合理利用反馈,学习者能够提升自身能力,增强自信心,从而在不同领域取得更好的成绩。反馈的类型多种多样,包括及时反馈、建设性反馈和同伴反馈等,各有其独特的优势和适用场景。接下......