我如何精通逆向工程?

逆向工程 艾达 安卓 apk
2021-06-25 01:31:25

在我解释这种情况时,请耐心等待。

也许 10 天前,我接受了对 Android 应用程序进行逆向工程的挑战。从头开始学习,我安装了 ADB、Apktool、Android Studio、Notepad++ 和 Smali 高亮等。我的方法是在 Android Studio 中编写反映 APK 工作原理的测试程序,然后用 Apktool 反编译以帮助我进行 Smali 修改。我已成功修改应用程序以记录所有 HTTP 请求、标头、cookie 并将数据发布到 android 日志。

我的下一个挑战是弄清楚应用程序中的一个重要算法是如何工作的。这就是难倒我的原因。在过去的 3 或 4 天里,我大部分时间都在分析 Smali 代码,但几乎没有任何进展。显然,该算法是在具有 .so 扩展名的本机库中完成的(如果不是大部分的话,至少是部分)。

逆向工程最令人沮丧的事情之一是社区太小网络上的资源很少(至少与其他事物相比)。我可能咬得比我能咀嚼的还要多。我总是尝试超出我技能水平的困难项目。对于这项任务,我想我需要非常熟悉 ARM,并且必须使用 IDA Pro 来分析 .so 文件?解释一下我的知识水平:

  • 我在 Windows 中使用 Ollydbg 的经验很少(我对寄存器和 CMP、JMP、ADD 命令等略有了解)
  • 我没有使用 IDA Pro 的经验。我对逆向工程还很陌生,但我在简单的 Smali 修改方面取得了成功,因为它在某些情况下很简单。
  • 我知道基本的 Java(需要明确的是,我不是一个完整的初学者,变量、for 循环、数组、类(在某种程度上)对我来说是第二天性)
  • 我知道基本的 C++ 如果不超过基本的
  • 我做过很多 VB.NET 编程。
  • 我觉得自己对 Python 非常了解。

所以我有编程经验,但不是真正的逆向工程。我怎么会想办法理解这个复杂的本地库(当我对本地库/JNI 几乎一无所知时)?这里的专业人士能否给我一些具体的例子,说明我如何达到知识水平足以完成我的目标?我不想放弃,因为这是一项艰巨的挑战。请给我一些建议,告诉我如何才能取得足够的进步以完成我的目标。我想我需要学习 IDA Pro 以及 ARM 的工作原理。

谢谢

1个回答

在过去的 3 或 4 天里,我大部分时间都在分析 Smali 代码,但几乎没有任何进展。

我知道这感觉就像你“没有进步”,但我鼓励你不要那样看。您花了 3 或 4 天的时间找出哪些方法不起作用,这本身就是进步。而且您还积累了 3 或 4 天的逆向工程经验,无论直接结果如何卓有成效。

显然,该算法是在具有 .so 扩展名的本机库中完成的(如果不是大部分的话,至少是部分)。

...

我是怎么想不明白这个复杂的本地库的?

鉴于您已确定 Java 代码调用 .so 库,因此在 .so 库中找到本机函数应该不会太困难,因为本机函数将按名称导出以实现 JNI 兼容性。这意味着您实际上不需要完整地“理解这个复杂的本机库”,而只需要了解所讨论的一个本机函数(除了该函数调用的函数之外)。

如果本机代码没有被严重混淆,并且您有Hex-Rays for ARM,那么理解目标函数应该相对容易另一方面,如果您没有 Hex-Rays,那么您可以使用IDA Pro评估版来反汇编目标函数。您需要手动分析 ARM 指令以确定该函数在做什么。虽然这可能很乏味,但 ARM 指令和一般的体系结构都有很好的文档记录像学习任何新的编程语言一样对待它。

从第一条指令开始分析函数,并保留关于每条指令在函数上下文中执行的操作的高级注释。跟踪哪些值存储在哪些寄存器中以及如何使用内存。在第一遍,你的目标是,以确定哪些功能是做(基于指令)。一旦你推什么功能是干什么的,你的第二个通应侧重于试图理解为什么功能是做它在做什么。一段时间后,事情应该开始在您的脑海中“咔哒”一声,您会听到“啊哈!” 片刻,您将了解目标算法的工作原理。