首页 > 其他分享 >ACV1引擎寻找ScriptHook地址

ACV1引擎寻找ScriptHook地址

时间:2022-11-17 02:22:35浏览次数:72  
标签:v20 函数 int PBYTE ScriptHook 地址 引擎 ACV1 DWORD

ACV1引擎寻找ScriptHook地址

0x00 前言

为了实现不封包即对游戏的脚本文件进行修改

此处需要Hook相关位点

Hook功能已经在ACV1FileHook中实现

但是需要寻找两个地址

第一个地址是LoadScript函数的地址,该函数传入脚本文件的Hash文件名和一个记录信息的结构体地址

第二个地址是DecScript函数的地址,该函数对脚本文件进行解密

DWORD CDECL DecScript(
    PBYTE pDecBuffer, 
    PDWORD pdwDecSize, 
    PBYTE pRawBuffer, 
    DWORD dwRawSize);
DWORD CDECL LoadScript(
    DWORD dwHashHigh, 
    DWORD dwHashLow, 
    PBYTE &UnknownStruct);
LoadScript
{
	ReadRawScript
	DecScript
	InitScript
}

0x01 寻找地址

首先搜索字符串 script/

这是因为LoadScript函数的实现末尾有一个对脚本进行加载的函数InitScript

该函数中的一个参数是该字符串常量,此处IDA识别有点问题。

我们可以通过该函数的参数定位出LoadScript函数

下面可以看到InitScript函数,DecScriptFile就在其上面不远处

DecScriptFile其下面会有个 ulltos32 这是明显的特征

换句话说,你只要找到 script/ 使用处

然后往上翻阅,到第二个 ulltos32 call的地方,其上那个函数就是DecScriptFile

  }
  if ( DecScriptFile((PBYTE)decBuffer, &decSize, (PBYTE)rawBuffer, szie) )
  {
    v32 = 1;
    v19 = ulltos32((int)v37, dwHashLow, hash_high_1);
    UnknownStruct = (PBYTE *)&v25;
    v42 = 1;
    sub_417E50(&v25, v19, &unk_5C1B7C);
    errord(v25, v26, v27, v28, v29, v30, v31, v32);
    if ( v38 >= 0x10 )
      operator delete(v37[0]);
    free(rawBuffer);
    return 0;
  }
  free(rawBuffer);
  v20 = ulltos32((int)v37, dwHashLow, hash_high_1);
  if ( *(_DWORD *)(v20 + 20) >= 0x10u )
    v20 = *(_DWORD *)v20;
  v21 = (char *)&dword_C855B8 - v20;
  do
  {
    v22 = *(_BYTE *)v20;
    v21[v20] = *(_BYTE *)v20;
    ++v20;
  }
  while ( v22 );
  if ( v38 >= 0x10 )
    operator delete(v37[0]);
  v32 = (int)"script/";
  InitScript(
    decBuffer_1,
    decSize,
    (void (__cdecl *)(int, unsigned int, unsigned int, int))ProcessScript,
    (char *)UnknownStruct);
  return 1;

标签:v20,函数,int,PBYTE,ScriptHook,地址,引擎,ACV1,DWORD
From: https://www.cnblogs.com/Dir-A/p/16898154.html

相关文章