浅谈某NetHTProtect

2018-03-31 10,553 ℃

声明,本文只稍微提一下思路,不提供任何代码~

这次是第二次写它了,上篇文章讲的也是这玩意,不过这次它加了个新东西,直接暴力dump dll的话会发现method code还是加密的,原本这种情况可能需要翻下跟method相关的代码对比一下,不过可惜的是它使用的是Hook形式的加密,嗯,这是个略蠢的做法,因为只需要搜索一下0x04 0xF0 0x1F 0xE5(LDR PC, [PC, #-4]),就能很容易发现

mono_image_open_from_data_with_name不用说都知道是DLL解密的,那么mono_metadata_parse_mh_full就是method code解密的。

这两个函数最后都会调用libNetHTProtect.so来解密,不过估计是用了ollvm之类的混淆工具,相关函数的控制流图看着就想直接右键回收站,所以就不考虑还原算法,用个简单的方式来解密:注入一个so调用相关函数。

mono_image_open_from_data_with_name

直接参照源码调用mono_image_open_from_data_with_name就行,写出返回值的raw_data就能得到解密后的DLL

mono_metadata_parse_mh_full

由于mono_metadata_parse_mh_full其中一个参数不太好构造,所以直接选择调用libNetHTProtect.so里的解密函数,分析以后得到解密函数的原型是void decode(char *ptr, MonoMethodHeader *mh)其中ptr指向method的开头,MonoMethodHeader只需要code_size和code两个成员就够了,接下来就是要得到所有method的这些信息。

打开dnspy定位到PE – 存储流#~ – Method表,看看表的起始位置,然后循环读取每列,列的信息在dnspy的16进制窗口里都有详细说明,计算RVA-text段的虚拟地址(0x2000)+物理地址(0x200)得出偏移,参考一下mono_metadata_parse_mh_full函数对tiny和fat的method header做个分别处理,就能构造好code_size和code,然后调用函数解密,最后把code写回DLL里去就大功告成了~

关于Unity的PE文件结构破坏保护

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

阅读全文

40 条评论

  1. 大神你好,能不能通过反射去修复method呢? 可行的话 岂不是通用了,没NetHTProtect什么事了 :mrgreen:

    1. 我就是注入了dll,经测试:读取到的指针内容与dnspy中显示的函数体竟然不一致,也不知道为什么,难道需要其他处理?

    2. 如果函数已经被JIT编译过指针指向的就是native代码了,如果还没被jit编译过具体内容是什么我也没验证过。

  2. 大佬,我已经把网易多大的dll方法里面代码进行完全还原处理了,然后游戏放回去不读取那个解密过的dll。大佬有没有方案。 :?: :?:

  3. Perfare大佬 ,我这边也有款易盾加密的游戏,当我得到dll镜像和方法地址,去调用mono_metadata_parse_mh函数,游戏会崩溃。不知是何原因,想请大佬帮下忙(谢谢)。

    1. 大佬可有看过网易最新的保护,它魔改了mono,使用自己的一套方法来解析文件。正常结构dll,mono不认了。所以游戏把整个安装包内的dll,都加密了。大佬可有啥对应的解决方法。

  4. I can’t find Mono_image_open_from_data_with_name because libmono.so is half-encrypted it seems. Then what function to hook?
    The game is Legend of Dynasty
    Sorry i’m not chinese speaker

  5. 这篇内容分析的是libNetHTProtect.so 这个文件吧,libNetHTProtect.so需要先脱壳处理吧?请问楼主是如何快速脱壳的?多谢 :neutral:

  6. 大神,怎么确定mono_metadata_parse_mh_full方法中那一段代码调用了libNetHTProtect的代码

  7. void decode(char *ptr, MonoMethodHeader *mh) 这个函数如何找到的,libNetHTProtect需要反混淆?

  8. P大,为谁而炼金4.0也用上了这个壳,ida有反调试,gg直接dump内存会强制重启游戏怀疑有防dump,看到一篇文章说运行的内存在/proc/pid/map_files里,但是我模拟器和手机都没找到这个文件夹…这种情况下还有啥途径可以暴力dump么,谢谢!

    1. FGO也是这样,打开GG会直接闪退,你可以试试gg设置自动暂停游戏,这样可以dump内存,然后根据GG输出的MAP查看各so对应的位置,不过目前我还没干掉fgo的签名验证以及修复DLL……不知道这样dump出的DLL可不可以打包回去用,仅供参考。

  9. 大神您好,关于这个游戏method code的加密方式我找了一些比较新的资料,据说是XTEA加密,得到这一点后我在libtpnSecurity.so里找到了关于XTEA加密的函数,在想能不能通过对这个netHTProtect的壳中查找对该加密函数的调用来直接获得XTEA的key,这样处理起来应该可以方便很多。

    但是目前我在这个壳里还没找到对它的调用….动态调试的话这游戏会弹出,应该还要干掉反调试,想问问大神这个思路可行吗?如果可以的话我就试试看了。因为是新手一枚,所以对ollvm和so文件之间的调用不太熟悉,只知道可以通过IDA动态查看,万一ollvm能让IDA看不出调用关系的话,就没办法了~ :sad:

    1. 如果你确定算法和关键函数的话,可以考虑用Hook的方式来截取key,也能绕过反调试,不过我还是觉得注入调用解密函数是比较轻松的做法

    2. 新手个屁,就是做外挂然后卖钱的吧,博主别告诉这堆做外挂的骗子,骗人知识然后拿去做外挂赚钱!

  10. 请问 某讯的游戏ida附加不上,修改器也附加不上, 所以通过hook mono_image_open_from_data_with_name来获取dll,但是发现一个问题 hook的时候没有发现libmono.so的调用 也就没触发这个函数? 加密应该是走这个函数的 为啥hook不到?望大佬指点一下。(纯粹为了学习)

欢迎留言

0 + 5 =