r0抓包通杀

主要是依据r0ysue大佬的脚本r0tracer.jsr0capture.py

这里引一下大佬的项目地址:r0ysue/r0capture: 安卓应用层抓包通杀脚本

本节分http和https来分别实现。

首先,http和https都属于应用层协议,应用层与传出层(TCP/UDP)一般是通过socket来传输数据的。

所以hook思路是hook socket相关函数来获取数据。

Demo

首先编写一个http发包的demo:

MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.example.httpsocket;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
newHttp();
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}


private static void newHttp() {


new Thread(new Runnable() {
@Override
public void run() {

try {
String url = "http://www.baidu.com/";
URL urlConn = new URL(url);
//得到connection对象。
HttpURLConnection connection = (HttpURLConnection) urlConn.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//连接
connection.connect();
//得到响应码
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
//得到响应流
InputStream inputStream = connection.getInputStream();
//将响应流转换成字符串
String result = is2String(inputStream);//将流转换为字符串。
Log.d("r0ysue", "result=============" + result);
}

} catch (Exception e) {
e.printStackTrace();
}
}
}).start();

}

private static String is2String(InputStream inputStream) throws IOException, IOException {
final int bufferSize = 1024;
final char[] buffer = new char[bufferSize];
final StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader(inputStream, "UTF-8");

for (; ; ) {
int rsz = in.read(buffer, 0, buffer.length);
if (rsz < 0)
break;
out.append(buffer, 0, rsz);
}
return out.toString();

}
}

AndroidManifest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.httpsocket"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" /> //请求网络需要加入权限。
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HttpSocket"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

Log输出如下:

1
2
2025-07-09 17:33:50.052 21927-22102 r0ysue                  com.example.httpsocket               D  result=============<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>'); </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

成功回显百度页面。

Http抓包

接下来通过frida+r0tracer来hook抓包:

首先hook 包含socket的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function main() {
console.Purple("r0tracer begin ... !")
//0. 增加精简模式,就是以彩虹色只显示进出函数。默认是关闭的,注释此行打开精简模式。
isLite = true;
/*
//以下三种模式,取消注释某一行以开启
*/
//A. 简易trace单个lei
// traceClass("ViewController")
//B. 黑白名单trace多个函数,第一个参数是白名单(包含关键字),第二个参数是黑名单(不包含的关键字)
hook("socket", "$");
//C. 报某个类找不到时,将某个类名填写到第三个参数,比如找不到com.roysue.check类。(前两个参数依旧是黑白名单)
// hook("com.roysue.check"," ","com.roysue.check");
//D. 新增hookALL() 打开这个模式的情况下,会hook属于app自己的所有业务类,小型app可用 ,中大型app几乎会崩溃,经不起
// hookALL()
}

hook了58个类,输出执行流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
** entered com.example.httpsocket.MainActivity.newHttp

*** exiting com.example.httpsocket.MainActivity.newHttp
========================================================================================================================================================================================================
*** entered com.example.httpsocket.MainActivity.access$000

*** exiting com.example.httpsocket.MainActivity.access$000
========================================================================================================================================================================================================
*** entered javax.net.SocketFactory.getDefault

*** exiting javax.net.SocketFactory.getDefault
========================================================================================================================================================================================================
*** entered java.net.Socket.isClosed

*** exiting java.net.Socket.isClosed
========================================================================================================================================================================================================
*** entered java.net.Socket.isInputShutdown

*** exiting java.net.Socket.isInputShutdown
========================================================================================================================================================================================================
*** entered java.net.Socket.isOutputShutdown

*** exiting java.net.Socket.isOutputShutdown
========================================================================================================================================================================================================
*** entered java.net.Socket.isClosed

*** exiting java.net.Socket.isClosed
========================================================================================================================================================================================================
*** entered java.net.Socket.getImpl

*** exiting java.net.Socket.getImpl
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.isClosedOrPending

