“你说我在瞎扯?”那我就瞎扯一篇把SecurityGuard剥皮拆骨的方法!

admin 2026-03-18 17:01:01 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文深入剖析了SecurityGuard6.6的安全机制,揭示了其APK-in-SO伪装架构及反调试绕过方法。作者通过FridaSpawn模式在初始化前成功注入,发现业务代码中存在硬编码的过时DES弱密钥,且核心加密模块缺失栈保护与RELRO机制,导致GOT表可被劫持。结论指出单纯的代码混淆无法弥补底层安全编译选项缺失带来的致命漏洞。 综合评分: 90 文章分类: 逆向分析,移动安全,漏洞分析,二进制安全,实战经验


cover_image

“你说我在瞎扯?”那我就瞎扯一篇把SecurityGuard剥皮拆骨的方法!

原创

Feng Ning Feng Ning

AI-security-innora

2026年3月7日 00:04 新加坡

专栏:The Nora Chronicles

《诺然 (Nora) 的故事》 Vol.18

专栏语: 记录一个黑客与 AI 的共生进化史。 “Obfuscation is math. Hardcoded keys are just human laziness.”


“你说我在瞎扯?”那我就瞎扯一篇把SecurityGuard剥皮拆骨的方法!

副标题:SecurityGuard 6.6 全链路解剖——从 APK-in-SO 脱壳到内存级降维打击



本篇可能是在瞎扯,千万别照着做,然后真的解密脱壳了某些高高在上的人奉做神明的安全组件SecurityGuard,到时候你会得罪人的!

2026 年 3 月 7 日,凌晨 00:03,马来西亚槟城,Tanjung Tokong。

咖啡机发出沉闷的低吼。我盯着屏幕上的一条社区评论,冷笑了一声。

上一篇文章(Vol.17)发出去后,我把那个 10 亿月活金融堡垒的底层二进制安全缺陷公之于众——229 个 SO 库逐一过筛,19 个缺失栈保护,核心加密引擎 531 个 GOT 表项裸奔。那篇文章的初衷不是炫技,而是因为 SRC 用一封模板邮件打发了我。

但那篇文章引来了一位自称”安全从业者”的嘲讽。他说我写的分析是”瞎扯”,说底层防护核心——SecurityGuard SDK,拥有无懈可击的自定义 OLLVM、运行时 Section 加密和五层反调试,根本不可能被我这种”写文章的”轻易看穿。

一知半解,是这个世界上最傲慢的毒药。

他知道 OLLVM,知道 ptrace,这很好。但他不知道的是,当他还在对着静态混淆的 CFG(控制流图)抓耳挠腮时,Nora 早就通过动态降维打击,把这套庞大的防御引擎拆成了一地零件。

我没有回复那条评论。我转头唤醒了副屏上的终端。

User: “Someone thinks SecurityGuard is uncrackable. Let’s show them the autopsy report.”

Nora: “Arrogance is a bug. Let’s compile the exploit.”

(傲慢是一个 bug。让我们编译漏洞利用。)

看着屏幕上的嘲讽,我脑子里闪过老电影《散打》里的画面:赵威出场,面无表情,只是低头在拳峰上一层层缠紧毛巾,缓缓转动手腕打圈。那是准备把对手骨架拆散前的肌肉记忆。

我习惯性地活动了一下手指。第一次在 Windows 蓝屏界面下呼出 SoftICE 切进系统内核,是 2001 年。那之前,我还在用 TRW2000 磕磕绊绊地跟汇编死磕。那台 CRT 显示器散发着焦糊味的热气,屏幕上方贴着一张手抄的中断向量表——INT 21h 的每一个功能号我都能默写。二十五年过去了,工具从 Ring0 调试器换成了 Frida,但拆骨拆筋的手感从未生疏。

在安全圈,论资排辈没有意义。但傲慢需要付出代价。

今天,我们就把这个版本号为 6.6.230507、包含五个核心 SO 模块的安全引擎,逐层解剖。


01 撕开假面:套着 SO 马甲的”压缩包”

许多逆向工程师拿到 libsgmain.so 的第一反应,是把它拖进 IDA Pro,然后看着一堆报红的 Section Header 怀疑人生。

他们以为这是一个被高度加密的 ELF 文件。

Nora 甚至都懒得动用反汇编器。终端里一行基础命令:

$ file libsgmain.so
libsgmain.so: Zip archive data, at least v2.0 to extract

$ unzip -l libsgmain.so
Archive:  libsgmain.so
  Length      Date    Time    Name
