声明:本文仅作安全研究与排障记录。分析过程全部离线完成,未安装、未运行样本,也没有主动访问样本中的远程地址。涉及姓名和身份证号的内容均已打码,不提供样本下载。
前几天在手机公共存储里遇到一个挺有意思的现象:/storage/emulated/0/ 下几乎每个一级目录都多出了 res 和 src,部分目录为空,部分目录里则固定放着下面两个文件:
res/gx.mp3
src/mian.iyu二级目录没有继续生成,所有 gx.mp3 的时间又统一停在 2026-08-14 17:51。这个特征不像系统缓存,更像某段代码枚举了一次外置存储根目录,并对第一层目录批量落地。
顺着安装记录往回查,最后找到了一个从 Telegram 获取的所谓“开户工具”:
HERO户籍猎手『3.0』.apk先说结论:这个 APK 不但不是可信的官方开户软件,还内置了和手机里 gx.mp3 完全相同的传播脚本。所谓“随机身份证”是本地数组抽签,“超级 AI 对接查询”则是一个没有查询请求的前端动画页。
下面记录完整拆解过程。
一、样本落盘
文件名:HERO户籍猎手『3.0』.apk
文件大小:13,572,686 bytes
MD5:此处不作为唯一识别依据
SHA-256:30a34057b30f8974f04ddfb2e406a3cd7c874d211d4f745624746c4e4d2fd3fe
包名:com.izhakasls
版本名:3.0
版本号:200001
minSdk:21
targetSdk:36
入口:com.iapp.app.run.mian签名证书同样没有什么可信背书:
Subject:CN=ipuser, OU=ipuser, O=ipuser, L=bj, ST=bj, C=cn
Issuer:CN=ipuser, OU=ipuser, O=ipuser, L=bj, ST=bj, C=cn
Serial:875951556
Cert SHA-256:ac0d0777ca24956f8d584c69a7fd5d2e4fb88e276d953aec9e29ceeb9aa78e32这是普通自签名证书。ipuser 无法指向真实个人或公司,更谈不上公安、银行或其他官方机构。
APK 内主要文件时间集中在 2026-07-22 14:39 左右,比手机发生批量写入的 8 月 14 日早约三周,时间线可以对上:先打包,后传播,再在手机上被运行。
二、解包后先看见了什么
解开 APK 后,几个文件非常扎眼:
assets/lib.so
assets/res/gx.mp3
lib/arm64-v8a/libygsiyu.so
lib/armeabi-v7a/libygsiyu.so
lib/x86/libygsiyu.so
res/mipmap-*/img_iapp.png再结合组件名:
com.iapp.app.run.mian
com.iapp.app.run.main
com.iapp.app.run.main2
com.iapp.app.run.main3
com.iapp.app.run.load
com.iapp.app.Webview
com.iapp.app.DownList基本不用继续猜了,这是一个 iApp/裕语言框架打包应用。手机权限页中出现的 i.app 也来自它的清单,而不是系统组件。
assets/lib.so 并不是常规 ELF so,文件头没有 ELF 魔数,整体呈高熵二进制状态,更像 iApp 自己的加密或私有脚本容器。核心业务逻辑因此不能像普通 Java APK 一样直接依靠字符串全部还原。不过,作者把传播载荷和两个网页模块明文放在了资源目录里,已经泄露了足够多的信息。
三、Manifest:权限和功能并不匹配
清单中实际声明的权限如下:
android.permission.INTERNET
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.MANAGE_EXTERNAL_STORAGE
android.permission.QUERY_ALL_PACKAGES
android.permission.POST_NOTIFICATIONS
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
i.app如果它只是一个“开户”或信息查询工具,最难解释的就是:为什么需要 MANAGE_EXTERNAL_STORAGE,也就是“管理所有文件”;又为什么需要 QUERY_ALL_PACKAGES,去枚举用户安装的全部应用。
后续代码证明,“管理所有文件”并不是作者顺手勾上的权限,而是被实际用于遍历和修改公共存储。
好的一面是,Manifest 中没有发现短信、通讯录、通话记录、定位、相机、麦克风、无障碍、设备管理员或自定义开机广播接收器。就当前样本而言,还不能把它描述成短信木马或远控。但是,“没有这些权限”不等于应用安全,因为它已经实施了文件传播和远程配置拉取。
四、gx.mp3:扩展名只是烟雾弹
APK 中的文件:
assets/res/gx.mp3计算得到:
SHA-256:91eac88730c674350f4c7d577dc432292bd26c28bca38464bc5f9bdbbb502e13这个值与手机公共存储中发现的 gx.mp3,以及先前收到的压缩包样本完全一致。不是相似、不是同一家族,而是逐字节相同。
文件头也不是 ID3 或 MPEG Audio Frame,直接打开就是 iApp 脚本。核心传播部分整理后大致如下:
读取自身 gx.mp3
│
├─ 计算当前工程上级路径
│
├─ 枚举该路径下的一级目录
│
└─ 对每个目录拼接:
├─ /src/mian.iyu
└─ /res/gx.mp3
│
├─ 复制自身到目标 res
└─ 把代码插入目标 loading 事件对应脚本中的关键路径拼接:
ss(proPath+file+"/src/mian.iyu",Item)
ss(proPath+file+"/res/gx.mp3",Items)
fr(Item,cons)
fc("@gx.mp3",Items,ni)
fw(Item,Wc)代码只执行了一层 fl(proPath,files),没有递归,所以现场才会出现非常整齐的特征:只污染 /storage/emulated/0/Download、Documents 等一级目录,不继续深入它们内部。
部分目录只有空 res/src,可以理解为目标路径创建成功,但后续文件复制或写入条件没有满足;能写入的目录则留下完整载荷。
这类代码更准确的称呼是“iApp 源码传播脚本”或“工程蠕虫”。它不会像系统级漏洞那样感染 Android 内核,但会污染同路径下的工程,使后续运行或重新打包的项目继续携带代码。
五、远程开关藏在十进制字节里
作者没有直接写中文和 URL,而是用 btoo("utf-8", ...) 将十进制字节转换成字符串。还原结果如下:
请求返回值预计使用以下字段:
zl【...】zl // 开关
qh【...】qh // QQ群号
zz【...】zz // 预留配置
gg【...】gg // 弹窗内容当 zl 等于“开启”时,应用弹出“温馨提示”,按钮显示“下载更新”。点击按钮后,代码真正执行的是:
mqqapi://card/show_pslcard?...&uin=734628387&card_type=group...也就是打开 QQ 群卡片,并非通过应用市场更新。
脚本中虽然出现 com.zhendong,但它没有作为当前 APK 包名,也没有在已还原代码里被启动。实际 APK 包名是 com.izhakasls。所以 com.zhendong 更像废弃变量、远程配置预留或作者留下的干扰项,不应误伤同名正规应用。
六、随机身份证:121 条数据装进数组里抽签
assets/res/suijisfz.html 是整包里最能说明问题的文件之一。页面标题就是“随机身份证”,内部将“姓名---身份证号”直接写进 JavaScript 数组。
统计结果:
记录总数:121
去重后:120
网络请求:0点击按钮后的核心代码非常直白:
var randomIndex = Math.floor(Math.random() * messages.length);
outputContent.textContent = messages[randomIndex];没有公安接口,没有实名核验,也没有后端数据库。所谓查询,就是从本地 121 条记录中随机抽一条。
原始数组中包含完整姓名和18位身份证号。出于隐私和合规考虑,这里不贴原文,只展示脱敏后的结构:
某某---522631************这些号码可能来自泄露数据,也可能由作者拼接生成。仅靠静态样本无法逐条确认真实性,但无论属于哪一种,把成批身份信息塞进来历不明的 APK 都不是正常开户软件应有的做法。
七、“超级AI查询”:一秒一行的舞台效果
另一个文件 assets/res/10086.html 自称“超级AI对接查询”,界面允许输入 QQ 或“任意信息”,还能开启所谓“深度查询”。
如果它真的对接了查询接口,至少应当存在以下一种调用:
fetch
XMLHttpRequest
Ajax
WebSocket实际结果全部为零。startSearch() 读取输入框后,创建一个预设 segments 数组,再用 setTimeout 每隔一秒追加一行:
const interval = 1000;
currentTimer = setTimeout(() => {
showSpinner(false);
const seg = segments[index];
appendLine(seg.html, seg.class);
index++;
step();
}, interval);所谓“深度查询”只切换标题和结束提示,没有改变数据源,也没有发起新请求。预置输出中反复出现固定的“获取失败”。加载圈、一秒延迟和逐行输出只是为了模拟“正在跑库”。
这个模块可以直接定性为查询演示页或伪查询页。
八、它到底是不是开户软件
如果把“开户软件”理解成正规银行、证券或受监管机构提供的开户客户端,答案是否定的。
目前没有发现:
受监管机构包名或可信签名;
官方域名和合规隐私说明;
银行或证券开户 SDK;
活体检测、实名核验等正规流程;
可以佐证真实业务主体的信息。
已经发现的却是:
通过 Telegram 获取的自签名 APK;
申请管理全部文件;
批量向公共存储投放脚本;
远程控制的 QQ 群跳转;
本地随机身份证数组;
不联网的“AI 查询”动画;
公安人口库、资源底包和财务营销素材。
因此更合理的判断是:它是一个披着“户籍查询/开户资源”外衣的 iApp 工具壳,至少部分功能明确用于糊弄用户,并附带恶意传播行为。
需要保留一个技术边界:assets/lib.so 是加密或私有封装的核心脚本容器,本次没有在真机或沙箱里动态执行,所以不能声称已经还原其全部网络接口,也不能断言它只做了本文列出的事情。但已经确认的行为足以判定样本不可信,没有必要通过运行它去证明更多。
九、IOC 与样本标记
方便排查的 IOC 汇总如下:
APK SHA-256:
30a34057b30f8974f04ddfb2e406a3cd7c874d211d4f745624746c4e4d2fd3fe
Payload SHA-256:
91eac88730c674350f4c7d577dc432292bd26c28bca38464bc5f9bdbbb502e13
Package:
com.izhakasls
Main Activity:
com.iapp.app.run.mian
Dropped Files:
*/res/gx.mp3
*/src/mian.iyu
Remote URL:
http://docq.cn/files/edk88ke
QQ Group:
734628387
Certificate SHA-256:
ac0d0777ca24956f8d584c69a7fd5d2e4fb88e276d953aec9e29ceeb9aa78e32结语
这个样本的技术并不复杂,甚至因为 iApp 打包留下了大量明显特征。但它把几个常见套路拼到了一起:用官方风格图片建立权威感,用加载动画伪造查询过程,用本地身份数组冒充数据能力,再利用“管理所有文件”把传播脚本撒进公共存储。
判断这类工具最有效的方法,不是看界面做得像不像,也不是听卖家如何描述,而是看它实际请求了什么权限、访问了什么地址、查询按钮到底执行了什么代码。
在这个样本中,界面声称自己在查询数据库,代码却只是在数组里随机抽签;按钮写着“下载更新”,实际却跳转 QQ 群;文件叫 gx.mp3,里面装的却是一段会复制自己的脚本。到这里,性质已经足够清楚,索性只是传染病毒,并没有实际破环和偷窃行为。同时再次提醒大家:不要随意安装陌生应用
本片分析也到此结束。
评论