请选择 进入手机版 | 继续访问电脑版

安卓开发:逆向的前提

2019-1-29 12:26
1510
对于安卓的逆向工程,首先需要具备一定的正向开发基础。如果有一定的开发基础,我们就能在逆向分析之前快速的定位到关键点,在漫漫代码中找到我们的突破口。在使用工具进行反编译,得到了程序的源码之后,我们也不会因为由于对某个开发细节的不熟悉,导致我们没能更加好的去理解程序的设计原理。所以有一个较好的安卓开发基础是逆向的前提,这也是我把一篇关于开发的文章,作为逆向工程系列第一篇文章的原因。
一、工程目录结构

我们先在Android studio中新建一个项目,生成了一个Android模式的工程目录结构,这种目录结构是经过Android studio转化过的,并不是真实项目本身的工程目录结构,我们将其切换成project。
安卓开发:逆向的前提-1.jpg
安卓开发:逆向的前提-2.jpg
目录文件虽然很多,但是我们关注却只有app文件中的以下几个:
build:存放着编译生成的apk,有时候自己写程序自己逆向的时候可以在这个文件里找到我们要逆向分析的apk。
libs:存放一些第三方的jar包。
Java:存放java源码。
res:存放一些例如布局、图片、字符串等等的资源,这个文件夹有很多子目录,图片在drawalbe目录下,布局在layout目录下,字符串在values目录下,我们逆向的时候如果要更改字符串图片资源就要注意这个相关的目录。
AndroidManifest.xml:这是一个在逆向过程中比较重要的文件。它是整个Android项目的资源配置文件,简单讲这就是一个对Android项目整体进行介绍的文件,在这个文件里有所有四大组件的注册以及各种权限的声明,有些标签对于逆向来说还是很重要的。


二、四大组件

1、 Activity
Activity简单来说就是一个界面,其实可以分成两个部分来介绍,第一是用户打开app所看到的视图部分,第二就是用户看不到但却在其背后进行信息处理的逻辑部分。
i. 视图
右键layout文件夹创建布局文件
安卓开发:逆向的前提-3.jpg
在text中有一部分是用xml文件来描述我们的界面,红箭头所指是布局,黑箭头所指是控件。控件就是像按钮、可以输入输出的文本框这类在我们的界面上回实现一定功能的小区域,而布局可以把它理解为是将这些控件以一个什么样的方式进行排布。布局和控件有着什么样的关系呢?布局可以理解为是一个装东西的盒子,而控件可以把它当做一个实际的物品。盒子里不光可以装物品,也可以装盒子,这就实现了布局之间的嵌套。盒子里的物品和小盒子要遵循一套标准的摆放方式。每个布局和控件都有很多像大小、颜色、位置、ID,这样的属性标签,来对这些部分进行具体的描述。
安卓开发:逆向的前提-4.jpg
Design中就是对我们的界面进行一次视图化的展示,我们也可以以直接拖动控件的方式来对我们的视图进行布置。
安卓开发:逆向的前提-5.jpg
ii. 逻辑
右键我们的包可以创建一个activity的类。
安卓开发:逆向的前提-6.jpg
我们要在类的OnCreate方法中使用setContentView方法来对我们的视图进行绑定才可以对这个视图进行逻辑代码的编写。
也可以使用findViewById方法来来对具体的控件进行绑定,就可以对这个控件进行操作。比如我们在button实例对象中调用setOnClickListener方法,就可以实现点击按钮之后所触发的逻辑。
这里实现的是使用显式Intent对另一个activity的启动。
安卓开发:逆向的前提-7.jpg
2、 BroadcastReceiver
我们可以通过广播机制来实现应用对于消息的发送和接受,并做出相应的响应。广播一般有两种注册方式,在代码中进行动态注册,在AndroidMainfest.xml中进行静态注册。
首先我们先要创建广播,只需要新建一个类并让其继承自BroadcastReceover,然后在重写其中的onReceive方法即可。这样我们就能实现当有广播到来时,这部分的逻辑就可以得到执行。
动态注册方法如下,动态注册可以自由的控制注册与注销,有时涉及到一些敏感的操作是还需要在配置文件中申请权限,但是他有一个缺点,因为我们要执行onCreate方法所以只有在程序运行的时候才会启动广播。
安卓开发:逆向的前提-8.jpg
静态注册就可以避免这个问题。新建一个广播接收器之后并在配置文件中进行注册。
安卓开发:逆向的前提-9.jpg
同时在< intent-filer>标签中添加相应的action,同时再申请相应的权限。
安卓开发:逆向的前提-10.jpg
发送广播也很简单,创建一个Intent实例,添加一个action,然后发送即可。
安卓开发:逆向的前提-11.jpg
只不过有序广播还要在配置文件中设置优先级。
3、 ContentProvider
主要是实现不同的应用之间进行安全的数据共享,有一下两种使用方式。
首先是使用现有的内容提供器来读取和操作相应程序中的数据。
传递内容url之后,就可以非常清楚的知道我们要访问那个程序的那张表里的数据,然后就可以进行增加、修改、查询、删除操作了。
其次是创建自己的内容提供器来给我们程序的数据提供被外部访问的接口。
创建一个继承自ContentProvider的类,重写它的6个抽象方法
4、 Service
实现程序的后台运行,用于执行那些不需要和用户进行交互,但是需要长时间运行的任务。
定义一个服务,重写其中的三个方法。
安卓开发:逆向的前提-12.jpg
安卓开发:逆向的前提-13.jpg
启动和停止服务
安卓开发:逆向的前提-14.jpg


三、其他常用的API

在逆向分析的过程中,有时候我们会插入一些代码,帮助我们跟踪,监测程序的信息。
安卓开发:逆向的前提-15.jpg
1、 Log
日志,插入之后可以在monitor和adb logcat中进行查看
安卓开发:逆向的前提-16.jpg
2、 Toast
一种提醒方式,弹出一个小消息之后自动消失。


四、实现一个简单的登陆界面

新建一个安卓工程,先写一个界面。
安卓开发:逆向的前提-17.jpg
安卓开发:逆向的前提-18.jpg
再写一下背后的逻辑。
安卓开发:逆向的前提-19.jpg
编译一下就可以在手机上运行了。


五、总结

下篇估计要讲java层的逆向,在native逆向之前应该会讲一下jni编程。Jdk、Android studio、sdk、ndk的下载和配置、Java、C/C++基础大家自己解决,要说的一点就是下载sdk之后,要将sdk中的tool也配置环境变量,adb、monitor这些工具我们后续还会用到,monitor如果打不开总报错,将jre复制到里面就可以了。这篇文章只是对Android的开发有了一个简单的梳理,不光是很多在开发中很重要的知识,还有很多关于逆向所涉及到的部分比如application、反射机制等等都没有介绍到,很多细节还需要自己去学习。后续讲到涉及这些领域的知识时在详细的进行介绍。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|翁笔

© 2001-2018 Wengbi.com

返回顶部