开始码字后突然不懂标题应该怎么取,原本想像隔壁一样来个什么“关于Unity的xxx保护(1)”,不过目前只打算写写这一个例子,估摸着也没有下篇,还是别挖坑了。

至于为什么写这个东西呢?最近突然遇到好多游戏用上了某些加固,里面都用上了这个东西,但是这玩意对我来说其实已经算是“玩剩下”的东西了,最早遇到的时候是2016年在androidrepublic的一款游戏上,第一次遇到的时候还感觉非常有意思,但是在恶补了.net的PE结构后顿时索然无趣,因为,这玩意的强度实在太弱了,以至于我当年写的这东西的加密解密程序现在都可以直接用

使用工具:
010 Editor 或其他16进制编辑器
CFF Explorer
dnSpy

以下按照修复顺序介绍可破坏的点

0x1 Nt Header – Signature

固定偏移:0x80-0x83
原始值:0x50 0x45 0x00 0x00
效果:不被识别为PE文件

0x2 Optional Header – NumberOfRvaAndSizes


固定值:0x10
效果:使程序无法正常识别.Net头

0x3 MetaData Header – NumberOfStreams


固定值:正常情况下为0x5,某些混淆程序会影响该值
效果:如图

0x4 Storage Stream #~ – Tables Stream – m_rows

所有元素长度为4字节,前两个字节可编辑
如图,删除红框内数据即可正常反编译

0x0 题外话 关于Unity下的DLL应该如何有效的保护

首先,把il转为本地代码(il2cpp)来避免il的易读性和易修改性肯定是最佳的选择,而且转换后能玩的花样也多了起来。如果由于某些原因无法使用il2cpp,混淆也是首选。Unity下因为环境和MonoBehaviour等等的限制,混淆看起来强度不强,其实最主要的是避免使用主流的混淆软件,因为网上大多都有解决方案,把ConfuserEx的源码拖出来改改能达到极好的效果,其中最主要的就是流程混淆和引用代理了,能不能让别人看见流程图就丢回收站就靠它们了。

混淆之后才再考虑加密,由于Unity需要DLL常驻内存读取代码,所以大多数保护直接dump就能搞定,再复杂点根据mono的读取流程分开解密,但是本身mono也是开源的,可以通过对比源码找到相关函数,而且大部分加固使用的都是Hook的形式进行加密,导致扫一遍text段就能很容易找到被Hook的点。其他还有一些奇技淫巧向的保护方式,比如替换opcode,重新定义PE文件结构之类的,这类特征比较明显,照着源码也还是能找到位置的,就是很费时间,总的来说加密在保护代码上并没有混淆有用。

以上只是关于代码的保护,也可以从一定程度上使游戏不被修改,但是真正想不被修改的话,还是需要其他方面的东西。

浅谈某NetHTProtect

声明,本文只稍微提一下思路,不提供任何代码~ 这次是第二次写它了,上篇文章讲的也是这玩意,不过这次它加了个新东西,直接暴力dump dll的话会发现method co...

阅读全文

25 条评论

  1. 大神,用你的方法类名函数名反编译出来了,但是方法里面的代码不行,能给我一个提示吗?

  2. 谢谢楼主的分享,我成功的反编译出一部分代码,但是函数代码没有反编译成功,能教一下我吗?

  3. 直接检测程序完整性修改就没辙了
    某个麻辣土豆(MLTD)动用nProtect APPGuard来搞…
    :twisted:

  4. 0x4 Storage Stream #~ – Tables Stream – m_rows 在cff里找不到啊,是否需要特殊设置? P大能否发个图给我,多谢!

    1. 3月25日更新之后fgo_1.20.0_3_1_bili_253531.apk,失效了,我试着还原,只能还原目录结构,里面代码竟然无法还原,不知道大大有没有办法搞定

  5. 大佬,幻想神域手游能弄么?解压后,看到的资源都是.png格式,还有什么MD5。美术一个,对程序搞不懂···网上查了一堆加密,都没有什么教程,搞得头晕。。 :???: :???:

  6. 这种不仅破坏了而且还自定义了吧 大佬你看这个图,右边是原版,左边是被破坏的https://i.loli.net/2018/01/25/5a69fd7b80205.png

  7. 正好最近遇到了这种的加密,androidrepublic。platinmods 。mgame,现在都是这样而且后两者都有对游戏进行了可视化菜单的修改开关。也是最近国外比较流行的形式了

欢迎留言

9 + 3 =