Unity3d DLL脚本通用解密方法

article/2025/10/1 19:32:01

   网上已经有很多文章讲解过Unity3d脚本DLL 解密,基本方法原理都差不多,就是通过HOOK或者调试下断mono_image_open_from_data_with_name这个函数拿到解密后的DLL。这些方法都需要比较专业的知识(Hook或者过反调试),另外对于使用了强度比较高的第三方保护,也无能为力。下面我们来探讨一下更为通用简便的U3D脚本DLL解密方法。

一、脚本解密原理

      先来理一下通过mono_image_open_from_data_with_name解密脚本DLL的原理。

      Unity3d游戏的脚本默认情况下是非加密形态,保存于如下图的压缩包目录下,一般情况名字为Assembly-CSharp.dllAssembly-CSharp-firstpass.dll

  

 这样的脚本DLL是由C#语言编写的,可以被类似Reflector之类的工具反编译成源码。破解者得到源码就可以对其进行修改,实现内购破解、修改游戏人物属性(修改金币、HP)、修改战斗技能(无敌、强制胜利等)        

   我们来看下mono_image_open_from_data_with_name这个函数的源码


几个主要函数的参数意义:

data: 脚本内容

data_len:脚本长度

name:脚本名称

这个函数执行了如下几步操作:

1.data指向的脚本拷贝到新申请的内存

2.填充一个MonoImage结构体

3.使用do_mono_image_load初步加载该脚本

4.注册并返回MonoImage结构体指针

    这个原始mono_image_open_from_data_with_name函数,如果输入的data指向的是个加密过的脚本DLL,在这个函数执行之前,先要对该data指向的内存进行解密。

调试解密可在return处下断,此时data指向的内存已经解密,把该处内存拷贝出来即是解密后的DLL

     HOOK解密原理是待mono_image_open_from_data_with_name原始函数返回后拷贝data指向的内存

    不过往往第三方保护都是带反调试的,新手要过掉反调试还是比较费周折的,有些厉害的反调试,老手都不一定过得了。对SOHOOK也是要有一定的技术基础才能做到。

    对于强度稍微高点的保护,这个函数处是拿不到解密后的DLL的,等这个函数返回的时候,内存可能是空的。  

    绝大部分加密,都紧盯着data指向的内存来做文章,认为只要把mono_image_open_from_data_with_name参数里的data加密搞定就万事大吉了,而忽略掉了另一块永久存在的处于解密状态的DLL内存。

    mono_image_open_from_data_with_name第一步就是把data内存使用memcpy拷贝到一块新申请的内存里,这块内存将永久存在,因为C#语言是需要动态解析类、函数等信息的,时不时要用到这块内存。而data待这个函数调用完后,将会被释放掉。

    这也是某些强度比较高的第三方保护,通过那两种方法都得不到解密DLL的关键所在,它在mono_image_open_from_data_with_name函数返回前就把data指向的内存给清空了。

 

二、脚本解密方法

    下面就来讲一下我们的U3D脚本DLL解密方法,原理即是利用了内存中存在的那个memcpy拷贝的DLL

    由于内存中永久存在这个DLL,我们只要全内存搜索这个DLL就可以了。如何全内存搜索呢,自己写个工具还是挺麻烦的一件事。

    其实用手游分析者比较熟悉的一个现成工具就可以做到:烧饼修改器(八门神器等其它修改器也可以),烧饼修改器可以对游戏进行数值搜索。那我们要搜索什么数值呢?

   先用二进制工具hiew来看下Assembly-CSharp.dll


 这是个PE结构的文件,以4d 5a 90 00这四个字节为magic head,这可以做为C# DLL脚本的特征,我们只要搜索0x905a4d这个数值就可以了,由于烧饼修改器是使用10进制数值,将其转换成10进制值:9460301

    下图是使用烧饼修改器搜索一个3D卡车小游戏的示例:


  显示出来的是搜索结果,一共搜索到了12个结果

     第一个搜索结果,即是以52c4c008起始地址的脚本DLL,我们可以使用memdump工具把这块内存DUMP下来,由于不知道大小,dump 0x3000大小来看一下。


保存为abc.dll,再用hiew看下abc.dll


  可以看到DUMP下来的确实是个CSharp脚本DLL,DLL实际大小可通过下图这个FFI工具,解析出来,将第3行的0x10A00加上0x200即是实际大小。可通过这个方法来确定这12DLL,哪个是你需要解密的DLL

  

   这个方法的优点是可以不用去管反调试,也不用去学习怎么HOOK,用现成的工具组合起来就可以做到解密脚本。最重要一点是对保护强度比较高的保护也可以无视。

       (有兴趣的同学可以关注我的微信公众号:sybaohu,以及QQ群:606228104)





http://chatgpt.dhexx.cn/article/mJrMEZsV.shtml

相关文章

Unity3D官方教程爬坑

