安卓逆向思路:
总思路: app->dex->jar->java
1.对Android 应用程序的安装包Apk 文件进行解压缩,得到内部文件如图;
2.使用dex2jar 工具将解压后得到的classes.dex 文件逆向为.jar 包;
3.使用xmprinter 工具将AndroidManifest.XML 配置文件解密,使其可读;
4.使用 jd_gui这种 Java 反编译工具将②中得到的 jar包逆向为.java 代码文件。
1、查壳
检查程序是否有加固
2、未加固
2.1 工具
ApkTool + jadx 或者 ApkTool,dex2jar,JD-GUI
2.2方法
使用apktool:获取素材资源,AndroidManifest.xml以及smali代码
使用jadx:把「classes.dex」转换为.java代码
3 、第一代加固
3.1 工具
安卓模拟器、文件管理器、开发者助手、XP框架、FDex2、ADB
3.2 方法
1、使用安卓模拟器充当已经root的手机
2、使用开发者助手查询app加固类型、分析软件布局等
3、使用XP框架作为hook工具
4、使用FDex2脱壳
5、使用ADB shell拉取文件
3.3 材料准备
安卓模拟器:mumu模拟器
文件管理器:MT管理器
https://abc.binmt.cc/MT2.8.4.apk
XP框架:xposed installer
https://pan.baidu.com/s/185-auUKjO9ShlJm7pP6Nfw
FDex2:
https://pan.baidu.com/s/1SjAR8_A49ZZPkGG-OW1ofg
adb shell:
网上找教程下载安装
3.4 实例
1、安装mumu模拟器
2、将xposed installer、FDex2、MT管理器和需要破解的软件安装在安卓模拟器上,并设置root权限.
3、安装、配置adb shell,使用adb devices检测安装是否成功,是否可以连接到模拟器上(adb使用手册:https://blog.csdn.net/u010610691/article/details/77663770#%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95)
4、使用adb shell命令将需要破解的软件copy到模拟器文件内
5、配置xposed环境
打开Xposed installer -> 左上角 -> 模块 -> 勾选FDex2 -> 点击FDex2 -> 点击需要hook的软件(图一) -> 记录包名、输出目录 -> 后台回到主页
6、查壳
打开开发者助手,勾选悬浮窗、root、辅助服务选项,然后后台
打开需要脱壳的软件,进入程序化,点击开发者助手悬浮窗,查看加固
7、脱壳
打开需要破解的软件,进入几个页面,进行一些简单的交互,然后使用文件管理器进入dex输出目录,找到dex后缀文件(一般会输出好几个),对比脱壳后的dex文件与未脱壳的dex文件大小,相近的dex文件为实际的脱壳文件.
将源文件classes.dex文件删除,将脱壳后的文件重命名为classes.dex并移动到源文件夹内.
编译AndroidManifest.xml文件,打开后修改程序入口,将A替换为B,并删除C部分代码.然后编译,退出.
删除加固相关文件
回退到apk文件目录、签名、打包.
7、加固检测
重新安装打包好的软件,使用开发者助手查看.
补充知识:
一、Android
1.加密原则:
由于Android 系统支持的应用格式主要以apk 形式存在,应用的主要逻辑实现在apk中的classes.dex 文件中,因此,对classes.dex 文件的保护是保护整个apk 安全的关键所在。
2.安全机制
Android 是建立在Linux 内核之上,并采用Dalvik 虚拟机(Android5.0之后变更为ART)作为应用程序运行环境的操作系统。
系统架构层 | 安全机制 |
---|---|
Linux内核 | POSIXuser |
android本地库及运行环境 | 内存管理单元 |
应用程序框架层 | 文件访问控制 |
Dalvik虚拟机沙盒机制 | |
强类型安全语言 | |
移动设备安全 | |
应用程序权限控制 | |
签名机制 | |
2.1内核级安全机制
由于Android是基于Linux内核的,所以也继承了Linux内核的安全机制。在Android内核级主要的安全机制包括可一直操作系统接口用户(POSIX USER)和文件访问控制。这些机制的基本元素是用户及其拥有的对象,用户再进一步分配到用户组。另外,内存控制机制也一定程度上保证了Android的运行安全。
2.2运行环境级安全机制
安卓程序运行在Dalvik虚拟机(Android5.0之后变更为ART)上.并且每一个应用程序都运行在一个独立的虚拟机上。但是不同于其他虚拟机,如JVM和.NET Runtime作为安全边界有着隔离代码的作用,由于底层Android内核已经实现了沙箱机制,所以Dalvik虚拟机并不作为隔离代码的安全边界。所有应用程序都能运行本地代码,并且均使用相同的安全等级运行在沙盒中。所以在系统运行库Android主要采取强制安全类型来加固Android的系统安全。
强制类型安全机制通过赋值变量时强制检查声明类型与值是否符合,从而保证变量不被错误地使用。
安卓使用java编译器来做数据类型检查,避免类型转换错误或缺少边界检查而造成的缓冲区溢出攻击.
2.3 应用程序框架级安全机制
使用数字签名保证Android系统安全.
安卓应用程序会被打包成.apk,在程序安装前会对文件做数字校验,检查这些文件是否被篡改.
Android签名文件包含以下几个要点:
1、Android系统只会安装带有有效数字签名的应用程序,禁止安装任何未签名的应用程序。
2、Android应用程序是可以自签名的,不需要权威机构的认证。
3、数字签名是有时限的,但只有在安装应用时Android系统才会检测数字签名是否过期,一旦安装成功,系统将不再关注数字签名是否过期。
Android应用程序安全的核心在于权限控制。它用于限制应用程序的访问系统的API和资源。应用程序必须在权限内运行,而不能访问权限外的任何资源。
3.应用程序包分析
3.1. classess.dex(重要)
Java 源码被编译后生成的Dalvik 虚拟机字节码文件,通过dx工具转化为Dalvik虚拟机识别的执行文件
3.2. lib
lib 下的子目录 armeabi 存放的是 so 文件,应用若使用 JNI调用 C/C++动态库,则需要将被调用的so 文件放到该目录下。
3.3. AndroidManifest.xml(重要)
程序的全局配置文件。此文件在每个应用中都必须被定义和包含,它描述了应用的名称、开放权限、引用的库文件、版本号等重要信息。
3.4. resources.arsc
经过编译的二进制资源文件,记录资源文件和资源id的映射。
3.5. res
res 目录是存放资源文件的,包括程序使用的布局文件、图片和字符串常量等。会在R文件中生成索引ID.
3.6. META-INF
META-INF 目录下保存的则是应用中的签名信息,签名信息可以一定程度上验证原始apk 的完整性。
3.7. assets
存放的原生(静态)资源文件(比如so库,HTML资源等原生资源),android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。
4.编译流程
4.1 资源文件处理(AAPT)
assets会原封不动打包在APK中;
res中每一个资源会赋予资源ID,以常量形式定义在R.java中,生成一个resource.arsc文件(资源索引表)
4.2 aidl文件
将aidl后缀的文件转换为可用于进程通信的C/S端Java代码。
4.3 Source Code
编译生成.class文件。
4.4 代码混淆
增加反编译难度,命名缩短为1-2个字母的名字,压缩(移除无效类、属性、方法等),优化bytecode移除没用的结构。
4.5 转换为dex
把所有claas文件转换为classes.dex文件,class -> Dalvik字节码,生成常量池,消除冗余数据等。(方法数超65535会生成多个dex文件)
4.6 打包
把resources.arsc、classes.dex、其他的资源一块打包生成未签名apk。
4.7 签名
对未签名apk进行debug或release签名。
4.8 对齐优化
使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快
5.1 加固
第一代:动态加载
第二代:内存不落地加载
第三代:指令抽取
第四代:指令转换
第五代:虚拟保护
5. 基于保护Classes.dex 不被逆向的安全加固技术
5.1 Classes.dex 工作原理
在Android 源码中(不同版本的源码,可能目录不一样),Dalvik 虚拟机的实现位于dalvik/目录下,其中dalvik/vm 是虚拟机的实现部分,将会编译成 libdvm.so;而 dalvik/libdex 将会编译成 libdex.a静态库作为 dex 工具;dalvik/dexdump 是.dex 文件的反编译工具;虚拟机的可执行程序位于dalvik/dalvikvm 中,将会编译成dalvikvm 可执行文件。
Android 平台应用程序在运行时,首先由Dalvik 虚拟机加载解包后的Classes.dex 文件,然后dalvik 虚拟机会从中读取指令和数据,进而运行该应用的程序逻辑。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cY1zrgT9-1579049149522)(反编译心得.assets/image-20191211155919382.png)]
5.2加固方案
- Classes.dex壳:它是用于 Android 程序运行时被 Dalvik 虚拟机加载的 dex 文件,里面不再包含Android 程序的功能代码;
- AndroidManifest.XML:它将原AndroidManifest.XML 中的入口替换为新入口;
- Encrypt_Classes.dex:它是原Classes.dex 经过白盒加密后的文件,包含了Android程序的主要功能代码,也是重点保护对象;
- Encrypt_decryption.so:decryption.so 是用于解密 Encrypt_Classes.dex 的 so 文件,为了确保解密方法不被泄露,将decryption.so 文件再加密一层为Encrypt_decryption.so。
-
Entry.so:程序启动后的入口so 文件,用于调用Encrypt_decryption.so 来解密Encrypt_Classes.dex。
5.3实现流程
为实现保护源程序Classes.dex 文件的安全性,用白盒算法对Classes.dex 文件进行加密,并自定义一个新的Classes.dex 文件。Dalvik 虚拟机在将应用加载到内存中时,首先加载 Classes.dex,Classes.dex将对原 Classes.dex 文件进行解密和完整性检查,再将原Classes.dex 文件加载至内存并运行,最后将解密后的Classes.dex 文件从本地物理存储空间中删除,从而保证了Classes.dex 文件的安全加载,并且防止Classes.dex 文件被篡改。由于程序的运行逻辑仍然为原Classes.dex 文件中的实现,所以保证了应用的功能不受影响。具体调用逻辑如下:
二、https与http
1.什么是 HTTPS
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
https:URL 表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
它最初由Netscape开发内置于其浏览器中,用于对数据进行加密和解密操作,并返回网络上传送的结果。
HTTPS使用端口443,而不是像HTTP那样适用端口80来和TCP/IP 进行通信。SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
主要作用分为两种:
- 一种是建立一个信息安全通道,来保证数据传输的安全。
- 另一种就是确认网站的真实性,凡是使用https的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息。也可以通过CA 机构颁发的安全签章来查询。
2.HTTPS 和 HTTP 的区别
超文本传输协议HTTP协议被用于在Web浏览器和服务器之间传递信息。
- HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
- 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
区别
HTTPS和HTTP的区别主要为以下五点:
- https 用的 443 端口, http 用的 80 端口
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
3.信任主机的问题
- 采用 https 的服务器必须从CA(Certificate Authority)申请一个用于证明服务器用途类型的证书。
- 该证书只有用于对应的服务器的时候,客户端才信任此主机。所以所有的银行系统网站,关键部分应用都是https 的。
- 客户通过信任该证书,从而信任了该主机。其实这样做效率很低,但是银行更侧重安全。
- 这一点对局域网对内提供服务处的服务器没有任何意义。局域网中的服务器,采用的证书不管是自己发布的还是从公众的地方发布的,其客户端都是自己人,所以该局域网中的客户端也就肯定信任该服务器。
4.SSL协议提供的服务主要有哪些
- 认证用户和服务器,确保数据发送到正确的客户机和服务器。
- 加密数据以防止数据中途被窃取
- 维护数据的完整性,确保数据在传输过正中不被改变。
5.SSL 证书种类
CFCA,GlobalSign,VeriSign ,Geotrust ,Thawte
域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站;
企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。
ADB(安卓调试桥)
介绍
Android调试桥( adb )是一个开发工具,帮助安卓设备和个人计算机之间的通信。 这种通信大多是在USB电缆下进行,但是也支持Wi-Fi连接。 adb 还可被用来与电脑上运行的安卓模拟器交流通信。
使用
基本语法
adb [-d|-e|-s <serialNumber>] <command>
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
启动/停止
# 启动
adb start-server
# 停止
adb kill-server
查看adb版本/安装路径
adb version
以root权限运行adbd
# 运行root
adb root
# 退出root
adb unroot
获取设备信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-id0Zjjtz-1579049149528)(反编译笔记.assets/image-20191230101005534.png)]
adb devices
# 状态device -> 已连接
# 状态offline -> 连接失败
# 状态no device -> 没有设备/模拟器
> emulator-5554 # device中emulator-5554为设备号,即serialNumber
复制电脑里的文件到设备
adb -e(模拟器-e \ 实体机-d) push ~\Desktop\(电脑文件路径) \data\user\0\111.apk(设备路径)
复制设备里的文件到电脑
adb -e(模拟器-e \ 实体机-d) pull \data\user\0\111.apk(设备路径) ~\Desktop\(电脑文件路径)
指定adb server网络端口
# 默认5037端口
adb -P <port> start-server
无线连接(需要借助 USB 线)
1、将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
2、将设备与电脑通过 USB 线连接。
3、让设备在 5555 端口监听 TCP/IP 连接: adb tcpip 5555
4、断开 USB 连接。
5、找到设备的 IP 地址。一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到
6、通过 IP 地址连接设备。 adb connect <device-ip-address>
查看应用列表
语法
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
参数 | 显示列表 |
---|---|
无 | 所有应用 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
<FILTER> | 包名包含 <FILTER>字符串 |
安装 APK
语法
adb install [-lrtsdg] <path_to_apk>
参数 | 含义 |
---|---|
-l | 将应用安装到保护目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
-s | 将应用安装到 sdcard |
-d | 允许降级覆盖安装 |
-g | 授予所有运行时权限 |
卸载APK
语法
adb uninstall [-k] <packagename>
清除应用数据与缓存
语法
adb shell pm clear <packagename>
查看当前处于前台的 Activity
语法
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在运行的 Services
语法
adb shell dumpsys activity services [<packagename>]
参数不是必须的,指定
表示查看与某个包名相关的 Services,不指定表示查看所有 Services。`` 不一定要给出完整的包名,比如运行
adb shell dumpsys activity services org.mazhuang
,那么包名org.mazhuang.demo1
、org.mazhuang.demo2
和org.mazhuang123
等相关的 Services 都会列出来。
模拟按键/输入
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
例子:
adb shell input keyevent <keycode>
# 电源键
adb shell input keyevent 26
# HOME 键
adb shell input keyevent 3