参考:https://bbs.kanxue.com/thread-289170.htm
com.Hyatt.hyt 26.7.0(7月份的一个版本)
分析这个检测的目的是从防护的角度看如何实现,所以这里我们不会选择用最简单的方式绕过,而是把整个检测细节全部分析清楚。
整个库把环境检测与脱壳结合起来,在jni_onload中对多个维度的环境信息进行检测,同时通过检测结果对解密的密匙加盐,一旦检测失败,即使通过frida强行hook也无法脱出来正确的dex,从而无法启动。
同时起了多个检测线程,持续检测环境变化。
这里就不多说了,直接看参考文章即可,这里dexprotector直接通过一个匿名内存页面来自link了一个动态库,然后在这个动态库中解密释放了代码,再从dexprotector的jni_onload中跳到动态内存的代码段中去,核心逻辑如下:

下一步就是直接分析动态内存中dump下来的动态库了,一些ida配置的方式也直接见参考的文章即可。
所有已知类型的变量全部改过来,例如 JavaVM* JNIEnv* 等,不要放过参数透传过程中丢失的类型信息,全部改过来,会大大节约分析的精力
PLT函数,遇到一些明显像plt的函数可以直接通过hook的方式拿到运行时真正调用的内存地址,找到对应的库中的偏移量,直接改名

一些关键的全局变量做好重命名,例如,下面这段汇编其实很明显是把函数入口的lr保存到了一个全局变量中,后面检测可能会用

整个检测逻辑做了深度定制,一些关键的函数都没有用libc的,而是自己实现了,系统调用也是,全部用svc实现的,同时所有的字符串全部做了加密增加了分析难度。
字符串解密函数,同时这个函数还会自检自己是否被hook,如果没被hook,再用一个全局密匙解密当前一个全局的字符串,而且经过实验发现这个密匙其实也是动态解密出来的,重命名为 decode_string_and_hook_myself,和他类似的函数还有一个是sub_4A114,也是解密字符串的,我们崇明名为decode_xor_string,不再赘述。
反汇编:
绕过措施:在hook的onenter时机把检测自己是否被hook的代码nop掉,同时onleave的时机把解密的字符串打印出来,当然,这个函数分析到后面会发现不光他自己会检测自己是否被hook,sub_25AC8 这个函数也会检测他是不是被hook,所以其实还有一个应对措施就是先把密匙dump下来,然后直接用python重写解密,用于在offline解密字符串。
sub_26098 是 strchr
sub_16864 是 strstr
sub_13BBC 是strtoull
sub_260C0 是memcpy
从/proc/self/stat里拿到当前进程的栈指针,依次获取了argv、env以及auxv,并且把这几个指针存到全局变量中,这里最关键的就是auxv了,因为用auxv可以直接找到r_debug,进程的所有加载的so也就都能遍历了。这函数直接重命名为:collect_process_startup_info。
sub_28F94是遍历刚才刚获取的auxv指针用的,然后用key取值,外层sub_8BD60直接调这个函数然后给r_debug全局指针赋值,核心就下面两行

sub_380F8 : 错误处理,扔异常,封装错误信息字符串等等
sub_29098(get_build_version_and_first_api) : 获取build version以及first api
sub_203E0: 根据版本设置一些偏移量,这些偏移明显是为了兼容不同android版本的一些结构体字段的访问。
sub_5A204: 获取自己pagemap的fd
sub_52570: 初始化一系列java环境的信息,例如:currentActivityThread mBoundApplication mPackageName等等,直接通过解密字符串就可知。
sub_6F948: 这个函数核心逻辑就是检测 libc,libart,libandroid这三个库是否被inline hook,核心的检测函数就是 sub_1F654, 通过对内存段中的异常跳转指令判断是否是inline hook。同时这个函数整体设计到对内存段的收集,需要定义一个结构体才能看清代码逻辑,同时这个函数的检测逻辑函数指针被当作参数直接pthread create,设置检测线程。

sub_1FC2C: debugger检测
sub_5E098: 这个函数很有意思,他是动态的申请了一块内存,然后往这块内存中写了一些指令,然后执行这段指令,而这段指令核心的逻辑就是把自己的返回值从0改成1.
sub_27150: magisk 检测,检测特定目录有没有magisk文件
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。