总思路: app->dex->jar->java
1.对Android 应用程序的安装包Apk 文件进行解压缩,得到内部文件如图;
2.使用dex2jar 工具将解压后得到的classes.dex 文件逆向为.jar 包;
3.使用xmprinter 工具将AndroidManifest.XML 配置文件解密,使其可读;
4.使用 jd_gui这种 Java 反编译工具将②中得到的 jar包逆向为.java 代码文件。
检查程序是否有加固
ApkTool + jadx 或者 ApkTool,dex2jar,JD-GUI
使用apktool:获取素材资源,AndroidManifest.xml以及smali代码
使用jadx:把「classes.dex」转换为**.java**代码
安卓模拟器、文件管理器、开发者助手、XP框架、FDex2、ADB
1、使用安卓模拟器充当已经root的手机
2、使用开发者助手查询app加固类型、分析软件布局等
3、使用XP框架作为hook工具
4、使用FDex2脱壳
5、使用ADB shell拉取文件
安卓模拟器:mumu模拟器
https://mumu.163.com/
文件管理器: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:
网上找教程下载安装
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 系统支持的应用格式主要以apk 形式存在,应用的主要逻辑实现在apk中的classes.dex 文件中,因此,对classes.dex 文件的保护是保护整个apk 安全的关键所在。
Android 是建立在Linux 内核之上,并采用Dalvik 虚拟机(Android5.0之后变更为ART)作为应用程序运行环境的操作系统。
系统架构层 | 安全机制 |
---|---|
Linux内核 | POSIXuser |
android本地库及运行环境 | 内存管理单元 |
应用程序框架层 | 文件访问控制 |
Dalvik虚拟机沙盒机制 | |
强类型安全语言 | |
移动设备安全 | |
应用程序权限控制 | |
签名机制 | |
由于Android是基于Linux内核的,所以也继承了Linux内核的安全机制。在Android内核级主要的安全机制包括可一直操作系统接口用户(POSIX USER)和文件访问控制。这些机制的基本元素是用户及其拥有的对象,用户再进一步分配到用户组。另外,内存控制机制也一定程度上保证了Android的运行安全。
安卓程序运行在Dalvik虚拟机(Android5.0之后变更为ART)上.并且每一个应用程序都运行在一个独立的虚拟机上。但是不同于其他虚拟机,如JVM和.NET Runtime作为安全边界有着隔离代码的作用,由于底层Android内核已经实现了沙箱机制,所以Dalvik虚拟机并不作为隔离代码的安全边界。所有应用程序都能运行本地代码,并且均使用相同的安全等级运行在沙盒中。所以在系统运行库Android主要采取强制安全类型来加固Android的系统安全。
强制类型安全机制通过赋值变量时强制检查声明类型与值是否符合,从而保证变量不被错误地使用。
安卓使用java编译器来做数据类型检查,避免类型转换错误或缺少边界检查而造成的缓冲区溢出攻击.
使用数字签名保证Android系统安全.
安卓应用程序会被打包成.apk,在程序安装前会对文件做数字校验,检查这些文件是否被篡改.
Android签名文件包含以下几个要点:
1、Android系统只会安装带有有效数字签名的应用程序,禁止安装任何未签名的应用程序。
2、Android应用程序是可以自签名的,不需要权威机构的认证。
3、数字签名是有时限的,但只有在安装应用时Android系统才会检测数字签名是否过期,一旦安装成功,系统将不再关注数字签名是否过期。
Android应用程序安全的核心在于权限控制。它用于限制应用程序的访问系统的API和资源。应用程序必须在权限内运行,而不能访问权限外的任何资源。
Java 源码被编译后生成的Dalvik 虚拟机字节码文件,通过dx工具转化为Dalvik虚拟机识别的执行文件
lib 下的子目录 armeabi 存放的是 so 文件,应用若使用 JNI调用 C/C++动态库,则需要将被调用的so 文件放到该目录下。
程序的全局配置文件。此文件在每个应用中都必须被定义和包含,它描述了应用的名称、开放权限、引用的库文件、版本号等重要信息。
经过编译的二进制资源文件,记录资源文件和资源id的映射。
res 目录是存放资源文件的,包括程序使用的布局文件、图片和字符串常量等。会在R文件中生成索引ID.
META-INF 目录下保存的则是应用中的签名信息,签名信息可以一定程度上验证原始apk 的完整性。
存放的原生(静态)资源文件(比如so库,HTML资源等原生资源),android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定文件的路径和文件名。
assets会原封不动打包在APK中;
res中每一个资源会赋予资源ID,以常量形式定义在R.java中,生成一个resource.arsc文件(资源索引表)
将aidl后缀的文件转换为可用于进程通信的C/S端Java代码。
编译生成.class文件。
增加反编译难度,命名缩短为1-2个字母的名字,压缩(移除无效类、属性、方法等),优化bytecode移除没用的结构。
把所有claas文件转换为classes.dex文件,class -> Dalvik字节码,生成常量池,消除冗余数据等。(方法数超65535会生成多个dex文件)
把resources.arsc、classes.dex、其他的资源一块打包生成未签名apk。
对未签名apk进行debug或release签名。
使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快
第一代:动态加载
第二代:内存不落地加载
第三代:指令抽取
第四代:指令转换
第五代:虚拟保护
在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)]
为实现保护源程序Classes.dex 文件的安全性,用白盒算法对Classes.dex 文件进行加密,并自定义一个新的Classes.dex 文件。Dalvik 虚拟机在将应用加载到内存中时,首先加载 Classes.dex,Classes.dex将对原 Classes.dex 文件进行解密和完整性检查,再将原Classes.dex 文件加载至内存并运行,最后将解密后的Classes.dex 文件从本地物理存储空间中删除,从而保证了Classes.dex 文件的安全加载,并且防止Classes.dex 文件被篡改。由于程序的运行逻辑仍然为原Classes.dex 文件中的实现,所以保证了应用的功能不受影响。具体调用逻辑如下:
####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数字认证,如果需要的话用户可以确认发送者是谁。
主要作用分为两种:
超文本传输协议HTTP协议被用于在Web浏览器和服务器之间传递信息。
区别
HTTPS和HTTP的区别主要为以下五点:
CFCA,GlobalSign,VeriSign ,Geotrust ,Thawte
域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站;
企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。
来源: https://blog.csdn.net/u010610691/article/details/77663770#%E6%8C%87%E5%AE%9A-adb-server-%E7%9A%84%E7%BD%91%E7%BB%9C%E7%AB%AF%E5%8F%A3
Android调试桥( adb )是一个开发工具,帮助安卓设备和个人计算机之间的通信。 这种通信大多是在USB电缆下进行,但是也支持Wi-Fi连接。 adb 还可被用来与电脑上运行的安卓模拟器交流通信。
adb [-d|-e|-s ]
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
# 启动
adb start-server
# 停止
adb kill-server
adb version
# 运行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\(电脑文件路径)
# 默认5037端口
adb -P <port> start-server
1、将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
2、将设备与电脑通过 USB 线连接。
3、让设备在 5555 端口监听 TCP/IP 连接: adb tcpip 5555
4、断开 USB 连接。
5、找到设备的 IP 地址。一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到
6、通过 IP 地址连接设备。 adb connect
语法
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 | 包含已卸载应用 |
包名包含 字符串 |
语法
adb install [-lrtsdg] <path_to_apk>
参数 | 含义 |
---|---|
-l | 将应用安装到保护目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
-s | 将应用安装到 sdcard |
-d | 允许降级覆盖安装 |
-g | 授予所有运行时权限 |
语法
adb uninstall [-k] <packagename>
语法
adb shell pm clear <packagename>
#####查看当前处于前台的 Activity
语法
adb shell dumpsys activity activities | grep mFocusedActivity
语法
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 [
例子:
adb shell input keyevent <keycode>
# 电源键
adb shell input keyevent 26
# HOME 键
adb shell input keyevent 3