【软件逆向-UnityPlayer.dll加载GameAssembly.dll的流程】此文章归类为:软件逆向。
使用的版本:Unity6000.025 il2cpp版本:31
想要加密GameAssembly.dll,就需要知道Unity是加载GameAssembly.dll的顺序,本文将会从IDA打开UnityPlayer.dll开始,详细讲解加载流程
0x0 exe还是dll
首先要确定两件事:GameAssembly.dll的加载属于自动加载还是手动加载?GameAssembly.dll从Game.exe加载还是UnityPlayer.dll加载?
直接给出结论:查看PE,IDA之后得知:GameAssembly.dll从UnityPlayer.dll手动加载
0x1 从字符串到HMODULE
IDA打开后直接搜索字符串GameAssembly.dll,直接定位到第一个使用此字符串的函数,往下一翻,发现了一处打印
1 2 3 4 | ...
if ( !Result )
UnityPlayer_MessageBox("Failed to load il2cpp");
...
|
如果你把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;
__int128 v4;
__int64 v5;
__int128 v6;
__int128 v7;
__int128 v8;
__int128 v9;
result = LoadLibraryW(a1);
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,可以确定就是加载的位置了
更多【软件逆向-UnityPlayer.dll加载GameAssembly.dll的流程】相关视频教程:www.yxfzedu.com