浅谈某NetHTProtect

2018-03-31 2,430 ℃

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

这次是第二次写它了,上篇文章讲的也是这玩意,不过这次它加了个新东西,直接暴力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解密

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

阅读全文

简单绕过BanG Dream校验

2.2.0 上周去参加CP22,炸梦演出时的人比想象中的要多,给我一种国服能很火的感觉,于是我决定下回日服顺带摸鱼一篇文章 游戏不懂什么版本开始加入了一点校验...

阅读全文

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

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

阅读全文

5 条评论

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

欢迎留言

3 + 3 =