萌新自己写的笔记,单纯作为记录,也希望能够帮到他人,如有错误请轻喷^ ^
一般模拟器(非真机模拟器)的安装目录下会有一个adb.exe。如果安装了Android Studio的话也会附带一个adb。如果两种情况都没有则需要去自己下载一个。调试远端的设备(本机上的模拟器一般不用,如雷电模拟器)需要先使用adb connect进行连接再shell。
· adb shell 进入shell,也就是获取一个手机命令行
· adb push 电脑地址 手机地址 将电脑文件导入到手机指定位置
· adb install 电脑地址 安装电脑地址上的apk
· adb connect ip port 链接指定位置的手机(适用于远程调试)
· adb devices 查看当前设备列表
· adb forward agree:port agree:port 转发端口
· adb shell pm uninstall -k --user 0 包名 卸载apk
(这个方法真机模拟器无法使用,真机挂代理方式请看下文第二节)
使用burpsuite、mitmproxy、lamda。
lamda github页面:https://github.com/rev1si0n/lamda/
首先需要准备一个root权限的手机。下载lamda的安装脚本adb中使用sh运行安装(详细步骤请自行查看lamda的ReadMe)。主机中使用pip安装lamda的客户端。
手机如果是模拟器,配置到与主机同一个网段则需要使用桥接模式。使用桥接模式后互相能ping通就可以了。
启动lamda的命令:
sh /data/local/tmp/x86/bin/launch.sh
先启动手机上的lamda。使用lamda是为了挂代理+安装证书。
mitmproxy使用pip命令即可安装(它是一个python module):
pip install mitmproxy
安装mitmproxy的证书(运行mitmdump挂起服务器,浏览器走mitm的代理访问mitm.it即可安装证书)并挂上mitmproxy的代理如下:
#启动代理# sh /data/local/tmp/x86/bin/launch.shfrom lamda.client import *d=Device("192.168.3.31")profile = GproxyProfile()profile.type = GproxyType.HTTP_CONNECT# 此选项请根据实际情况选择你是否需要profile.drop_udp = Trueprofile.host = "192.168.3.82"profile.port = 8899#d.install_ca_certificate("mitmproxy-ca-cert.cer")d.start_gproxy(profile)#d.stop_gproxy()#d.uninstall_ca_certificate("cacert.der")d.beep()
这个脚本在手机端lamda启动后运行一次,听到beep声表示运行成功。
install_ca_certificate就是安装证书的命令,只需要运行一次。
手机端的配置结束,接下来pip安装mitmproxy,使用upstram模式转发流量到上流代理服务器(即BP)即可。
命令为:
mitmdump --mode upstream:127.0.0.1:8080 --listen-port 8899 --ssl-insecure
上面的mitmweb也可以改成mitmproxy 或mitmdump 主要是中间流量的表现形式不同。
有时候直接使用系统的代理会被APK检测到。有些APK的包使用了参数NO_PROXY,会绕过系统代理发送,有些则会在检测到代理的时候停止发包。
目前知道的能够绕过代理的工具有两个,HTTPDroid和lamda。lamda挂代理参考上面的脚本,这个我测试过是可以绕过代理检测的。HTTPDroid及其他基于iptables的工具据称在原理上是可以绕过的。
但是HTTPDroid不能在夜神模拟器上安装。我的建议是普通模拟器上使用lamda,真机模拟器上使用HTTPDroid(因为lamda不能在真机模拟器上使用)或者真机宿主机安装小黄鸟(HTTPCanary)。
有时候APK会校验用户所处的环境是否是真机,这个时候建议直接使用真机或在真机上安装虚拟机。这个原理跟反反爬虫是一样的:再多的掩饰都是虚的,程序员总能从你想不到的角度进行检测,所以最好直接在真机里做操作。比如安装真机虚拟机如VMOS。
但是真机虚拟机是无法使用lamda的(实际的真机可以),用VMOS抓包的一个方式是代理到宿主机的小黄鸟(HTTPCanary),导出.0证书,小黄鸟设置目标应用,虚拟机安装证书。
也可以通过转换过的.0证书+模拟器挂代理代理到mitmproxy然后中转到burpsuite。一样的。
由于虚拟机可能不能直接装证书,即使有ROOT(具体为什么我不知道),只能将证书导出为.0格式然后复制到/system/etc/security/cacerts/下。
cer、pem等格式的证书可以通过openssl转换为.0格式之后手动安装。
命令为(pem与cer都是这个):
openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem -out out.0
有时候,APK会这样:
校验通信中证书的签发HOST。这种情况需要用户反编译找到hostname然后自行制作一个此hostname的证书。证书可以通过openssl生成。
双向认证,指的是APK与服务器各自有一个私钥,每次通信时,通信包会经过两次加密。或者换句话说,就是APK发送到服务器的包要被客户端证书签名,服务器发送到APK的包要被服务器证书签名(如果APK本身还设置了)。这就导致BP等使用的自签名证书不会被服务器端接受。
SSL双向认证体系中,客户端与服务端各拥有一对证书和密钥,在通信过程中:
(1)客户端建立通信,发送SSL版本等信息给服务端
(2)服务端发送服务端证书给客户端,客户端会校验服务端的证书是否在许可范围内
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课