简短的故事,有时会在膝盖上带来便利

ICD信息技术局远程服务通道能力中心主管Artem Azariev

哈Ha!

我的名字叫Artem Azariev,我是Moscow Credit Bank Android团队的负责人,今天我想从调试库的角度来讨论应用程序安全性。 几年来我从事自由职业,后来四年来我一直从事移动OS的全面开发。 碰巧的是,在我的自由职业者的岁月里,为了提高自己的资格,我触及了Android应用程序的逆向工程这一话题,并逐渐成为我的爱好。

引言


长期以来,Android Studio一直没有提供任何机制来从设备充分接收应用程序数据已经不是什么秘密了:数据库的内容,SharedPrefrences,网络请求。 每个人都受苦,包括Facebook之类的巨头。

是他们给社区提供了一个非常有用的库,用于调试Shetho(https://github.com/facebook/stetho),并且只需几行即可非常轻松地将其集成到项目中。 我不会谈论图书馆本身;很可能,许多人已经知道它了,但是谁在乎,他们会自己阅读。

该库的集成如下:





使用Chrome浏览器,我们可以访问数据库的内容和设备上存储的设置,如果我们将okhttp3插件连接到网络上,则还可以访问网络请求的内容。



“但是,它也会在发布版本中吗?” -细心的开发人员会问自己。 让我们转到库的描述-我们对此有何建议?

该示例项目表明,该库只需要在debug分支中通过重载构建选项之一中的清单来初始化。



我们组装启用了缩小功能的发布程序集(minifyEnabled标志)。 我们正在检查浏览器,看不到任何可用于调试的应用程序,因此请安静地进入睡眠状态。

缩小是旨在通过删除不必要的字符而不更改其功能来减小源代码大小的过程。 Android中使用的Proguard工具还涉及清除未使用的代码中的项目。

骇客


应用程序的任何逆向工程都始于研究潜在的书签和后门,这些书签和后门由开发人员自己留给自己。

首先,我们尽可能地用Java反编译应用程序并研究包树。



在受攻击的应用程序中可以找到的最甜蜜的东西是老式的Stetho。 默认情况下配置的最小化不会删除它,通常,该库的整个代码库都只是拖入生产版本中。

我看到了很多相当不错的大型公司的应用程序,这些应用程序已经在生产环境中保留了很多年。

有人会问:“那是什么? 没事了 另外,即使您将其打开,也请稍后尝试构建此应用。”

没错,在Java中进行反编译几乎不会提供100%的工作代码。 但是有smali / backsmali。
Smali / backsmali是dalvik使用的dex格式的汇编程序/反汇编程序,dalvik是Android中的Java VM实现。

通过分解我们的应用程序,我们将看到实际上没有包含任何内容。



但是,添加了几行代码并在项目中包含了库的所有代码之后,我们无需特别费力即可将其重新打开。



对于okhttp3插件,也可以以相同的方式启用支持-通过向OkhttpClient添加拦截器。

收集完应用程序之后(很容易从smali进行收集),我们看到再次可以通过stetho进行调试,并且所有数据在本地设置存储库中,所有api都完全在狡猾的黑客眼前。

怎么办


有很多选项可将软件包从最终版本中排除。 就个人而言,我更喜欢编写一个小的包装程序来初始化Stetho库,并根据汇编选项分解其各种实现。
释放



调试



并指出仅在调试版本中才需要此代码库。



可以呼气


最后,我想讲一下在Android应用程序安全性上下文中使用的基本原则:

  • 最小化,如果可能的话,混淆所有内容。

    无论如何,这会使反编译代码的分析变得复杂。 再包装类标志是在黑客的头上制造白发的另一个参数,该标志将最小化的类移动到一个包装中。 会有很多。
  • 探索您自己的应用程序。

    至少粗略地检查软件包的树可以告诉您很多有关项目中使用的结构,框架,库的信息。 那些显然不属于那里的东西应该无情地删除。
  • 任何工具迟早都会把您射向膝盖。

在项目中添加内容时,即使有充分的理由,也请考虑如何正确执行操作以及您到底需要多少。

希望我的经验对您有所帮助。

Source: https://habr.com/ru/post/zh-CN471738/


All Articles