浅谈某NetHTProtect

2018-03-31 3,567 ℃

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

这次是第二次写它了,上篇文章讲的也是这玩意,不过这次它加了个新东西,直接暴力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里去就大功告成了~

碧蓝航线Live2D提取

自从看到敦刻尔克的live2d后就决定要提取一发来射爆,经过简单的分析后发现游戏使用的是Cubism 3,在Unity里导入motion3.json时会转换为AnimationClip,这种...

阅读全文

Unity下的注入与修改

已经有很长一段时间没写过游戏修改的文章了,一个原因是现在越来越多的手游厂商都开始给游戏上各种各样的保护,以前简单的直接修改dll或者直接修改so早已经不...

阅读全文

少女前线Live2D解密

上周在CP22看到这个游戏两周年了,打算回坑玩一阵,不过上一个号是买的初始号账号密码都忘记了,所以只好开了个新号。然后新皮肤倒是抽到了,不过枪都没有怎...

阅读全文

21 条评论

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

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

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

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

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

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

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

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

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

欢迎留言

2 + 6 =