首页
社区
课程
招聘
[原创]新版dexprotector环境检测分析
发表于: 2026-9-6 19:51 1523

[原创]新版dexprotector环境检测分析

2026-9-6 19:51
1523

参考: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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
点赞 ・5
打赏
分享
最新回复 (2)
雪    币: 2476
活跃值: (3797)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2 楼
xx
2026-9-7 16:54
0
雪    币: 1338
活跃值: (1185)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3 楼
tql
9小时前
0
游客
登录 | 注册 方可回帖
返回