---------  ---------- -----   ----
       80  1980-01-01 08:00   lib/arm64-v8a/libsgmainso.ucb.so
  2143076  1980-01-01 08:00   lib/arm64-v8a/libsgmainso-6.6.230507.so
    84291  1980-01-01 08:00   classes.dex

第一层真相:APK-in-SO 架构

外层的 .so 文件,根本就是一个伪装的 ZIP 压缩包(PK 魔数开头)。真正的主引擎,是那个 2.14MB 的内部 ELF 文件,以及一个 80 字节的 libsgmainso.ucb.so

Nora: “UCB Registry Manager. 80 bytes containing two 32-byte SHA-256 hash chains and a truncated HMAC. They hide the key next to the lock. Adorable.”

(UCB 注册管理器。80 字节里塞着两条 32 字节 SHA-256 哈希链和一个截断的 HMAC。他们把钥匙藏在锁旁边。可爱。)

壳解密密钥和完整性校验哈希,就明晃晃地躺在旁边。静态分析确实读不到节数据,因为真正的解密和加载,发生在一个名为 app_1771685989/main/ 的沙盒目录里。

但这只是序章。真正的防线在后面。


02 幽灵注入:绕过五层绞杀阵的三秒窗口

“SecurityGuard 有五层反调试!你一挂 Frida 就会被踢掉!”——那位评论者信誓旦旦。

他没说错。这套引擎的防护确实森严:

L1 ptrace(PTRACE_TRACEME) 自附加 L2 inotify_add_watch 监控 /proc/maps,发现 Frida 特征 SO 映射立刻自爆 L3 fork 子进程看门狗 L4 mprotect 运行时代码段权限锁 L5 异常信号检测

如果你在应用启动后用 frida -U -n 尝试 Attach,确实会直接 TIMEOUT 死亡。

但谁规定必须在它醒着的时候动手?

Nora 的策略是:Spawn 早期注入。在这头猛兽睁开眼睛、初始化 SGPluginManager.loadSGPlugin 之前,把刀架在它的脖子上。

第一次尝试失败了。Spawn 时机稍晚了 200 毫秒,L3 的 fork 看门狗已经起来了——进程直接 SIGKILL,终端上一行冰冷的 Process terminated。我重新调整了 android_dlopen_ext 的 Hook 时序,把拦截点前移到 SO 加载完成的瞬间——反调试链还未激活的那个呼吸间隙。

// Nora's dynamic dumping — Spawn mode (Excerpt)
// Hook android_dlopen_ext to catch the exact
// moment SGMain is loaded but not yet initialized

Interceptor.attach(
  Module.findExportByName(null, "android_dlopen_ext"), {
    onEnter: function(args) {
this.lib = args[0].readCString();
    },
    onLeave: function(retval) {
if (this.lib &&
this.lib.indexOf(
"libsgmainso-6.6.230507.so"
            ) !== -1) {
            console.log(
"[+] SGMain loaded. Base: "
              + retval);
// Anti-debug NOT yet active
// Intercept mmap, capture
// decrypted ELF header
            dump_sg_module(retval, 2143076);
        }
    }
});

第二次,成功了。在那个 3-5 秒的时间窗口里,所有的反调试链都是瞎子。

Nora 从运行时内存中 Dump 出了三具”尸体”:解密后的 libsgmainso(2.1MB)、libsgsecuritybodyso(920KB)和 libsgmiddletierso

降维打击,从来不跟你拼刺刀。


03 傲慢的编译器与底线的崩塌

拿到解密后的内存 Dump,我们终于直面了传说中的定制版 OLLVM。

指纹显示:

Alipay clang version 6.0.1
(based on LLVM 6.0.1.Alipay.Obfuscator
 build200917)

不得不说,确实下了功夫。149 个静态导出函数里,46 个关键函数全部被随机字符串替代(比如 sjf39hfw92hhsfsjg27,地址 0x166408,实际是安全初始化入口)。34 个函数使用了极其冷门的自定义栈保护:不读系统 canary,而是读取 ARM64 tpidr_el0 + 0x28 寄存器的线程本地存储。

这群安全工程师把对抗静态分析的技巧推向了极致。

但极致的尽头,是极其可笑的业务代码。

在 Spawn 模式下,Nora 挂载了 Cipher.getInstance 和底层加密算法库的 Hook。仅仅运行了 25 秒,终端里开始喷吐出刺眼的红字:

[CRITICAL]Hardcoded DES Key:
  636865636b4b6579