全是在学官教时遇到的坑,然后数小时后爬出来.同时会添加到处学来的的Unity技巧 ---------------------------------------------------------- 代码: 1.使游戏对象运动的N种方式 更全面的移动方式参考 1、rigidbody.addforce(Vector3 * speed) (见rol…

【Unity3D】自学之路2.0

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 Note: 因上一期 《Unity3D自学之路》 系列教程资源比较旧(2018.7.9) 很多资源图片资源失效 故更新 《Unity3D自学之路2.0》2020.3.11 船新版本 在新的一年,大家一起加…

[转]【Unity3D入门教程】Unity3D简介、安装和程序发布

《Unity3D入门教程》会带领零基础的初学者,一步步学会使用Unity3D来开发简单的应用程序,走近游戏开发的世界。本系列教程虽然不会面面俱到地深入到全部的知识点,但是会涉及到所有入门阶段所需要掌握的必备技能。通过本教程的学习,…

Unity2019(或2020)个人版如何激活使用(不是破解,正规激活流程)

文章目录 一、下载Unity二、登录账号(可用微信号登录)三、激活新许可证(推荐)1、点击激活新许可证2、许可协议3、完成激活 四、手动激活(步骤较多)1、点击手动激活2、保存许可证申请(.alf&#…

【Unity游戏破解】外挂原理分析

文章目录 认识unity打包目录结构 游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包 建议方案锁血飞天无限金币攻击力翻倍 以上统称内存挂透视自瞄压枪瞬移内购破解 Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆 实战查看目录结构用il2cpp dump…

AssetStudio/UnityStudio UABE等 破解Unity游戏

使用AssetStudio/UnityStudio UABE等 破解Unity游戏 前言工具准备前期处理替换图片资源替换配置表/TextAsset替换界面文字/界面UI描述从签名/打包安装/测试 前言 用于研究,学习 工具准备 UABE: 地址:github地址AssetStudio/UnityStudio 地址&#xff…

unity3d手游破解(一)

重点知识: 1. \assets\bin\Data\Managed\Assembly-CSharp.dll扔进Reflectorreflexil环境 2.libs\libmono.so的mono_image_open_from_data_with_name函数 MonoImage *mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, Mon…

【Unity3D】初学加密技巧(反破解)

参考文章: Unity3D研究院之Android加密DLL与破解DLL .SO(八十一) | 雨松MOMO程序研究院 Unity3D研究院之Android二次加密.so二次加密DLL(八十二) | 雨松MOMO程序研究院 Unity 2019.4.0 Mono 编译以及加密 windows版…

2021Unity教程:Unity官方中文版免费下载方法(黑皮肤可选)无需破解!

首先科普两个知识点: 1. Unity官方支持个人免费版,新的学习者和初创公司员工(公司财务规模低于10万美元一年)均可以使用。黑皮肤免费(Unity2019.3以上的版本),基本功能齐全,无需破解…

Unity官方支持中文版啦!!!附教程——无需破解!

Chinar blog :www.chinar.xin Unity安装官方中文版教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —…

Unity游戏逆向及破解方法介绍

背景介绍 随着手游的发展,Unity3D引擎逐渐成为主流的游戏开发解决方案,传统cocos的2D游戏逐渐被取代,一些公司在Unity3D游戏方面的产出也越来越多,如天天飞车,天天来战,全民破坏神,全民偶像&am…

java之成员变量(实例成员变量和静态成员变量)

类的成员 类的成员可以包含以下:字段、方法、代码块、内部类和接口等。此处我们重点介绍字段. 1.1字段/属性/成员变量 在类中, 但是方法外部定义的变量. 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般…

java成员变量的调用_java中对象调用成员变量与成员的方法介绍

java中对象调用成员变量与成员的方法介绍 发布时间:2020-05-06 10:03:53 来源:亿速云 阅读:838 作者:小新 今天小编给大家分享的是java中对象调用成员变量与成员的方法介绍,相信很多人都不太了解,为了让大家…

局部变量和成员变量

局部变量和成员变量的区别: 定义的位置不一样【重点】 局部变量:在方法的内部 成员变量:在方法的外部,直接写在类当中作用范围不一样【重点】 局部变量:只有在方法当中才可以使用,出了方法就不能再用了 成…

C++之静态成员变量

一、静态成员变量 1)static修饰的静态成员 静态成员变量、静态成员函数 静态成员变量: 1、static声明为静态的,称为静态成员,不管这个类创建了多少对象,静态成员只有一个拷贝,但是类的其他所有成员共享…

静态成员-静态成员变量

静态成员 静态成员都是用static修饰,它的特点是不论创建多少个对象,程序都只创建一个静态成员。 最主要的特点:共享 什么是共享呢? 例如:统计超市中所有商品数量的总和,商品数量的总和是随着每一个数量…

成员变量和成员方法

成员变量 1、成员变量的分类 实例变量:没有static修饰,也叫对象属性(实例变量),属于某个对象的,通过对象来使用 类变量:有static修饰,也叫类变量,属于整个类的&#x…

Python——成员变量和类变量

类中的变量分为两种类型:一种是成员变量(实例属性),另一种是类变量(类属性)。 成员变量是在构造方法__init__()中定义的,通过 self 参数引用; 类变量是在类中方法之外定义的变量。 在类的外部,成员变量属于对象,只能通过对象名访问; 类变量属于类,既可以通过类名访问,又可以…

成员变量[详解]

我是认为"成员变量包含实例变量和静态变量(静态变量也是类变量)",但学习过程中遇到说"成员变量仅仅指实例变量",所以下面具体研究一下成员变量的定义、包含关系 1、认同"成员变量包含实例变量和静态变量"的说法汇总 说法一 java中,成员变量是指…

基于MediaPlayer实现视频播放

一、概述 一个简单的视频播放器,满足一般的需求。使用原生的 MediaPlayer 和 TextureView来实现。 功能点: 获取视频的首帧进行展示,网络视频的首帧会缓存视频播放,本地视频或者网络视频感知生命周期,页面不可见自动…