Unity3d DLL脚本通用解密方法

  网上已经有很多文章讲解过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进制值:9460301

    下图是使用烧饼修改器搜索一个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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Get_dll_from_dumped_bin.exe是一种安卓Unity 3D DLL文件解密工具。在游戏或应用程序中,开发者通常会将一些敏感或重要的代码以DLL文件的形式保存起来,以防止被未经授权的人员访问或修改。然而,有时候我们可能需要对这些DLL文件进行解密,以便进行分析、修改或逆向工程。 Get_dll_from_dumped_bin.exe工具可以帮助我们完成这个任务。它可以从已被转储(dumped)的二进制文件中提取DLL文件。通常,我们可以使用一些专门的工具或技术将应用程序或游戏中的内存转储为二进制文件,然后使用Get_dll_from_dumped_bin.exe工具来处理这些文件,提取出所需的DLL文件。 这个工具的使用方法相对简单。我们只需要运行Get_dll_from_dumped_bin.exe,然后选择我们想要提取的DLL文件所在的转储文件。接下来,工具会自动解析该文件并提取出所需的DLL文件。解密后的DLL文件可以供我们进一步分析,理解其中的代码逻辑或进行修改。 需要注意的是,使用该工具必须遵守法律和道德规范。我们应该仅在合法范围内使用此工具,例如进行研究、教育或开发等目的。滥用此工具可能会涉及侵犯他人的知识产权或违反相关法律法规,因此请务必谨慎使用。 Get_dll_from_dumped_bin.exe是一个有用的工具,对于那些需要解密安卓Unity 3D DLL文件的开发人员或研究人员来说,它提供了方便和高效的解密过程,帮助我们更好地理解和改进应用程序或游戏中的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值