浅谈某NetHTProtect

2018-03-31 1,158 ℃

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

这次是第二次写它了,上篇文章讲的也是这玩意,不过这次它加了个新东西,直接暴力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)”,不过目前只打算写写这一个例子,估摸着也没有下篇,还是别挖坑了。...

阅读全文

碧蓝航线1.5相关

Salt.dll解密 关键函数libmono.so下mono_set_data,此函数已加密,直接选择附加调试,F5 照抄一份c# var bytes = File.ReadAllBytes("Salt.dll")...

阅读全文

苍蓝境界相关

1.0.0 最近经常在taptap首页上看到这游戏的广告,所以就下了下来,玩了一段时间后发现这游戏的素质并不怎么样,不过稍微还有点研究价值就顺手写下好了 图片 ...

阅读全文

4 条评论

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

欢迎留言

0 + 0 =