网上已经有很多文章讲解过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。

这样的脚本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指向的内存

不过往往第三方保护都是带反调试的,新手要过掉反调试还是比较费周折的,有些厉害的反调试,老手都不一定过得了。对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

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

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

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

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

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

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

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

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

Unity3d DLL脚本通用解密方法相关推荐

  1. Linux环境下脚本加密软件SHC的解密方法

    Linux环境下脚本加密软件SHC的解密方法 2016/08/06:更新一个新的解密脚本 https://github.com/yanncam/UnSHc 自从我在博客里面发布了一些免流相关的东西之后 ...

  2. linux脚本加密 upx,#加解密#LinuxShell加密解密方法(shc/gzexe/UPX)

    一.系统自带gzexe gzexe无需安装任何软件是linux自带的功能使用只需要执行命令即可我们可以利用wget将文件放在root目录下也可以通过sftp放在root目录也可以直接利用cd命令选择目 ...

  3. java和php对接通用加解密方法整理

    整理记录下,java和php对接,对于数据加解密的方法. import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; imp ...

  4. 网站安全之ASP程序加密解密方法全面解析

    如今,用ASP技术构建的网站随处可见.由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题 ...

  5. 浏览器无法运行java_window_浏览器无法运行JAVA脚本的解决方法,1、浏览器无法运行JAVA脚本的 - phpStudy...

    浏览器无法运行JAVA脚本的解决方法 1.浏览器无法运行JAVA脚本的解决方法. rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%Syste ...

  6. CTF-Crypto 密码原理及解密方法

    CTF-Crypto 密码原理及解密方法 文章目录 CTF-Crypto 密码原理及解密方法 推荐综合加解密网址 一.常见密码格式 二.古典密码 凯撒密码 仿射密码 埃特巴什码 培根密码 棋盘密码 希 ...

  7. DW 6 CS6 通用破解方法

          Step 1 - 下载Adobe Dreamweaver CS6 简体中文版(115网盘),为了方便大家下载,笔者特地将软件上传至115网盘.       Step 2 – 下载Adobe ...

  8. CTF-Crypto-各种密码原理及解密方法

    CTF-Crypto-各种密码原理及解密方法 一.常见密码格式(太懒了,待补充) 二.古典密码 凯撒密码 仿射密码 埃特巴什码 培根密码 棋盘密码 希尔密码 维吉尼亚密码 摩尔斯密码 栅栏密码(普通型 ...

  9. 防止ACCESS数据库被下载的一个通用解决方法:

    防止ACCESS数据库被下载的一个通用解决方法: 在IIS里面 Web站点的属性, 主目录=>配置=>应用程序影射=>添加 随便做一个0字节的dll 用来影射mdb文件. 明白了吧? ...

最新文章

  1. Android:四种启动模式分析
  2. php5.4.16执行shell脚本
  3. Android开发之发送邮件功能的实现(源代码分享)
  4. python爬虫案例-Python爬虫案例集合
  5. Graves of the Internet - 互联网坟墓
  6. .jsp与servlet之间页面跳转及参数传递实例
  7. Android ViewPager2 真的香么?
  8. 区块链BaaS云服务(28)TOP Network 之P2P 网络
  9. Automake十分钟速成教程
  10. IBATISNETNET 1.3 开发指南系列文章
  11. Eclipse 汉化方法
  12. 【DevOps】在CentOS中安装Rancher2,并配置kubernetes集群
  13. H3C交换机堆叠配置
  14. 萌新的51之旅——串口通信(2)
  15. python平方根_如何在Python中找到平方根?
  16. 熟悉java的写什么毕业设计_计算机专业Java相关的毕业论文该如何写?
  17. html svg 线条动画,线条之美,玩转 SVG 线条动画
  18. Linux curl命令详解 【转】
  19. 关于使用ajax动态输出cnzz统计代码的问题
  20. Florian%C3%B3polis巴西北岸新业务的最佳场所四方数据分析

热门文章

  1. 自动发送邮件(整理版)
  2. 【转载】C++操作符
  3. C++中了类继承和调用父类的构造函数方法
  4. IP地址,子网掩码、默认网关,DNS服务器是什么意思
  5. Windows 7 Ubuntu 14.04完美双系统安装及系统引导配置
  6. 服务器上安装ffmpeg后报错及解决方案libavdevice.so.58: cannot open shared object file: No such file or directory
  7. [云炬mysql数据库笔记] Work2
  8. 云炬随笔20211012(3)
  9. [:zh]给机械课程设计的一封信[:] 2017-12-23
  10. unity三维向量变化为角度_UNITY3D两个物体相对位置、角度、相对速度方向