Skip to content

ELF 加固 (packers) ​

packerELF44 条

elf/packers.yara 检测原生层(.so)加固工具。重头戏是 UPX 全版本指纹——从 3.01 到 3.94,外加梆梆/SecNeo、爱加密、Joker 等魔改 UPX 变体,以及嵌入式/未识别版本等形态。

🎯 ELF 加固的形态 ​

ELF 层加固分几类:

  • UPX 压缩:标准 UPX 或被厂商改了 stub 标记的 UPX 变体。
  • 厂商壳的 so 库:360(libjiagu)、腾讯(libshell/libxgVipSecurity)、梆梆、通付盾等,壳代码跑在 so 里。
  • 嵌入式 payload:UPX 压缩的 ELF 被塞进另一个 ELF 或 APK(dropper/embedded)。

📋 规则清单 ​

UPX 系列(版本指纹 + 变体) ​

规则tag说明
upx_elf_3_91packerUPX 3.91(原版)
upx_elf_3_92packerUPX 3.92(原版,含 Android so 修复)
upx_elf_3_93packerUPX 3.93(原版)
upx_elf_3_94packerUPX 3.94(原版)
upx_elf_3_01packerUPX 3.01(原版)
upx_elf_3_02packerUPX 3.02(原版)
upx_elf_3_03packerUPX 3.03(原版)
upx_elf_3_04packerUPX 3.04(原版)
upx_elf_3_07packerUPX 3.07(原版)
upx_elf_3_08packerUPX 3.08(原版)
upx_elf_3_09packerUPX 3.09(原版)
upx_sharedlib_unmodifedpacker共享库 UPX(原版,ET_DYN)
upx_elf_bangcle_secneopacker梆梆/SecNeo(把 UPX! 换成 SEC!)
upx_elf_bangcle_secneo_newerpacker新版梆梆/SecNeo(换成 \x03\x02\x01\x00)
upx_elf_ijiamipacker爱加密(把 UPX! 换成 AJM!)
upx_elf_jokerpackerJoker(换成 ZHSH 或 TIW°)
upx_embedded_inside_elfpacker, dropperELF 内嵌 UPX 压缩的 ELF
upx_compressed_apkpacker, embeddedAPK 内嵌 UPX 压缩的 ELF
upx_unknown_version_modifiedpackerUPX(未识别版本,已魔改)
upx_unknown_version_unmodifiedpackerUPX(未识别版本,原版)

UPX private 积木(不输出) ​

规则说明
upx_elf32_arm_stub含 UPX ARM32 stub 字节序列
upx_stub含 UPX stub(封装 upx_elf32_arm_stub)
upx_unmodified含原版 UPX stub(UPX! 在头尾且匹配 ARM stub)
upx_unknown_versionUPX(未知版本兜底,排除已知版本/变体)

其它加固方案 ​

规则tag说明
promonpackerPromon Shield(libshield.so/随机库名 + .ncu/.ncc/.ncd 节区)
promon_apackerPromon Shield(变体,节区指纹)
appsealing_core_2_10_10packerAppSealing CORE 2.10.10
appsuit_packer_apackerAppSuit(libAppSuit.so + libUnpacker.so)
tencent_elfpacker腾讯 MTP(libshell.so 依赖链)
tencent_legu_VMP_elfpacker腾讯乐固 VMP(libxgVipSecurity.so)
tongfu_shield_elfpacker通付盾(libegis.so/assets/libegis.a)
crackproofpackerCrackProof(ARM32 do_asm_syscall 指纹)
crackproof_apackerCrackProof(ARM64 init_proc + syscall 指纹)
jiagu_nativepacker360 加固原生层(libjiagu + JIAGU_* 常量)
blackmodpackerBlackMod(libbmt.so + SVC 指纹)
_5play_rupacker5play.ru(libRMS.so + openat SVC)
liapp_elfpackerLIAPP(libliapp.so)
eversafe_elfpackerEversafe(libeversafe.so)
aegis_elfpackerAegis(libaegis_e*.so)
appguard_elfpackerAppGuard(libAppGuard.so + INCA 类)
appguard_elf_bpackerAppGuard(变体,libcompatible.so)
dxshield_elfpackerDxShield(libdxbase.so)
zimperium_zshieldpackerZimperium zShield(ARM64 SVC + 缓存刷新指纹)
zimperium_zshield_apackerZimperium zShield(变体,内联 syscall ≥50)
nesun_elfpackerNesun(.zprotect 路径 + libzprotect.so)
gpresto_elfpackerG-Presto 反作弊(libATG_L.so + Presto 类)
kiwisec_elfpackerKiwiSec(libKwProtectSDK.so 等)
tso_trusteer_sdkpackerIBM Trusteer SDK(.tsotext/.tsodata 节区)

🔍 检测原理要点 ​

UPX 版本指纹 ​

UPX 在压缩时把版权字符串写进 stub。APKiD 用 "UPX 3.94 Copyright" 这类字符串精确匹配版本,同时要求 stub 字节序列与 UPX! 标记在文件头尾出现(防误报):

yara
rule upx_elf_3_94 : packer {
  strings:
    $copyright = "UPX 3.94 Copyright"
  condition:
    upx_unmodified and $copyright   // upx_unmodified 要求 UPX! 在头尾 + ARM stub
}

魔改 UPX 识别 ​

厂商常把 UPX! 标记替换成自家标识,但 stub 字节序列改不掉。规则靠 upx_stub(ARM stub)仍在 + 替换标记识别变体:

  • 梆梆/SecNeo:UPX! → SEC!(旧)或 { 03 02 01 00 }(新)
  • 爱加密:UPX! → AJM!
  • Joker:UPX! → ZHSH / TIW°

嵌入式 UPX(dropper) ​

upx_embedded_inside_elf 检测 ELF 内嵌另一个 UPX 压缩的 ELF——靠"文件开头有 ELF 魔数 7F 45 4C 46,且 256 字节之后又出现 ELF 魔数"识别,tag 同时带 packer 和 dropper。upx_compressed_apk 类似,但 payload 嵌在 APK 里,tag 带 embedded。

so 库符号指纹 ​

多数厂商壳靠特征 so 库名 + JNI 类名识别。如 tencent_legu_VMP_elf 匹配 libxgVipSecurity.so,tongfu_shield_elf 匹配 libegis.so + com/payegis/FirstApplication。

代码指纹(无字符串时) ​

crackproof、zimperium_zshield 等壳剥离了字符串,靠 ARM 指令序列指纹识别——如 do_asm_syscall 的 SVC 0 + 寄存器布局,或 ARM64 内联 syscall 的 MOV X8, #nr + SVC 0 + CMN X0, #4 模式。

📊 finding 示例 ​

json
{
  "tag": "packer::upx_elf_3_92",
  "category": "packer",
  "source": "app.apk!lib/armeabi-v7a/libfoo.so",
  "identifier": "upx_elf_3_92",
  "confidence": "medium",
  "version": "3.92"
}

version: "3.92" 由 _extract_version() 从规则名 upx_elf_3_92 提取。

📍 相关 ​

基于 GPL & Commercial 双重许可发布