From 69168167897f1972e36a838bee172e7d6ed4f04f Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 3 Sep 2025 20:09:57 +0000 Subject: [PATCH] Translated ['', 'src/generic-methodologies-and-resources/basic-forensic- --- .../zips-tricks.md | 164 ++++++++++++++++-- 1 file changed, 154 insertions(+), 10 deletions(-) diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md index e6d67b3ba..bddef4444 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md @@ -1,21 +1,165 @@ -# ZIPs tricks +# ZIPs 技巧 {{#include ../../../banners/hacktricks-training.md}} -**命令行工具** 用于管理 **zip 文件** 对于诊断、修复和破解 zip 文件至关重要。以下是一些关键工具: +**命令行工具** 用于管理 **zip files**,对诊断、修复和破解 zip files 至关重要。下面是一些关键的实用程序: -- **`unzip`**: 揭示 zip 文件无法解压的原因。 -- **`zipdetails -v`**: 提供 zip 文件格式字段的详细分析。 -- **`zipinfo`**: 列出 zip 文件的内容而不提取它们。 -- **`zip -F input.zip --out output.zip`** 和 **`zip -FF input.zip --out output.zip`**: 尝试修复损坏的 zip 文件。 -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: 一种用于暴力破解 zip 密码的工具,适用于大约 7 个字符的密码。 +- **`unzip`**:显示 zip 文件无法解压的原因。 +- **`zipdetails -v`**:提供对 zip 文件格式字段的详细分析。 +- **`zipinfo`**:在不解压的情况下列出 zip 文件的内容。 +- **`zip -F input.zip --out output.zip`** 和 **`zip -FF input.zip --out output.zip`**:尝试修复损坏的 zip 文件。 +- **[fcrackzip](https://github.com/hyc/fcrackzip)**:用于对 zip 密码进行暴力破解的工具,对大约 7 个字符以内的密码有效。 -[Zip 文件格式规范](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) 提供了关于 zip 文件结构和标准的全面细节。 +[Zip file format specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) 提供了关于 zip files 结构和标准的全面细节。 -需要注意的是,受密码保护的 zip 文件 **不加密文件名或文件大小**,这是一个与 RAR 或 7z 文件不同的安全缺陷,后者会加密这些信息。此外,使用较旧的 ZipCrypto 方法加密的 zip 文件在有未加密的压缩文件副本可用时容易受到 **明文攻击**。此攻击利用已知内容来破解 zip 的密码,这一漏洞在 [HackThis 的文章](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) 中有详细说明,并在 [这篇学术论文](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) 中进一步解释。然而,使用 **AES-256** 加密的 zip 文件对这种明文攻击免疫,展示了为敏感数据选择安全加密方法的重要性。 +需要注意的是,受密码保护的 zip files **不会加密文件名或文件大小**,这是一个安全缺陷,RAR 或 7z 文件可以加密这些信息。进一步地,使用较旧的 ZipCrypto 方法加密的 zip files 如果存在未加密的压缩文件副本,则容易遭受 **plaintext attack**。该攻击利用已知内容来破解 zip 的密码,相关漏洞在 [HackThis's article](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) 中有描述,并在 [this academic paper](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf) 中有更详细的解释。然而,使用 **AES-256** 加密的 zip files 对该 plaintext attack 免疫,这凸显了为敏感数据选择安全加密方法的重要性。 -## References +--- + +## 在 APKs 中使用篡改的 ZIP 头的反逆向技巧 + +现代 Android 恶意软件 dropper 会使用畸形的 ZIP 元数据来破坏静态工具(jadx/apktool/unzip),同时保持 APK 在设备上可安装。最常见的技巧有: + +- 通过设置 ZIP General Purpose Bit Flag (GPBF) 的位 0 来伪装加密 +- 滥用大型/自定义 Extra 字段以混淆解析器 +- 通过文件/目录名冲突来隐藏真实工件(例如,在真实的 `classes.dex` 旁边放置一个名为 `classes.dex/` 的目录) + +### 1) 伪装加密(设置 GPBF 位 0)但没有真实加密 + +症状: +- `jadx-gui` 会报错,例如: + +``` +java.util.zip.ZipException: invalid CEN header (encrypted entry) +``` +- `unzip` 会提示输入核心 APK 文件的密码,尽管有效的 APK 不能对 `classes*.dex`, `resources.arsc`, 或 `AndroidManifest.xml` 进行加密: + +```bash +unzip sample.apk +[sample.apk] classes3.dex password: +skipping: classes3.dex incorrect password +skipping: AndroidManifest.xml/res/vhpng-xhdpi/mxirm.png incorrect password +skipping: resources.arsc/res/domeo/eqmvo.xml incorrect password +skipping: classes2.dex incorrect password +``` + +Detection with zipdetails: +```bash +zipdetails -v sample.apk | less +``` +查看本地和中央头部的通用用途位标志 (General Purpose Bit Flag)。一个明显的值是位 0 被设置 (Encryption),即使对于核心条目也是如此: +``` +Extract Zip Spec 2D '4.5' +General Purpose Flag 0A09 +[Bit 0] 1 'Encryption' +[Bits 1-2] 1 'Maximum Compression' +[Bit 3] 1 'Streamed' +[Bit 11] 1 'Language Encoding' +``` +启发式:如果 APK 在设备上安装并运行,但工具显示核心条目“加密”,则 GPBF 被篡改。 + +修复方法:在 Local File Headers (LFH) 和 Central Directory (CD) 条目中清除 GPBF 的 bit 0。最小 byte-patcher: +```python +# gpbf_clear.py – clear encryption bit (bit 0) in ZIP local+central headers +import struct, sys + +SIG_LFH = b"\x50\x4b\x03\x04" # Local File Header +SIG_CDH = b"\x50\x4b\x01\x02" # Central Directory Header + +def patch_flags(buf: bytes, sig: bytes, flag_off: int): +out = bytearray(buf) +i = 0 +patched = 0 +while True: +i = out.find(sig, i) +if i == -1: +break +flags, = struct.unpack_from(' 1: +print('COLLISION', base, '->', variants) +``` +Blue-team detection ideas: +- 标记那些本地头部标记为加密 (GPBF bit 0 = 1) 但仍可安装/运行的 APKs。 +- 标记核心条目上大型或未知的 Extra fields(检查类似 `JADXBLOCK` 的标记)。 +- 标记路径冲突 (`X` 和 `X/`),尤其是对 `AndroidManifest.xml`、`resources.arsc`、`classes*.dex`。 + +--- + +## 参考 - [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) +- [GodFather – Part 1 – A multistage dropper (APK ZIP anti-reversing)](https://shindan.io/blog/godfather-part-1-a-multistage-dropper) +- [zipdetails (Archive::Zip script)](https://metacpan.org/pod/distribution/Archive-Zip/scripts/zipdetails) +- [ZIP File Format Specification (PKWARE APPNOTE.TXT)](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) {{#include ../../../banners/hacktricks-training.md}}