在逆向一个Android程序时,如果盲目的分析,可能需要阅读成千上万行的反汇编代码才能找到程序的关键点,这无疑是浪费时间的表现,本章节将分享一下如何快速的定位程序的关键代码。
1、反编译andorid程序工具:Android killer V1.3.1.0
2、测试app:junior.apk(未加壳)、piaochacha.apk(加壳)
AndroidManifest.xml文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity,Service,Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest.xml文件,且这个文件被加密存储进了apk文件中,开始分析之前,有必要先反编译apk文件对其进行解密。为了方便分析,本章采用了未加壳的app程序:juior.apk。
通过打开已配置好的Android killer ,将测试apk文件拖入即可,该软件会自动对apk文件进行反编译
一个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>
找到主Activity的“android:name”属性的值“com.example.junior.MainActivity”
通过查看其所在类,找到Oncreate()方法
对于大多数软件来说,这里就是程序的代码入口,所有的功能都从这里开始得到执行,我们可以沿着这里一直向下看,追踪软件的执行流程。
如果需要在程序的组件之间传递全局变量,或者在Activity启动之前做一些初始化工作,就可以考虑使用Application类了。使用Application时需要在程序中添加一个类继承自android.app.Application,然后重写它的OnCreate()方法,在该方法中初始化的全局变量可以在Android其它组件中访问,当然前提条件是这些变量具有public属性。最后还需要在AndroidManifest.xml文件的Application标签中添加“android:name”属性,取值为继承自android.app.Application的类名。
鉴于Application类比程序中其它的类启动得都要早,一些商业软件将授权验证的代码都转移到了该类中。例如,在OnCreate()方法中检测软件的购买状态,如果状态异常则拒绝程序继续运行。因此,在分析Android程序过程中,我们需要先查看该程序是否具有Application类,如果有,就要看看它的OnCreate()方法中是否做了一些影响到逆向分析的初始化工作。
所谓信息反馈法,是指先运行目标程序,然后根据程序运行时给出的反馈信息作为突破口寻找关键代码。
通常情况下,程序中用到的字符串会存储在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为存储变量的文件。
这种定位代码的方法与信息反馈法类似。在信息反馈法中,无论程序给出什么样的反馈信息,终究是需要调用Android SDK中提供的相关API函数来完成的。比如弹出注册码错误的提示信息就需要调用Toast.MakeText().Show()方法,在反汇编代码中直接搜索Toast应该很快就能定位到调用代码,如果Toast在程序中有多处的话,可能需要分析人员逐个甄别。顺序查看法顺序查看法是指从软件的启动代码开始,逐行的向下分析,掌握软件的执行流程,这种分析方法在病毒分析时经常用到。
顺序查看法是指从软件的启动代码开始(如上分析流程),逐行的向下分析掌握软件的执行流程,这种分析方法在病毒分析时经常用到。
android killer 是一款可视化的安卓应用逆向工具,集Apk反编译、Apk打包、Apk签名,编码互转,ADB通信(应用安装-卸载-运行-设备文件管理)等特色功能于一身,吸收融汇多种工具功能与特点,操作方便快捷,anroid程序逆向的不二之选。
本章对于静态分析android程序快速定位关键代码的讲解,比较偏重操作过程,原理性没有着重讲解,关于定位关键代码的技巧,当然动态调试也可以实现,后期将放到android程序动态分析中。
E
N
D
关
于
我
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。