找回密码
 立即注册
查看: 524|回复: 3

[笔记] Unity3d反编译破解游戏

[复制链接]
发表于 2022-10-11 13:09 | 显示全部楼层 |阅读模式
本篇文章会给大家介绍下如何反编译破解游戏。使用ildasm反编译DLL修改然后重新编译DLL,然后对于重编Mono进行加密过的,可以借助IDA来破解,如下:

1、首先去下载个IDA。
我这里以Win系统的游戏为例。
加密过的DLL拖到 .net reflector 中是无法反编译的



下面开始借助IDA进行破解
打开IDA,载入游戏



选择EXE文件载入



然后点击OK,开始载入游戏



稍等几分钟之后,IDA就对游戏反编译完成了,会自动断点到 Main 函数。




用 F9 往下走,会弹出 Exception ,不用管,点确定 。



这时候在 Modules 中就出现了 Mono.dll ,我们的目标就是在 Mono.dll 中获取解密后的DLL的数据。



双击 mono.dll ,就会列出 mono.dll 中的函数,ctrl+f 搜索 image




找到之前文章提到过的加密函数 mono_image_open_from_data_with_name
选中函数,按 F5进行反编译这个函数



左边是反编译出来的代码。

用反编译出来的代码与Mono源代码进行对比,找到最终传递解密数据的代码,找到DLL数据以及DLL数据长度的变量V10 V11.




在左边双击 v10 进入v10 的定义,得到 var_8




同样,得到v11 == arg_4



回到函数列表,右键 mono_image_open_from_data_with_name 函数,添加断点



添加断点后,坐标会有红色标记



好,一直F9往下走,中间会有各种 Exception,全部Yes ,一直往下走,直到走到了设置的断点处。



到了断点处之后,在左边往下翻,找到arg_4 和 var_8 连续出现的代码段落。



F2下断点,然后F9 运行到断点处。



寄存器 ECX 中存储了 DLL数据长度值!!!

然后 继续往下走。
EAX中存储了 DLL数据地址!!!!!

Shift+F2 调出脚本编辑器,输入脚本
auto fp, dexAddress;  
fp = fopen("C:\\ass1.dll", "wb");  
for ( dexAddress=0x0AF60020;dexAddress < 0x0AF60020+0x0027B400;dexAddress++ )  
fputc(Byte(dexAddress), fp);   
点击Run 执行脚本,Dump出DLL的数据



这样就导出了解密后的DLL,剩下的就是反编译DLL为IL代码、修改IL代码、重新编译IL为DLL、重新打包APK等步骤了。

根据上面破解DLL的步骤,想到的最直接的防止被破解的办法就是,修改Mono函数名 mono_image_open_from_data_with_name 为其它名字。其它方法各种百度。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-10-11 13:18 | 显示全部楼层
话说安卓该怎么办?
发表于 2022-10-11 13:25 | 显示全部楼层
请教下,安卓unity游戏方面的,jnilibs里的各种so文件是游戏里java代码与底层的交互桥梁,dll文件是c#的打包,其实so就是与c#的dll交互是吗?那so文件需要反编译并重新生成吗?还是原来的so也能用?
发表于 2022-10-11 13:26 | 显示全部楼层
问一下 手游呢  没有exe
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-27 21:54 , Processed in 0.092241 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表