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

我的下一个挑战是弄清楚应用程序中一种重要算法的工作原理。这就是让我难过的地方。我花了整整三天的时间来分析Smali代码,但几乎没有任何进展。显然,该算法是在具有.so扩展名的本机库中完成的(至少部分是如果不是大部分的话)。

逆向工程最令人沮丧的事情之一就是社区的规模很小。网络上的资源很少(至少与其他资源相比)。我咬的东西可能超过了我的咀嚼能力。我总是尝试超出我的技能水平的困难项目。为此,我想我需要对ARM非常熟悉,并且必须使用IDA Pro分析.so文件?要说明我的知识水平:


我在Windows中使用Ollydbg的经验很少(我对寄存器和CMP,JMP,ADD命令等有一点了解)
我没有
使用IDA Pro的经验。我是逆向工程的新手,但我在简单的Smali改装方面就取得了成功,因为在某些情况下它很简单。变量,例如循环,数组,类(在某种程度上)是我的第二天性)编程。
我对Python非常了解。

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

感谢

评论

如果F5键可以在SO文件功能上使用,则IDA PRO几乎不需要了解。.您可以执行CTRL + F5并读取代码,如果您了解编程语言,则可以很容易地理解它所泵出的算法。如果您不能执行F5,那么您会遇到更多困难。因为按照我的理解,这是linux。 。可能完全相同,只是操作系统不同。

如果您有很多时间..找出所需的.so文件的导出并将其跟踪到ollydbg中。制作一个简单的程序来加载该.so文件并调用该文件以导出并跟踪该文件。如果其他所有方法都无法解决,那么您通常需要做的就是为特定的.dll文件调用建立TCP / UDP服务器,然后通过将特定的数据包发送到服务器来检索答案。
您是否同时尝试了两种idaq?和idaq64?它应该工作。.我发现这篇文章表明在Windows和Linux上它是同一件事。
反编译为java,而不是smali。例如。 dex2jar然后是JAD或luyten.Or Jeb :) PS IDA Pro的ARM代码没有问题,至少是付费版本。

@VitalyOsipov似乎Enjarify也擅长将dex转换为jar。但是,将Jars转换为Java的程序似乎无法100%正常工作。能够使用调试器逐步完成反编译后的Java代码,这将是非常不错的选择,但是我尝试了一下,但对我而言却无效。我遵循了本教程:blog.netspi.com/attacking-android-applications-with-debuggers但是我的调试器最终还是用红色强调了几乎所有Java :(

#1 楼


我花了整整3或4天的时间
用了大部分时间来分析Smali代码,但几乎没有进展。


我知道就像您取得了“没有进展”一样,但我鼓励您不要那样看。您花了3或4天的时间弄清楚哪些方法行不通,哪些方法本身就在进步。而且您还积累了3或4天的逆向工程经验,无论立即取得的成果多么丰硕。 >主要是在具有.so扩展名的本机库中。

...

我想如何理解这个复杂的本机库? >

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

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

从第一条指令开始分析功能,并在功能上下文中保留有关每条指令执行操作的高级注释。跟踪哪些值存储在哪些寄存器中以及如何使用内存。在初次通过时,您的目标是确定功能(根据说明)在做什么。一旦推断出函数的功能,第二遍应该专注于尝试理解函数为什么执行其功能。一段时间后,事情应该开始在您的脑海中“点击”,您将获得“啊哈!”瞬间,您将了解目标算法的工作原理。

评论


Nitpick:JNI函数不必按名称导出。它们可以在混淆的JNI_OnLoad函数中注册。我从来没有在野外看到过。

–锑
16年1月15日在14:52

这是非常正确的:“我知道您感觉自己没有取得任何进展,但是我鼓励您不要那样看。您花了3或4天的时间弄清楚哪种方法无效,哪种本身就是进步。而且,无论立竿见影的成效如何,您还需要积累3或4天的逆向工程经验。

– Ta Thanh Dinh
16年1月15日在15:38

@JasonGeffner很好,我意识到代码使用的是本地库,部分是通过在线搜索其他试图破解同一算法的库,部分是因为lib文件夹中有一个.so文件与Smali中的函数名称匹配。搜索不带扩展名的库名称将显示零个结果。但是我想我知道它在哪里被调用。现在对我来说最困难的部分是因为我不知道如何调用本机库,所以我不知道要搜索什么。知道将什么参数传递给它,将很有帮助。

– 43.52.4D。
16年1月15日在17:54

@JasonGeffner一个有趣的辅助方法是可能只是弄清楚将哪些参数传递给函数,然后每当我需要使用算法来生成值时,也许我就可以调用.so文件,而无需了解算法的实际工作原理。 (特别是如果事实证明这是一套庞大的说明)

– 43.52.4D。
16年1月15日在17:56

如果您没有十六进制射线,则也可以使用retdec,它会产生一些相当高质量的输出(相对于本机代码反编译器的典型输出)。 retdec.com

–百老汇
16 Jan 15 '19:32