【移动安全】静态分析android程序之关键代码定位技巧
2023-1-26 00:1:53 Author: 白帽子(查看原文) 阅读量:11 收藏

前言

在逆向一个Android程序时,如果盲目的分析,可能需要阅读成千上万行的反汇编代码才能找到程序的关键点,这无疑是浪费时间的表现,本章节将分享一下如何快速的定位程序的关键代码。

一、前期准备

1、反编译andorid程序工具:Android killer V1.3.1.0

2、测试app:junior.apk(未加壳)、piaochacha.apk(加壳)

二、分析流程

1、反编译apk程序

AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且这个文件被加密存储进了apk文件中,开始分析之前,有必要先反编译apk文件对其进行解密。为了方便分析,本章采用了未加壳的app程序:juior.apk。

通过打开已配置好的Android killer ,将测试apk文件拖入即可,该软件会自动对apk文件进行反编译

2、通过 AndroidManifest.xml 查找主 Activity

一个Android程序包含一个或多个Activity组成,不同的Activity实现不同的功能。每个Android程序有且只有一个主Acitivity。隐藏程序除外,它没有主Acitivity。

每个Activity都是Android程序的一个显示页面,负责数据的处理及展示的工作。

在“工程管理器”中打开“AndroidManifest.xml”文件,通过全局搜索关键字main可以快速定位主Activity的位置。

其中有如下片段的代码

<activity android:name="com.example.junior.MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN"/>        <category android:name="android.intent.category.LAUNCHER"/>    </intent-filter></activity>

3、查看程序的入口方法:主 Activity 的 onCreate()方法

找到主Activity的“android:name”属性的值“com.example.junior.MainActivity

通过查看其所在类,找到Oncreate()方法

对于大多数软件来说,这里就是程序的代码入口,所有的功能都从这里开始得到执行,我们可以沿着这里一直向下看,追踪软件的执行流程。

4、需重点关注的application

如果需要在程序的组件之间传递全局变量,或者在Activity启动之前做一些初始化工作,就可以考虑使用Application类了。使用Application时需要在程序中添加一个类继承自android.app.Application,然后重写它的OnCreate()方法,在该方法中初始化的全局变量可以在Android其它组件中访问,当然前提条件是这些变量具有public属性。最后还需要在AndroidManifest.xml文件的Application标签中添加“android:name”属性,取值为继承自android.app.Application的类名。

鉴于Application类比程序中其它的类启动得都要早,一些商业软件将授权验证的代码都转移到了该类中。例如,在OnCreate()方法中检测软件的购买状态,如果状态异常则拒绝程序继续运行。因此,在分析Android程序过程中,我们需要先查看该程序是否具有Application类,如果有,就要看看它的OnCreate()方法中是否做了一些影响到逆向分析的初始化工作。

三、定位关键代码的技巧

1、信息反馈法

所谓信息反馈法,是指先运行目标程序,然后根据程序运行时给出的反馈信息作为突破口寻找关键代码。

通常情况下,程序中用到的字符串会存储在String.xml文件或者硬编码到程序代码中,如果是前者的话,字符串在程序中会以id的形式访问,只需在反汇编代码中搜索字符串的id值即可找到调用代码处;如果是后者的话,在反汇编代码中直接搜索字符串即可。

如下已反编译好的apk文件,找到res/values目录下的string.xml

根据程序的反馈信息进行对比名称,找到其对应关键字,例如Search的对应关键字“abc_searchview _descr ipti on_search”

打开public.xml文件,内容如图,可以看到“abc_searchview_description_search”的id值为0x7f0b0021。

在smali目录中搜索含有内容为0x7f0b0021的文件,最后发现R$string.smali为存储变量的文件。

2、特征函数法

这种定位代码的方法与信息反馈法类似。在信息反馈法中,无论程序给出什么样的反馈信息,终究是需要调用Android SDK中提供的相关API函数来完成的。比如弹出注册码错误的提示信息就需要调用Toast.MakeText().Show()方法,在反汇编代码中直接搜索Toast应该很快就能定位到调用代码,如果Toast在程序中有多处的话,可能需要分析人员逐个甄别。顺序查看法顺序查看法是指从软件的启动代码开始,逐行的向下分析,掌握软件的执行流程,这种分析方法在病毒分析时经常用到。

3、顺序查看法

顺序查看法是指从软件的启动代码开始(如上分析流程),逐行的向下分析掌握软件的执行流程,这种分析方法在病毒分析时经常用到。

四、小结

android killer 是一款可视化的安卓应用逆向工具,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一身,吸收融汇多种工具功能与特点,操作方便快捷,anroid程序逆向的不二之选。

本章对于静态分析android程序快速定位关键代码的讲解,比较偏重操作过程,原理性没有着重讲解,关于定位关键代码的技巧,当然动态调试也可以实现,后期将放到android程序动态分析中。

E

N

D

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246477&idx=2&sn=6551823381cd832cd9957bc98b32f25f&chksm=82ea56e4b59ddff21e9d2a24989c15e2378f941552487ea092c7e98d7bb4fcdeffead191cbf5#rd
如有侵权请联系:admin#unsafe.sh