tongtong123 发表于 2017-8-30 21:57

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打开了,就可以进行分析了。

linfengtai2008 发表于 2017-11-9 13:38

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;
}
这个是解密函数吗

.·.·. 发表于 2018-9-19 00:14

复制……粘贴……找不到
定睛一看,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:00

本帖最后由 tongtong123 于 2017-8-30 22:18 编辑

第一次发帖,上传个图片搞好久!!!

艾莉希雅 发表于 2017-8-30 22:29

il2cpp越来越多
用mono的强度慢慢也越来越大
比如说……日服的fgo就挺适合练手的(笑

gunxsword 发表于 2017-8-30 23:48

感谢分享,正学习这方面的东西,多谢!

第C君 发表于 2017-8-31 00:10

学习学习hhhhh

安卓iphone 发表于 2017-8-31 00:24

我很赞同!

lingbowen888 发表于 2017-8-31 01:34

{:1_918:}最近在搞u3d的脱机,mark一下,以后也许用得到。

北海巡洋舰 发表于 2017-8-31 07:31

给楼主一点支持

ps122 发表于 2017-8-31 08:32

如何用解密函数解密dll,能再详细点吗。谢谢

henry1118 发表于 2017-8-31 08:56

感谢分享。可以看代码了
页: [1] 2 3 4 5
查看完整版本: unity3D游戏的Assembly-CSharp-firstpass.dll代码解密