首页
社区
课程
招聘
[原创]UnityPlayer.dll加载GameAssembly.dll的流程
发表于: 2024-12-30 15:15 1831

[原创]UnityPlayer.dll加载GameAssembly.dll的流程

2024-12-30 15:15
1831

使用的版本:Unity6000.025 il2cpp版本:31

想要加密GameAssembly.dll,就需要知道Unity是加载GameAssembly.dll的顺序,本文将会从IDA打开UnityPlayer.dll开始,详细讲解加载流程

0x0 exe还是dll

首先要确定两件事:GameAssembly.dll的加载属于自动加载还是手动加载?GameAssembly.dllGame.exe加载还是UnityPlayer.dll加载?

直接给出结论:查看PE,IDA之后得知:GameAssembly.dllUnityPlayer.dll手动加载

0x1 从字符串到HMODULE

IDA打开后直接搜索字符串GameAssembly.dll,直接定位到第一个使用此字符串的函数,往下一翻,发现了一处打印

1
2
3
4
...
if ( !Result )
  UnityPlayer_MessageBox("Failed to load il2cpp"); // 这里的函数名是我自己改的,内部使用了MessageBox
...

如果你把GameAssembly.dll删掉,加载不成功,就会出现这个报错。

那么任务目标就变成了:找出计算Result的位置,这个位置一定也加载了GameAssembly.dll

函数的开头是这样的:

1
2
3
4
5
6
7
8
9
10
...
LOBYTE(Block[0]) = 0;
v58 = 31;
strcpy((char *)sub_7FFF0024C970((__int64 *)Block, 0x10ui64), "GameAssembly.dll");
if ( (v58 & 0xC0) != 0 )
    Block[2] = (void *)16;
else
    v58 = 15;
Result = LoadGameAssemblyAndGetResult(Block); // 这里的名字也是我自己改的
...

这里基本上可以确定:LoadGameAssemblyAndGetResult实现了通过名字加载dll,我们直接一路追踪Result,就能得到产生这个数据的位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
HMODULE __fastcall 函数名(const WCHAR *a1, __int64 a2)
{
  HMODULE result; // rax
  __int128 v4; // [rsp+20h] [rbp-29h]
  __int64 v5; // [rsp+30h] [rbp-19h]
  __int128 v6; // [rsp+50h] [rbp+7h]
  __int128 v7; // [rsp+60h] [rbp+17h]
  __int128 v8; // [rsp+60h] [rbp+17h]
  __int128 v9; // [rsp+90h] [rbp+47h]
 
  result = LoadLibraryW(a1); // 对这里进行了断点调试,输入的a1就是GameAssembly.dll
  if ( !result )
  {
    LODWORD(v5) = 36;
    *(_QWORD *)&v4 = "C:\\build\\output\\unity\\unity\\External\\baselib\\baselib\\Source\\WinApi\\Baselib_DynamicLibrary_WinApi.inl.h";
    *((_QWORD *)&v4 + 1) = "Baselib_DynamicLibrary_OpenUtf16";
    *(_QWORD *)&v7 = 0i64;
    DWORD2(v7) = 0;
    WORD6(v7) = 0;
    v9 = v7;
    DWORD2(v9) = 100663296;
    *(_QWORD *)&v6 = v5;
    v8 = v9;
    BYTE12(v8) = 1;
    *((_QWORD *)&v6 + 1) = GetLastError();
    if ( !*(_DWORD *)(a2 + 40) )
    {
      *(_OWORD *)a2 = v4;
      *(_OWORD *)(a2 + 16) = v6;
      *(_OWORD *)(a2 + 32) = v8;
    }
    return (HMODULE)-100i64;
  }
  return result;
}

这里调用了LoadLibraryW,可以确定就是加载的位置了


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回