*** exiting java.net.AbstractPlainSocketImpl.isClosedOrPending
========================================================================================================================================================================================================
*** entered java.net.PlainSocketImpl.socketSetOption0

*** exiting java.net.PlainSocketImpl.socketSetOption0
========================================================================================================================================================================================================
*** entered java.net.PlainSocketImpl.socketSetOption

*** exiting java.net.PlainSocketImpl.socketSetOption
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.setOption

*** exiting java.net.AbstractPlainSocketImpl.setOption
========================================================================================================================================================================================================
*** entered java.net.Socket.setSoTimeout

*** exiting java.net.Socket.setSoTimeout
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.acquireFD

*** exiting java.net.AbstractPlainSocketImpl.acquireFD
========================================================================================================================================================================================================
*** entered java.net.SocketOutputStream.socketWrite0

*** exiting java.net.SocketOutputStream.socketWrite0
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.releaseFD

*** exiting java.net.AbstractPlainSocketImpl.releaseFD
========================================================================================================================================================================================================
*** entered java.net.SocketOutputStream.socketWrite

*** exiting java.net.SocketOutputStream.socketWrite
========================================================================================================================================================================================================
*** entered java.net.SocketOutputStream.write

*** exiting java.net.SocketOutputStream.write
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.getTimeout

*** exiting java.net.AbstractPlainSocketImpl.getTimeout
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.isConnectionReset

*** exiting java.net.AbstractPlainSocketImpl.isConnectionReset
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.acquireFD

*** exiting java.net.AbstractPlainSocketImpl.acquireFD
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.socketRead0

*** exiting java.net.SocketInputStream.socketRead0
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.socketRead

*** exiting java.net.SocketInputStream.socketRead
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.releaseFD

*** exiting java.net.AbstractPlainSocketImpl.releaseFD
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.read

*** exiting java.net.SocketInputStream.read
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.read

*** exiting java.net.SocketInputStream.read
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.getTimeout

*** exiting java.net.AbstractPlainSocketImpl.getTimeout
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.isConnectionReset

*** exiting java.net.AbstractPlainSocketImpl.isConnectionReset
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.acquireFD

*** exiting java.net.AbstractPlainSocketImpl.acquireFD
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.socketRead0

*** exiting java.net.SocketInputStream.socketRead0
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.socketRead

*** exiting java.net.SocketInputStream.socketRead
========================================================================================================================================================================================================
*** entered java.net.AbstractPlainSocketImpl.releaseFD

*** exiting java.net.AbstractPlainSocketImpl.releaseFD
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.read

*** exiting java.net.SocketInputStream.read
========================================================================================================================================================================================================
*** entered java.net.SocketInputStream.read

*** exiting java.net.SocketInputStream.read
========================================================================================================================================================================================================
*** entered com.example.httpsocket.MainActivity.is2String

*** exiting com.example.httpsocket.MainActivity.is2String

然后定位到一个比较像读写函数的类java.net.SocketOutputStream.socketRead0java.net.SocketOutputStream.socketWrite0

查找源码观察参数个数后进行hook。

hook脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

function jhexdump(array,off,len) {
var ptr = Memory.alloc(len-off);
for(var i = off; i < len; ++i)
Memory.writeS8(ptr.add(i), array[i]);
console.log(hexdump(ptr, { offset: off, length: len, header: false, ansi: false }));
}

function hookSocketWrite0(){
Java.use("java.net.SocketOutputStream").socketWrite0.implementation = function(fd,b,off,len){
var result= this.socketWrite0(fd,b,off,len);
console.log(fd,b,off,len,result,this.socket.value);
console.log(jhexdump(b,off,len));
return result;
}
}


function hookSocketRead0(){
Java.use("java.net.SocketInputStream").socketRead0.implementation =function(fd,b,off,len,t){
var result= this.socketRead0(fd,b,off,len,t);
console.log(fd,b,off,8292,result,this.socket.value);
console.log(jhexdump(b,off,result));
return result;
}
}

