unity3D游戏的Assembly-CSharp-firstpass.dll代码解密
本帖最后由 tongtong123 于 2017-8-30 22:16 编辑最近想分析某游戏,发现是用unity3D开发的;解压apk,在assets\bin\Data\Managed下有Assembly-CSharp-firstpass.dll,游戏的代码就是在这里,是用C#开发的。
用Reflector软件打开,结果发现打不开,是加密的。
通过借鉴这篇文章http://www.xuanyusong.com/archives/3553,在apk压缩包找到lib\armeabi-v7a\libmono.so,用ida打开,定位到mono_image_open_from_data_width_name方法,
即可找到解密函数,如下图。
根据分析的解密函数,就可以对Assembly-CSharp-firstpass.dll进行解密啦,这里我用Java代码读取Assembly-CSharp-firstpass.dll进行解密。
解密后就可以用Reflector打开了,就可以进行分析了。
int __fastcall mono_image_open_from_data_with_name(char *a1, size_t a2, int a3, signed int *a4, char a5, int a6)
{
int v6; // r9@1
char *v7; // r5@1
size_t v8; // r6@1
signed int *v9; // r7@1
char *v10; // r3@4
unsigned int v11; // r2@6
unsigned int v12; // t1@6
signed int v13; // r3@10
char *v14; // r0@13
char *v15; // r4@13
int v16; // r0@18
char v17; // r3@18
int v18; // r4@18
int v19; // r0@19
int v20; // r0@21
int v21; // r3@21
size_t v23; // @1
v23 = a2;
v6 = a3;
v7 = a1;
v8 = a2;
v9 = a4;
g_log(0, 16, "unity: read dll:%s", a6);
if ( *v7 == 89 )
{
g_log(0, 16, "decode dll name: %s lenth %d \n", a6, v8, v23);
v10 = v7;
while ( v10 != &v7 )
{
v12 = (unsigned __int8)*v10++;
v11 = v12;
if ( !(v12 & 0x80) )
*(v10 - 1) = 8 * v11 & 0x7F | (v11 >> 4);
}
}
if ( !v8 )
{
if ( !v9 )
return 0;
v13 = 3;
goto LABEL_16;
}
if ( !v6 )
goto LABEL_18;
v14 = (char *)g_malloc(v8);
v15 = v14;
if ( v14 )
{
memcpy(v14, v7, v8);
v7 = v15;
LABEL_18:
v16 = g_malloc0(872);
v17 = *(_BYTE *)(v16 + 16);
v18 = v16;
*(_DWORD *)(v16 + 8) = v7;
*(_DWORD *)(v16 + 12) = v8;
*(_BYTE *)(v16 + 16) = v17 & 0xFD | 2 * (v6 & 1);
if ( a6 )
v19 = g_strdup(a6);
else
v19 = g_strdup_printf("data-%p", v7);
*(_DWORD *)(v18 + 20) = v19;
v20 = g_malloc0(396);
v21 = (unsigned __int8)(*(_BYTE *)(v18 + 16) & 0xF7) | 8 * (a5 & 1);
*(_DWORD *)v18 = 1;
*(_BYTE *)(v18 + 16) = v21;
*(_DWORD *)(v18 + 44) = v20;
if ( do_mono_image_load(v18, v9) )
return register_image();
return 0;
}
if ( v9 )
{
v13 = 1;
LABEL_16:
*v9 = v13;
}
return 0;
}
这个是解密函数吗 复制……粘贴……找不到
定睛一看,with我懂,width是啥:)
通过借鉴这篇文章http://www.xuanyusong.com/archives/3553,在apk压缩包找到lib\armeabi-v7a\libmono.so,用IDA打开,定位到mono_image_open_from_data_width_name方法,
多了一个d 本帖最后由 tongtong123 于 2017-8-30 22:18 编辑
第一次发帖,上传个图片搞好久!!! il2cpp越来越多
用mono的强度慢慢也越来越大
比如说……日服的fgo就挺适合练手的(笑 感谢分享,正学习这方面的东西,多谢! 学习学习hhhhh 我很赞同! {:1_918:}最近在搞u3d的脱机,mark一下,以后也许用得到。 给楼主一点支持 如何用解密函数解密dll,能再详细点吗。谢谢
感谢分享。可以看代码了