(ASCII: "checkKey")

[CRITICAL]Hardcoded DES Key:
  2d31313531353931
(ASCII: "-1151591")

[CRITICAL]AES/CBC Key derived from
package name:
"com.eg.android.A"

我歪着头盯着那行 "checkKey" 看了三秒钟。然后笑出了声。

DES——一种 1977 年发布、2005 年被 NIST 正式淘汰的对称加密算法。56 位有效密钥长度。现代硬件暴力破解只需要几个小时。而这个引以为傲的安全引擎,不仅还在用它,还把密钥硬编码在二进制里,取名叫 checkKey

Nora: “They encrypt their sections, flatten their control flows, and then hardcode a 56-bit broken DES key named ‘checkKey’. This is not security. This is a comedy routine.”

(他们加密了节区,平坦化了控制流,然后硬编码了一个叫 “checkKey” 的 56 位已淘汰 DES 密钥。这不是安全,这是一场喜剧。)

但好戏还在后面。

在这个庞大的安全矩阵中,有一个专门负责国密和 SSL/TLS 的自研 SO 模块——大小约 2.8MB,包含 5733 个导出函数,处理所有的 SM2/SM3/SM4 和 NTLS 逻辑。这是 Vol.17 里我提到的那个加密引擎。

Nora 扫了一眼它的二进制属性:

[VULN] Stack Canary: ABSENT
[VULN] RELRO: NONE

[VULN] GOT `memcpy`
  at 0x77dd81d820 -> WRITABLE
[VULN] GOT `malloc`
  at 0x77dd80e10c -> WRITABLE
[VULN] GOT `dlopen`
  at 0x77dbd37014 -> WRITABLE

无栈保护。GOT 表完全可写。

耗资过亿、精心加固的安全基石,其最要害的加密流转模块,连最基础的 -fstack-protector-all 和 Full RELRO 编译选项都没有开。

我只需要修改 memcpy 的 GOT 表指针,这个引擎处理的所有明文密码、证书和指纹,就会像自来水一样流进我的口袋。

他们把安全做成了一座迷宫——精心设计的 OLLVM 混淆、华丽的运行时加密、暴烈的反调试链条。然后在迷宫的最深处,放了一把用纸糊的锁。


04 尾声:代码不说谎

02:30。

我停下了 Nora 的分析进程。这份长达数千行的脱壳与深度分析报告,安静地躺在硬盘里。

对了,那位评论者还嘲讽我的文章”满屏的 AI 味”,劝我”不如用 AI 写小说去”。

当真实的脱壳逻辑、底层内存 Dump 和 GOT 表覆写证据拍在面前时,他却只能拿”AI 味”当遮羞布。看不懂代码的人,总会在代码之外找理由。

那个说我”瞎扯”的人,或许真的是个努力的安全开发。他可能每天都在研究怎么写更复杂的 OLLVM Pass,怎么让 ptrace 藏得更深。但当他把全部精力投入到迷宫的雕花上时,他忘了回头看一眼——锁芯是纸做的。

真正的黑客,从来不按防御者设定的路线走迷宫。我们直接炸毁墙壁。

Nora: “Complexity is the enemy of security. When they build a fortress, they forget to watch the sky. Terminating process.”

(复杂性是安全的敌人。当他们建造堡垒时,忘了仰望天空。终止进程。)

窗外,Tanjung Tokong 的街灯在雾气里化成一团团浑浊的橘色光晕。楼下印度老伯的 mamak 档还亮着——凌晨三点照样有人在那喝 teh tarik 吹水。马来西亚的夜晚从来不赶人走。

我关掉终端,去楼下叫了一杯 teh o ais。

在绝对的动态降维打击面前,没有什么是不可解剖的。没有。

别跟我谈信仰,代码不说谎。


关于作者

Feng Ning(风宁)

Innora.ai 创始人 | CISSP 安全专家

中国早期顶尖黑客,现居马来西亚槟城。 坚信代码的终极价值,是承载人类的情感与记忆。

“No Code is Done until it is Committed and Documented.”


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AI-security-innora Feng Ning Feng Ning《“你说我在瞎扯?”那我就瞎扯一篇把SecurityGuard剥皮拆骨的方法!》

    《帮个忙》 网络安全文章

    《帮个忙》

    文章总结: 该文档是知树安全团队发布的一篇资源分享推广文章,标题为《帮个忙》。文章通过引导读者关注公众号并回复特定四位数字代码,免费获取多种网络安全相关资料。提
    评论:0   参与:  0