Unity3d DLL脚本通用解密方法

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

  网上已经有很多文章讲解过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.dll或Assembly-CSharp-firstpass.dll。

image.png

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

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

image.png

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

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指向的内存

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

    对于强度稍微高点的保护,这个函数处是拿不到解密后的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

image.png

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

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

image.png

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

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

image.png

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

image.png

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

image.png

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

http://www.freebuf.com/column/153720.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217139.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午10:15
下一篇 2026年3月18日 上午10:16


相关推荐

  • GTX 750等低配显卡如何玩转Deepfakes?[通俗易懂]

    GTX 750等低配显卡如何玩转Deepfakes?[通俗易懂]这里说的Deepfakes软件还是DeepFaceLab,人工智能换脸,是使用深度学习方法来实现的。而深度学习程序对电脑配置要求是非常高的,尤其是跑模型这个环节。很多低配电脑,根本就跑步起来。比如像GTX750,1G显存。默认情况下这种配置肯定跑不了这个程序,但是通过自定义参数也能跑。这对于低配玩家来说绝对是个好消息。首先,你需要获取的DFL的版本为DeepFaceLabCUDA…

    2022年5月20日
    157
  • plsqldev中查看表结构「建议收藏」

    plsqldev中查看表结构「建议收藏」plsqldev中查看表结构通常情况下,可以使用desc表名来查看表结构但在plsqldev中不能使用desc命令在plsqldev工具中的sqlwindows区域Oracle的SQL缓冲区一次只能存放一条SQL命令而且SQL*PLUS附加命令不能在SQL里运行:但是,如果使用sqlplus就可以使用desc查看,

    2022年4月25日
    67
  • ubuntu 22.04 安装部署logstash 7.10.0详细教程

    ubuntu 22.04 安装部署logstash 7.10.0详细教程

    2026年3月15日
    2
  • 快速入门UML时序图「建议收藏」

    快速入门UML时序图「建议收藏」使用UML时序图重构代码使用UML时序图时序图是什么时序图的元素组合块(CombinedFragment)举例使用UML时序图最近,在重构项目中的老代码的时候,业务复杂,文档缺失。抽丝剥茧,沉迷在剪不断理还乱的纷繁的关系中,像是苏东坡诗中的那只高贵的乌鸦先生找不到落脚之处。披沙拣金,终于理出一点头绪,生怕忘了,赶紧记下来,又苦于没有好的方式去表达这些错杂的关系,蓦然发现,UML时序图是表达业…

    2022年6月29日
    37
  • coze智能体的id在哪里

    coze智能体的id在哪里

    2026年3月13日
    2
  • php中Session使用方法详解

    php中Session使用方法详解

    2021年10月23日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号