如何优雅的抓包
目标:喜马拉雅FM
要求:获取软件的发送数据的端口和数据
环境:Kali Lunux/Android
通过Objection定位关键位置
$ objection -N -h 192.168.31.227 -g com.ximalaya.ting.android explore
首先通过以上命令进入objection交互界面,如图0-1所示
现在需要找到所有和Socket有关的函数
$ android hooking search classes socket
搜索结果如图0-2所示
1 | [Landroid.bluetooth.BluetoothSocket$SocketState; |
⚠注意:
在Objection中android hooking watch class 无法hook构造参数!需要手动修改 agent.js实现watch class的地方,然后添加
$init
来hook构造参数
将之前得到的搜索结果全部hook(这里可以通过保存hook搜索结果到文本,将文本每行前面加入 android hooking watch class
用-c
参数hook文本里所有函数 ),观察发送数据时那些函数被调用了
打印可疑的函数的堆栈,发现java.net.SocketOutputStream.write(SocketOutputStream.java:161) 如图所示0-4
通过查看Android源码SocketOutputStream.java:161发现write()函数又调用了socketWrite()函数 如图0-5所示
socketWrite(byte b[], int off, int len)
byte b[]
: 要写入的数据
int off
: 数据中的起始偏移量
int len
:被写入的字节数
代码实现
获取http response
hook
java.net.SocketOutputStream.write()
java.net.SocketOutputStream.read()
因为Socket是底层的二进制数据传输,hook了Socket,对上层应用绝大多数都逃不过,除非自定义协议。
1 | /*Java.use("java.net.SocketOutputStream").socketWrite.overload('[B', 'int', 'int').implementation = function(b,off,len){ |