// entered com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read
// entered com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write
function main(){
Java.perform(function(){
hookSocketWrite0()
hookSocketRead0()
})
}

setImmediate(main)

输出txt中找到如下响应包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79fea91280  48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d  HTTP/1.1 200 OK.
79fea91290 0a 43 6f 6e 74 65 6e 74 2d 45 6e 63 6f 64 69 6e .Content-Encodin
79fea912a0 67 3a 20 67 7a 69 70 0d 0a 43 6f 6e 74 65 6e 74 g: gzip..Content
79fea912b0 2d 4c 65 6e 67 74 68 3a 20 31 31 30 38 0d 0a 43 -Length: 1108..C
79fea912c0 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 65 78 ontent-Type: tex
79fea912d0 74 2f 68 74 6d 6c 0d 0a 53 65 72 76 65 72 3a 20 t/html..Server:
79fea912e0 62 66 65 0d 0a 44 61 74 65 3a 20 54 75 65 2c 20 bfe..Date: Tue,
79fea912f0 30 38 20 4a 75 6c 20 32 30 32 35 20 30 39 3a 32 08 Jul 2025 09:2
79fea91300 34 3a 33 31 20 47 4d 54 0d 0a 0d 0a 1f 8b 08 00 4:31 GMT........
79fea91310 00 00 00 00 00 ff 94 56 5b 6f dc c4 17 7f ff 4b .......V[o.....K
79fea91320 ff ef 30 35 da a4 55 b5 eb bd a8 2a 74 6d 57 21 ..05..U....*tmW!
79fea91330 b4 52 c4 43 2b 9a 48 f0 b4 1a cf 8c ed 69 ec 99 .R.C+.H......i..
79fea91340 61 66 bc ce f2 44 24 8a 40 50 02 2a 17 95 22 81 af...D$.@P.*..".
79fea91350 10 34 3c 20 35 88 48 54 29 69 bf cc 3a 97 27 be .4< 5.HT)i..:.'.
79fea91360 02 1a db 9b bd a6 15 4f 9e 39 73 ce ef fc ce 6d .......O.9s....m
79fea91370 c6 ce 85 b7 6e ad ae bf 77 fb 06 88 74 12 7b ff ....n...w...t.{.
79fea91380 ff 9f 73 a1 5e bf b3 be b2 be 71 07 dc 7a bb 5e ..s.^.....q..z.^
79fea91390 f7 9c 42 0e 9c 88 40 ec 39 09 d1 10 44 5a 8b 3a ..B...@.9...DZ.:
79fea913a0 79 3f a5 7d 17 71 a6 09 d3 75 3d 10 04 54 1b 57 y?.}.q...u=..T.W
79fea913b0 93 2d 6d 1b b3 2e 8a a0 54 44 bb a9 0e ea af cf .-m.....TD......
79fea913c0 5b bf 5b df 58 a9 af f2 44 40 4d fd 78 0c b0 76 [.[.X...D@M.x..v
79fea913d0 c3 bd 81 43 52 19 8c a4 30 ce e0 40 01 06 13 e2 ...CR...0..@....
79fea913e0 4a 12 10 29 89 f4 9c 98 b2 4d 20 49 ec 2a 3d 88 J..).....M I.*=.
79fea913f0 89 8a 08 d1 c0 b0 29 59 20 a5 40 24 49 e0 1a af ......)Y .@$I...
79fea91400 d7 6c 5b b5 1a 3e 56 1a 6a 8a 1a 88 27 b6 b4 b3 .l[..>V.j...'...
79fea91410 2c b3 11 44 11 b1 7d cc e5 07 b6 0f 29 4e 1b 09 ,..D..}.....)N..
79fea91420 65 0d a4 94 e7 68 aa 63 e2 1d 3f 7c 9e 1f 3c 1e e....h.c..?|..<.
79fea91430 3e fd 70 f8 f4 b3 7f fe fe 7c 78 f8 53 be f7 c7 >.p......|x.S...
79fea91440 f1 8f bf 9e 6e 3f 70 ec 52 c5 b1 8b 0c 01 c7 e7 ....n?p.R.......
79fea91450 78 00 0c 2b f7 b5 66 b3 d9 44 c8 03 0e a6 7d 40 x..+..f..D....}@
79fea91460 b1 9b 49 28 04 91 63 41 65 62 76 28 86 4a 15 82 ..I(..cAebv(.J..
79fea91470 de b4 5a 79 a0 7a 01 97 c9 02 51 6f 0e 34 0e 3d ..Zy.z....Qo.4.=
79fea91480 e0 d0 24 04 11 c5 24 e0 28 55 ae 96 29 01 4a 22 ..$...$.(U..).J"
79fea91490 d7 36 f1 36 ca 18 4d fc 34 09 6d 1f f7 62 1e f2 .6.6..M.4.m..b..
79fea914a0 56 43 b0 10 64 14 eb c8 6d 5f 6d 82 88 d0 30 d2 VC..d...m_m...0.
79fea914b0 6e ab fd 86 07 1c 1b d3 be 07 1c e3 d0 b8 28 be n.............(.
79fea914c0 45 21 02 00 91 a6 9c cd 21 ab 8a 65 60 48 53 26 E!......!..e`HS&
79fea914d0 d2 aa 2c 11 c5 98 b0 d2 b8 c8 78 0f f1 84 80 3e ..,.......x....>
79fea914e0 8c 53 e2 b6 ce d7 a5 23 9d b2 97 ce d5 0b 2a b5 .S.....#......*.
79fea914f0 97 a8 48 d5 ef f9 e2 d5 2e 8d 1e c5 5b af 56 d4 ..H.........[.V.
79fea91500 ac d2 29 c2 f7 1c 25 20 ab c2 b7 fc 10 a8 1e 15 ..)...% ........
79fea91510 ba 97 49 cb ab 00 28 76 37 b3 d2 34 c3 67 d5 a4 ..I...(v7..4.g..
79fea91520 42 97 30 20 81 5b 31 61 a1 29 c4 95 2b 00 a6 9a B.0 .[1a.)..+...
79fea91530 23 9e 88 98 68 e2 f2 20 28 04 45 5d 3d c7 36 ae #...h.. (.E]=.6.
79fea91540 16 38 f4 35 9b 74 58 30 56 a9 9f d0 c2 b9 4a 2b .8.5.tX0V.....J+
79fea91550 be 93 7d 3d 6b 6f 8d d0 81 63 57 bd 57 75 41 f5 ..}=ko...cW.WuA.
79fea91560 a9 da 2d 35 89 81 53 53 c6 48 a6 c6 ad 50 e5 e8 ..-5..SS.H...P..
79fea91570 6e 4f 4b 73 50 f9 49 18 ec 7b 47 df ee 9d 7e f7 nOKsP.I..{G...~.
79fea91580 cc b1 e1 1c 84 69 a6 08 f2 56 bb 33 03 51 0a 27 .....i...V.3.Q.'
79fea91590 41 4a c9 22 90 04 8a 85 34 12 28 26 01 f2 1f f6 AJ."....4.(&....
79fea915a0 f2 47 cf 17 01 f4 17 9a f7 29 26 7c 12 e0 64 f7 .G.......)&|..d.
79fea915b0 e3 d3 9f bf 5a 04 a0 29 f1 e1 42 90 e2 64 0a 64 ....Z..)..B..d.d
79fea915c0 7f 3f ff 72 b7 04 61 5c 21 49 85 5e 98 96 f1 8c .?.r..a\!I.^....
79fea915d0 95 37 56 cc 43 ca 1a 21 0d ae 17 ab 25 98 88 ae .7V.C..!....%...
79fea915e0 16 b1 9b 94 cb b4 b0 ad 75 56 6a ed 9b b5 f6 cd ........uVj.....
79fea915f0 29 84 5a 3b a8 75 82 f1 18 d6 3a b8 75 c6 b1 40 ).Z;.u....:.u..@
79fea91600 ab 18 c6 be 77 fc f0 59 7e f8 4d c9 cf 9e 20 58 ....w..Y~.M... X
79fea91610 2d 30 47 69 42 98 6e 64 92 6a 72 71 79 44 dc fa -0GiB.nd.jrqyD..
79fea91620 0f cc 2b d6 a9 bb 7c 19 10 86 38 26 1b ef ac 99 ..+...|...8&....
79fea91630 f7 81 33 c2 f4 c5 8c 32 cc b3 46 cc 11 34 57 4e ..3....2..F..4WN
79fea91640 c3 e0 5f 06 73 62 45 a0 44 11 70 5d 17 58 16 b8 .._.sbE.D.p].X..
79fea91650 0e ac eb 16 b8 06 ac 25 eb d2 65 60 8d 63 75 5b .......%..e`.cu[
79fea91660 46 b0 6c 95 f1 5a a3 80 ad d1 1c c4 be 35 11 f3 F.l..Z.......5..
79fea91670 f2 a5 ae 63 cf 16 65 36 aa 84 4b 62 9f e5 cf 97 ...c..e6..Kb....
79fea91680 94 22 3e ca a0 2f 29 28 9e 28 d7 c2 54 89 18 0e .">../)(.(..T...
79fea91690 ae 01 3f e6 68 b3 6b 79 47 8f f6 f3 5f be 1f 1e ..?.h.kyG..._...
79fea916a0 ec e6 0f b6 ab 04 4f 4d da f4 c0 05 7a 95 b3 99 ......OM....z...
79fea916b0 6d e6 01 47 14 97 7f 34 d7 33 11 4f c8 98 a4 97 m..G...4.3.O....
79fea916c0 df fb 73 78 f0 45 39 f9 8b 5a 96 ca 09 e5 15 9f ..sx.E9..Z......
79fea916d0 a7 1a bc 69 f6 15 31 31 f2 84 84 b7 84 b8 18 74 ...i..11.......t
79fea916e0 db cd d6 d5 25 e6 2b d1 2d f4 ca e5 4b fb 16 a7 ....%.+.-...K...
79fea916f0 7a 60 7b c3 c3 17 c7 5f ff 56 12 c9 3f bd 9f bf z`{...._.V..?...
79fea91700 b8 77 f2 a4 b8 0b 4a 84 59 5e 77 29 64 03 3a 81 .w....J.Y^w)d.:.
79fea91710 52 25 16 89 7a 40 08 f6 21 da f4 8e 3e da 39 d9 R%..z@..!...>.9.
79fea91720 dd ce 77 ee 9f 3e fe 64 8c 34 3c f8 7d 6d f5 f6 ..w..>.d.4<.}m..
79fea91730 c9 93 ed 66 a7 d9 ba da c9 77 fe 1a 79 30 af e4 ...f.....w..y0..
79fea91740 79 cf 62 a8 4c 67 8e 42 5e 58 10 db bc f5 e6 5b y.b.Lg.B^X.....[
79fea91750 fd 3b fd 1b 00 00 ff ff 5c 85 43 01 4d 09 00 00 .;......\.C.M...

找到gzip的文件头1f 8b进行gzip解压缩即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import gzip
import binascii

# 原始数据(Hex 字符串)
hex_data = """
1F 8B 08 00 00 00 00 00 00 FF 94 56 5B 6F DC C4
17 7F FF 4B FF EF 30 35 DA A4 55 B5 EB BD A8 2A
74 6D 57 21 B4 52 C4 43 2B 9A 48 F0 B4 1A CF 8C
ED 69 EC 99 61 66 BC CE F2 44 24 8A 40 50 02 2A
17 95 22 81 10 34 3C 20 35 88 48 54 29 69 BF CC
3A 97 27 BE 02 1A DB 9B BD A6 15 4F 9E 39 73 CE
EF FC CE 6D C6 CE 85 B7 6E AD AE BF 77 FB 06 88
74 12 7B FF FF 9F 73 A1 5E BF B3 BE B2 BE 71 07
DC 7A BB 5E F7 9C 42 0E 9C 88 40 EC 39 09 D1 10
44 5A 8B 3A 79 3F A5 7D 17 71 A6 09 D3 75 3D 10
04 54 1B 57 93 2D 6D 1B B3 2E 8A A0 54 44 BB A9
0E EA AF CF 5B BF 5B DF 58 A9 AF F2 44 40 4D FD
78 0C B0 76 C3 BD 81 43 52 19 8C A4 30 CE E0 40
01 06 13 E2 4A 12 10 29 89 F4 9C 98 B2 4D 20 49
EC 2A 3D 88 89 8A 08 D1 C0 B0 29 59 20 A5 40 24
49 E0 1A AF D7 6C 5B B5 1A 3E 56 1A 6A 8A 1A 88
27 B6 B4 B3 2C B3 11 44 11 B1 7D CC E5 07 B6 0F
29 4E 1B 09 65 0D A4 94 E7 68 AA 63 E2 1D 3F 7C
9E 1F 3C 1E 3E FD 70 F8 F4 B3 7F FE FE 7C 78 F8
53 BE F7 C7 F1 8F BF 9E 6E 3F 70 EC 52 C5 B1 8B
0C 01 C7 E7 78 00 0C 2B F7 B5 66 B3 D9 44 C8 03
0E A6 7D 40 B1 9B 49 28 04 91 63 41 65 62 76 28
86 4A 15 82 DE B4 5A 79 A0 7A 01 97 C9 02 51 6F
0E 34 0E 3D E0 D0 24 04 11 C5 24 E0 28 55 AE 96
29 01 4A 22 D7 36 F1 36 CA 18 4D FC 34 09 6D 1F
F7 62 1E F2 56 43 B0 10 64 14 EB C8 6D 5F 6D 82
88 D0 30 D2 6E AB FD 86 07 1C 1B D3 BE 07 1C E3
D0 B8 28 BE 45 21 02 00 91 A6 9C CD 21 AB 8A 65
60 48 53 26 D2 AA 2C 11 C5 98 B0 D2 B8 C8 78 0F
F1 84 80 3E 8C 53 E2 B6 CE D7 A5 23 9D B2 97 CE
D5 0B 2A B5 97 A8 48 D5 EF F9 E2 D5 2E 8D 1E C5
5B AF 56 D4 AC D2 29 C2 F7 1C 25 20 AB C2 B7 FC
10 A8 1E 15 BA 97 49 CB AB 00 28 76 37 B3 D2 34
C3 67 D5 A4 42 97 30 20 81 5B 31 61 A1 29 C4 95
2B 00 A6 9A 23 9E 88 98 68 E2 F2 20 28 04 45 5D
3D C7 36 AE 16 38 F4 35 9B 74 58 30 56 A9 9F D0
C2 B9 4A 2B BE 93 7D 3D 6B 6F 8D D0 81 63 57 BD
57 75 41 F5 A9 DA 2D 35 89 81 53 53 C6 48 A6 C6
AD 50 E5 E8 6E 4F 4B 73 50 F9 49 18 EC 7B 47 DF
EE 9D 7E F7 CC B1 E1 1C 84 69 A6 08 F2 56 BB 33
03 51 0A 27 41 4A C9 22 90 04 8A 85 34 12 28 26
01 F2 1F F6 F2 47 CF 17 01 F4 17 9A F7 29 26 7C
12 E0 64 F7 E3 D3 9F BF 5A 04 A0 29 F1 E1 42 90
E2 64 0A 64 7F 3F FF 72 B7 04 61 5C 21 49 85 5E
98 96 F1 8C 95 37 56 CC 43 CA 1A 21 0D AE 17 AB
25 98 88 AE 16 B1 9B 94 CB B4 B0 AD 75 56 6A ED
9B B5 F6 CD 29 84 5A 3B A8 75 82 F1 18 D6 3A B8
75 C6 B1 40 AB 18 C6 BE 77 FC F0 59 7E F8 4D C9
CF 9E 20 58 2D 30 47 69 42 98 6E 64 92 6A 72 71
79 44 DC FA 0F CC 2B D6 A9 BB 7C 19 10 86 38 26
1B EF AC 99 F7 81 33 C2 F4 C5 8C 32 CC B3 46 CC
11 34 57 4E C3 E0 5F 06 73 62 45 A0 44 11 70 5D
17 58 16 B8 0E AC EB 16 B8 06 AC 25 EB D2 65 60
8D 63 75 5B 46 B0 6C 95 F1 5A A3 80 AD D1 1C C4
BE 35 11 F3 F2 A5 AE 63 CF 16 65 36 AA 84 4B 62
9F E5 CF 97 94 22 3E CA A0 2F 29 28 9E 28 D7 C2
54 89 18 0E AE 01 3F E6 68 B3 6B 79 47 8F F6 F3
5F BE 1F 1E EC E6 0F B6 AB 04 4F 4D DA F4 C0 05
7A 95 B3 99 6D E6 01 47 14 97 7F 34 D7 33 11 4F
C8 98 A4 97 DF FB 73 78 F0 45 39 F9 8B 5A 96 CA
09 E5 15 9F A7 1A BC 69 F6 15 31 31 F2 84 84 B7
84 B8 18 74 DB CD D6 D5 25 E6 2B D1 2D F4 CA E5
4B FB 16 A7 7A 60 7B C3 C3 17 C7 5F FF 56 12 C9
3F BD 9F BF B8 77 F2 A4 B8 0B 4A 84 59 5E 77 29
64 03 3A 81 52 25 16 89 7A 40 08 F6 21 DA F4 8E
3E DA 39 D9 DD CE 77 EE 9F 3E FE 64 8C 34 3C F8
7D 6D F5 F6 C9 93 ED 66 A7 D9 BA DA C9 77 FE 1A
79 30 AF E4 79 CF 62 A8 4C 67 8E 42 5E 58 10 DB
BC F5 E6 5B FD 3B FD 1B 00 00 FF FF 5C 85 43 01
4D 09 00 00

"""

# 移除空格和换行,转换为 bytes
hex_str = hex_data.replace(" ", "").replace("\n", "")
gzip_data = binascii.unhexlify(hex_str)

# 解压 GZIP 数据
try:
decompressed = gzip.decompress(gzip_data)
print("解压后的内容:", decompressed.decode("utf-8")) # 假设是 UTF-8 编码
except Exception as e:
print("解压失败:", e)

输出如下:

1
2
解压后的内容: <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

可以看到和Android Studio 的Log输出的响应体一致。

HTTPS抓包

首先修改MainActivityurl里的httphttps

https加入了ssl证书验证,可以使用frida_bypass_ssl的方法来抓取包,结合tcpdump等获取响应包信息。具体方法参考大佬博客:frida绕过ssl pinning抓取https_frida ssl-CSDN博客

这里我直接使用r0capture一把梭了。

命令如下:

1
python r0capture.py -U com.example.httpsocket -v -p demo.pcap

得到抓取到的pcap流量包,wireshark打开。

pVQlkdI.png

找到对应的TCP包,导出原始数据,删除1f 8b前边的请求头信息,保存后缀为.gz文件,打开有个文件,就是响应体信息。

pVQlAot.png