安卓逆向:定位关键代码技巧之静态分析

1.入口分析法

    对体积不大的程序,从程序的入口开始进行分析是一种标准的方法。

    每个Android程序由一个或多个Activity及其他组件组成,每个Activity的级别都是相同的,不同的Activity用于实现不同的功能。每个Activity都是Android程序的一个显示“页面”,主要负责数据的处理及展示工作。在Android程序的开发过程中,很多时候程序员是在编写用户与Activity之间的交互代码。

    每个Android程序由且只有一个主Acitivty(隐藏程序除外),它是程序启动的第一个Activity。打开任意一个程序进行反编译,得到的AndroidManifest.xml文件中都有如下代码片段:

<activity android:label="@string/title_activity_main" android:name=".MainActivity">

    <intent-filter>

        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER/">

    <intent-filter/>

</activity>

    程序中使用的Activity都需要在AndroidManifest.xml文件中手动声明。声明Activity应使用activity标签,其中android:label指定了Activity的标题,android:name指定了具体的Activity类,.MainActivity前面省略了程序的包名,intent-filter指定了Activity的启动意图,android.intent.action.Main表示这个Activity是程序的主Activity,android.intent.category.LAUNCHER表示这个Activity可以通过LAUNCHER启动。如果在AndroidMenifest.xml中,所有的Activity都没有添加android.intent.category.LAUNCHER,那么该程序安装到Android设备上后在程序列表中是不可见的。同样,如果没有指定android.intent.action.MAIN,Android系统的LAUNCHER就无法匹配程序的主Activity,因此在程序列表中页不会有该程序的图标。

    在反编译出的AndroidManifest.xml中找到主Activity后,可以直接查看其所在类的OnCreate()方法的反汇编代码。对大多数软件来说,这里就是程序的代码入口,所有的功能都从这里开始执行。我们可以从这里开始一直向下查看,追踪软件的执行流程。

    如果需要在程序的组件之间传递全局变量,或者在Activity启动之前做一些初始化工作,可以考虑使用Application类。在使用Application类时,需要在程序中添加一个继承自android.app.Application的类,然后重写它的OnCreate()方法。

    鉴于Application类比程序中其他的类启动得都早,一些软件将授权验证的代码转移到了该类中。因此,在分析Android程序的过程中,需要先查看程序是否有Application类,如果有,就要看看它的OnCreate()方法是否做了一些影响逆向分析的初始化工作。

2.信息反馈法

    所谓信息反馈法,是指先运行目标程序,然后将程序运行时给出的反馈信息作为突破口来寻找关键代码。如,运行目标程序输入错误的注册码时弹出提示“无效用户名或注册码”,这就是程序向我们反馈的信息。通常情况下,程序中用到的字符串会存储在String.xml文件中或者被硬编码到代码中。如果是前者,字符串会在程序中以id的形式访问,只需在反汇编代码中搜索字符串的id值即可找到调用代码;如果是后者,在反汇编代码中直接搜索字符串即可。

3.特征函数法

    通过特征函数法定位代码的方法与信息反馈法类似。在信息反馈法中,无论程序给出什么样的反馈信息,最终都需要调用Android.SDK中的相关API函数完成。例如,弹出错误注册码的提示信息需要调用Toast.MakeText().Show()方法,在反汇编代码中直接搜索“Toast”,应该很快就能定位到调用代码。如果在程序中有多个Toast,就需要分析人员逐个甄别。

    与Toast类似的还有按钮的响应事件OnClickListener()。如果代码中使用了按钮,必然会为其注册按钮响应事件。在反汇编代码中搜索“OnClickListener()”,就可以列出所有的按钮事件。进一步对类进行筛选,即可快速定位按钮响应事件。

    特征函数法需要分析人员对Android程序开发的流程有所了解。在分析过程中,针对不同类型的APK程序,配合查阅SDK文档,找出其可能用到的特征函数,然后定位程序的关键单,是常用的静态分析手段之一。



    资料来源:《Android软件安全权威指南》——电子工业出版社 2018.12 丰生强

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容