游戏修改-ZERO.Sievert.v0.26.0.CHS

游戏使用 GameMaker引擎 数据文件data.win

/*
.text:00588584 8B 2D 80 28 8B 00           mov     ebp, dword_8B2880
.text:0058858A 56                          push    esi
.text:0058858B 8B 43 54                    mov     eax, [ebx+54h]
*/
BOOL	WINAPIV	Hook_ScriptStart(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
	byte		*p;

	p = (BYTE *)Reg.Ebx;
	g_pCurScriptObj = p;
	g_pCurScriptName = *(CHAR **)(g_pCurScriptObj + 0x5C);
	g_pCurScriptCodeObj = *(BYTE **)(g_pCurScriptObj + 0x50);
	g_pCurScriptCode = *(BYTE **)(g_pCurScriptCodeObj + 0x10);
	return TRUE;
}



/*
.text:00588DD0 8B 4E 44                    mov     ecx, [esi+44h]
.text:00588DD3 85 C9                       test    ecx, ecx
.text:00588DD5 79 03                       jns     short loc_588DDA
.text:00588DD7 83 C1 03                    add     ecx, 3
*/
BOOL	WINAPIV	Hook_ScriptNext(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
	byte		*p;

	p = (BYTE *)Reg.Esi;
	g_pCurScriptDat = p;
	g_pCurByteCode = g_pCurScriptDat + 0x44;
	return TRUE;
}

/*
.text:00463040                         SetIndexValue
.text:00463040 FF 35 80 27 8B 00           push    dword_8B2780
.text:00463046 E8 25 A0 12 00              call    sub_58D070
.text:0046304B 8B 0D 80 27 8B 00           mov     ecx, dword_8B2780
*/
BOOL	WINAPIV	Hook_SetIndexValue(VOID *pParam, AsmHook::PUSHAD_DAT Reg)
{
	static	BOOL	s_bShowVal = 0;
	void		*v1, *v2;
	byte		*p;
	double		*dVal;
	int			nIndex;
	DWORD		dwCode;
	
	p = (byte *)Reg.Esp;
	nIndex = *(int *)(p+0x04);
	v1 = *(void **)(p+0x08);
	v2 = *(void **)(p+0x0c);

	if(s_bShowVal && v2)
	{
		dVal = (double *)v2;
		NLog::OutputDbgStr("SetIndexValue: %d-%g\r\n", nIndex, *dVal);
	}

	if(v2 == NULL || g_pCurByteCode == NULL || g_pCurScriptName == NULL)
		return FALSE;

	dwCode = *(DWORD *)g_pCurByteCode;
	dVal = (double *)v2;
	if(nIndex == 100131)
	{
		switch(dwCode)
		{
		case 0x0424:
		case 0x073C:
			NLog::OutputDbgStr("SetIndexValue	%d	%08X	%5g	%s\r\n", nIndex, dwCode, *dVal, g_pCurScriptName);
			*dVal *= 4;
			break;
		default:
			break;
		}
	}

	if(nIndex == 100300)
	{
		if(*dVal < 100000)
		{
			NLog::OutputDbgStr("SetIndexValue	%d	%08X	%5g	%s\r\n", nIndex, dwCode, *dVal, g_pCurScriptName);
			*dVal *= 4;
		}
	}

	return TRUE;
}

BOOL	CZEROSievert::Init(HMODULE hModule, DWORD dwSize)
{
	CHAR		*pHexFun;
	BOOL		bRetVal;

	m_hModule = hModule;
	m_dwModSize = dwSize;

	pHexFun = "8B5DF8F20F1007F20F5C03F20F1101E9E2000000";
	bRetVal = HookHex(pHexFun, OnDoSub_DD);
	pHexFun = "FF3580278B00E825A012008B0D80278B00";
	bRetVal = HookHex(pHexFun, Hook_SetIndexValue);
	pHexFun = "8B4E4485C9790383C103";
	bRetVal = HookHex(pHexFun, Hook_ScriptNext);
	pHexFun = "8B2D80288B00568B4354";
	bRetVal = HookHex(pHexFun, Hook_ScriptStart);

	return TRUE;
}
posted @ 2023-01-18 17:36  Yofoo  阅读(87)  评论(0编辑  收藏  举报