少女祈祷中...
Dux's Blog

HERO户籍猎手 3.0 逆向记录:披着查询工具外衣的 iApp 传播样本

声明:本文仅作安全研究与排障记录。分析过程全部离线完成,未安装、未运行样本,也没有主动访问样本中的远程地址。涉及姓名和身份证号的内容均已打码,不提供样本下载。

前几天在手机公共存储里遇到一个挺有意思的现象:/storage/emulated/0/ 下几乎每个一级目录都多出了 ressrc,部分目录为空,部分目录里则固定放着下面两个文件:

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/DownloadDocuments 等一级目录,不继续深入它们内部。

部分目录只有空 res/src,可以理解为目标路径创建成功,但后续文件复制或写入条件没有满足;能写入的目录则留下完整载荷。

这类代码更准确的称呼是“iApp 源码传播脚本”或“工程蠕虫”。它不会像系统级漏洞那样感染 Android 内核,但会污染同路径下的工程,使后续运行或重新打包的项目继续携带代码。

五、远程开关藏在十进制字节里

作者没有直接写中文和 URL,而是用 btoo("utf-8", ...) 将十进制字节转换成字符串。还原结果如下:

编码内容

解码结果

-26 -72 -87 ...

温馨提示

-28 -72 -117 ...

下载更新

55 51 52 54 50 56 51 56 55

734628387

99 111 109 46 ...

com.zhendong

104 116 116 112 ...

http://docq.cn/files/edk88ke

-27 -68 -128 -27 -112 -81

开启

请求返回值预计使用以下字段:

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,里面装的却是一段会复制自己的脚本。到这里,性质已经足够清楚,索性只是传染病毒,并没有实际破环和偷窃行为。同时再次提醒大家:不要随意安装陌生应用

本片分析也到此结束。

分享到

评论