Skip to content

Commit 488b719

Browse files
committed
add:返回包注入
fix:mitm换了更高效的实现方式,现在https抓包更快了 fix:mbp;littleproxy,netty版本升级
1 parent 4872c75 commit 488b719

File tree

207 files changed

+2018
-17031
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

207 files changed

+2018
-17031
lines changed

README.md

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,50 @@ Content内容如果为JSON将会自动格式化显示<br>
1818
![image](https://www.darkal.cn/imgd.php?src=/2016/09/230686663947787928.jpg&width=350)<br>
1919
分享功能将抓包生成的所有数据包打包为har文件并压缩为zip,支持分享到微信、QQ等<br><br>
2020

21-
2. 环境切换<br>
21+
2. 返回包注入<br>
22+
支持修改流量返回包(该版本暂时只支持http的修改)<br>
23+
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG180.jpeg&width=350)
24+
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG181.jpeg&width=350)<br><br>
25+
26+
3. 环境切换<br>
2227
支持切换模拟为微信、手Q,默认为普通浏览器。<br>
2328
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG81.jpeg&width=350)<br><br>
2429

25-
3. 多样性输入:导航、地址栏、扫一扫、schema呼起<br>
30+
4. 多样性输入:导航、地址栏、扫一扫、schema呼起<br>
2631
支持地址栏直接输入地址,扫扫描二维码,以及schema呼起app并打开目标页面。<br>
2732
schema的协议格式为:jdhttpmonitor://webview?param={'url'='http://www.darkal.cn'}<br><br>
2833

29-
4. Host配置<br>
34+
5. Host配置<br>
3035
可以配置各域名的host<br>
3136
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG79.jpeg&width=350&t=1)<br><br>
3237

3338

34-
5. 查看console.log日志<br>
39+
6. 查看console.log日志<br>
3540
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG82.jpeg&width=350)<br><br>
3641

3742

38-
6. 网络工具<br>
43+
7. 网络工具<br>
3944
目前AndroidHttpCapture集成了常见的网络工具,如dns,ping,以及设备信息<br>
4045
![image](https://www.darkal.cn/imgd.php?src=/2016/09/621495078826.jpg&width=350)<br><br>
4146

42-
7. 设置系统代理,监听其他app请求包<br>
47+
8. 设置系统代理,监听其他app请求包<br>
4348
当将用户手机的代理服务器设置为127.0.0.1:8888时,可以对其他app(例如微信)的HTTP数据进行抓包<br>
4449
(此时AndroidHttpCapture就是一个手机上的fiddler)<br>
4550
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG80.jpeg&width=350)<br><br>
46-
51+
4752
### Q & A<br>
4853
1. 分享的http包如何查看和分析?<br>
4954
   分享的文件解压后为.har文件,可以通过fiddler方式或者在线工具进行分析。<br>
5055
Fiddler方式需要先将包导到电脑上,然后使用fiddler导入该包:Import Sessions->Select Import Format ->HTTPArchive ->选择包,即可<br>
5156
在线工具外网:http://h5.darkal.cn/har/ 只需要将包拖入此工具即可分析<br><br>
52-
57+
58+
### 已知BUG<br>
59+
1. 信任所有的服务器证书不做校验<br>
60+
2. 开启返回包注入功能后,https返回的部分页面存在 err_CONTENT_LENGTH_MISMATCH 错误<br>
61+
62+
#### 如果觉得工具好用的话请多多star以及Pull requests<br>支持我喝杯咖啡请扫描下面的二维码,谢谢(ง •̀_•́)ง<br>
63+
![image](http://h5.darkal.cn/har/guide/img/code.jpg)<br><br>
64+
5365
### 致谢<br>
5466
AndroidHttpCapture基于Netty、browsermob-proxy来实现核心抓包的功能<br>
5567
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.<br>
@@ -58,8 +70,7 @@ https://github.com/netty/netty<br>
5870

5971
A free utility to help web developers watch and manipulate network traffic from their AJAX applications.<br>
6072
https://github.com/lightbody/browsermob-proxy<br>
61-
修改了多处browsermob-proxy的源码适配Android系统<br>
62-
#### 目前遗留了一个Bug:信任所有的服务器证书不做校验<br><br>
73+
修改了多处browsermob-proxy的源码适配Android系统<br><br>
6374

6475
MIT License<br>
6576
Copyright (c) 2016 AndroidHttpCapture

app/build.gradle

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ android {
2525
applicationId "cn.darkal.networkdiagnosis"
2626
minSdkVersion 14
2727
targetSdkVersion 22
28-
versionCode 25
29-
versionName "2.4.26"
28+
versionCode 30
29+
versionName "3.1.30"
3030
// Enabling multidex support.
3131
multiDexEnabled true
3232
resConfigs "zh"
@@ -76,10 +76,11 @@ dependencies {
7676
compile 'com.android.support:support-annotations:24.2.1'
7777
compile 'com.android.support:multidex:1.0.1'
7878
// littleproxy及其依赖
79-
compile('net.lightbody.bmp:littleproxy:1.1.0-beta-bmp-13') {
79+
compile('net.lightbody.bmp:littleproxy:1.1.0-beta-bmp-16') {
8080
exclude group: 'io.netty'
8181
}
82-
compile 'net.sf.qualitycheck:quality-check:1.3'
82+
83+
compile group: 'org.apache.directory.studio', name: 'org.apache.commons.io', version: '2.4'
8384
compile 'javax.annotation:jsr250-api:1.0'
8485
compile 'com.fasterxml.jackson.core:jackson-core:2.7.6'
8586
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.6'
@@ -92,10 +93,12 @@ dependencies {
9293
compile 'com.google.jimfs:jimfs:1.1'
9394
compile 'com.jcraft:jzlib:1.1.3'
9495
// 日志处理
95-
compile 'org.slf4j:slf4j-api:1.7.21'
96+
// compile 'org.slf4j:slf4j-api:1.7.21'
97+
compile 'org.slf4j:slf4j-log4j12:1.7.21'
98+
9699
// compile 'org.slf4j:jcl-over-slf4j:1.7.21'
97100
// 启用Netty的日志输出(调试用)
98-
// compile 'com.noveogroup.android:android-logger:1.3.5'
101+
// compile 'com.noveogroup.android:android-logger:1.3.5'
99102
// 文件上传插件
100103
compile 'net.gotev:uploadservice:3.0.3'
101104
// Bugly上报
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
<uses-permission android:name="android.permission.READ_LOGS" />
1818

1919
<application
20-
android:name="cn.darkal.networkdiagnosis.SysApplication"
20+
android:name=".SysApplication"
2121
android:allowBackup="true"
2222
android:icon="@mipmap/ic_launcher"
2323
android:label="@string/app_name"
24-
android:supportsRtl="true"
2524
android:largeHeap="true"
25+
android:supportsRtl="true"
2626
android:theme="@style/AppTheme">
2727

2828
<!-- 配置APP渠道号 -->
@@ -31,15 +31,17 @@
3131
android:value="Github" />
3232

3333
<activity
34-
android:name="cn.darkal.networkdiagnosis.Activity.MainActivity"
34+
android:name=".Activity.MainActivity"
3535
android:configChanges="orientation|keyboardHidden"
3636
android:label="@string/app_name"
3737
android:launchMode="singleTask"
38-
android:theme="@style/AppTheme.NoActionBar"
3938
android:screenOrientation="portrait"
39+
android:theme="@style/AppTheme.NoActionBar"
4040
android:windowSoftInputMode="stateHidden">
41-
<meta-data android:name="android.app.searchable"
41+
<meta-data
42+
android:name="android.app.searchable"
4243
android:resource="@xml/searchable" />
44+
4345
<intent-filter>
4446
<action android:name="android.intent.action.VIEW" />
4547

@@ -64,20 +66,20 @@
6466
android:screenOrientation="portrait" />
6567

6668
<service
67-
android:name="cn.darkal.networkdiagnosis.MyVpnService"
69+
android:name=".MyVpnService"
6870
android:permission="android.permission.BIND_VPN_SERVICE">
6971
<intent-filter>
7072
<action android:name="android.net.VpnService" />
7173
</intent-filter>
7274
</service>
7375

7476
<activity
75-
android:name="cn.darkal.networkdiagnosis.Activity.SettingsActivity"
77+
android:name=".Activity.SettingsActivity"
7678
android:label="@string/title_activity_settings" />
7779

7880
<!-- 引用xml策略声明 -->
7981
<receiver
80-
android:name="cn.darkal.networkdiagnosis.Receiver.MyAdminReceiver"
82+
android:name=".Receiver.MyAdminReceiver"
8183
android:description="@string/app_name"
8284
android:label="@string/app_name"
8385
android:permission="android.permission.BIND_DEVICE_ADMIN">
@@ -91,16 +93,15 @@
9193
</receiver>
9294

9395
<activity
94-
android:name="cn.darkal.networkdiagnosis.Activity.HarDetailActivity"
95-
android:theme="@style/AppTheme.NoActionBar"/>
96-
96+
android:name=".Activity.HarDetailActivity"
97+
android:theme="@style/AppTheme.NoActionBar" />
9798
<activity
98-
android:name="cn.darkal.networkdiagnosis.Activity.JsonPreviewActivity"
99-
android:theme="@style/AppTheme.NoActionBar"/>
100-
99+
android:name=".Activity.JsonPreviewActivity"
100+
android:theme="@style/AppTheme.NoActionBar" />
101101
<activity
102102
android:name="com.tencent.bugly.beta.ui.BetaActivity"
103103
android:theme="@android:style/Theme.Translucent" />
104+
<activity android:name=".Activity.ChangeFilterActivity"></activity>
104105
</application>
105106

106107
</manifest>
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package cn.darkal.networkdiagnosis.Activity;
2+
3+
import android.content.DialogInterface;
4+
import android.support.design.widget.FloatingActionButton;
5+
import android.support.v7.app.ActionBar;
6+
import android.support.v7.app.AlertDialog;
7+
import android.support.v7.app.AppCompatActivity;
8+
import android.os.Bundle;
9+
import android.view.LayoutInflater;
10+
import android.view.MenuItem;
11+
import android.view.View;
12+
import android.widget.EditText;
13+
import android.widget.ListView;
14+
import android.widget.RelativeLayout;
15+
16+
import java.util.List;
17+
18+
import butterknife.BindView;
19+
import butterknife.ButterKnife;
20+
import cn.darkal.networkdiagnosis.Adapter.ContentFilterAdapter;
21+
import cn.darkal.networkdiagnosis.Bean.ResponseFilterRule;
22+
import cn.darkal.networkdiagnosis.R;
23+
import cn.darkal.networkdiagnosis.SysApplication;
24+
import cn.darkal.networkdiagnosis.Utils.DeviceUtils;
25+
import cn.darkal.networkdiagnosis.Utils.SharedPreferenceUtils;
26+
27+
public class ChangeFilterActivity extends AppCompatActivity {
28+
@BindView(R.id.activity_change_filter)
29+
public RelativeLayout relativeLayout;
30+
31+
@BindView(R.id.lv_filter)
32+
public ListView listView;
33+
34+
@BindView(R.id.fab_add)
35+
public FloatingActionButton floatingActionButton;
36+
37+
ContentFilterAdapter contentFilterAdapter;
38+
39+
@Override
40+
protected void onCreate(Bundle savedInstanceState) {
41+
super.onCreate(savedInstanceState);
42+
setContentView(R.layout.activity_change_filter);
43+
ButterKnife.bind(this);
44+
setupActionBar();
45+
46+
List<ResponseFilterRule> ruleList = ((SysApplication)getApplication()).ruleList;
47+
48+
contentFilterAdapter = new ContentFilterAdapter(this,ruleList);
49+
listView.setAdapter(contentFilterAdapter);
50+
51+
floatingActionButton.setOnClickListener(new View.OnClickListener() {
52+
@Override
53+
public void onClick(View v) {
54+
showDialog(null);
55+
}
56+
});
57+
}
58+
59+
/**
60+
* Set up the {@link android.app.ActionBar}, if the API is available.
61+
*/
62+
private void setupActionBar() {
63+
setTitle("返回包注入");
64+
ActionBar actionBar = getSupportActionBar();
65+
if (actionBar != null) {
66+
// Show the Up button in the action bar.
67+
actionBar.setDisplayHomeAsUpEnabled(true);
68+
}
69+
}
70+
71+
public void showDialog(final ResponseFilterRule responseFilterRule){
72+
AlertDialog.Builder builder = new AlertDialog.Builder(ChangeFilterActivity.this);
73+
74+
View textEntryView = LayoutInflater.from(ChangeFilterActivity.this).inflate(R.layout.alert_resp_filter, null);
75+
final EditText urlEditText = (EditText) textEntryView.findViewById(R.id.et_origin_url);
76+
final EditText regexEditText = (EditText) textEntryView.findViewById(R.id.et_regex);
77+
final EditText contentEditText = (EditText) textEntryView.findViewById(R.id.et_replace_result);
78+
if(responseFilterRule!=null){
79+
urlEditText.setText(responseFilterRule.getUrl());
80+
regexEditText.setText(responseFilterRule.getReplaceRegex());
81+
contentEditText.setText(responseFilterRule.getReplaceContent());
82+
builder.setTitle("修改注入项");
83+
}else{
84+
builder.setTitle("新增注入项");
85+
}
86+
87+
builder.setCancelable(true);
88+
builder.setView(textEntryView);
89+
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
90+
@Override
91+
public void onClick(DialogInterface dialog, int which) {
92+
if(responseFilterRule!=null){
93+
responseFilterRule.setUrl(urlEditText.getText().toString());
94+
responseFilterRule.setReplaceRegex(regexEditText.getText().toString());
95+
responseFilterRule.setReplaceContent(contentEditText.getText().toString());
96+
}else {
97+
if(urlEditText.getText().length()>0 && regexEditText.getText().length()>0
98+
&& contentEditText.getText().length()>0) {
99+
ResponseFilterRule responseFilterRule = new ResponseFilterRule();
100+
responseFilterRule.setUrl(urlEditText.getText().toString());
101+
responseFilterRule.setReplaceRegex(regexEditText.getText().toString());
102+
responseFilterRule.setReplaceContent(contentEditText.getText().toString());
103+
((SysApplication) getApplication()).ruleList.add(responseFilterRule);
104+
}
105+
}
106+
contentFilterAdapter.notifyDataSetChanged();
107+
}
108+
});
109+
builder.setNegativeButton("取消",null);
110+
builder.show();
111+
}
112+
113+
@Override
114+
protected void onStop() {
115+
SharedPreferenceUtils.save(getApplicationContext(),
116+
"response_filter",((SysApplication) getApplication()).ruleList);
117+
super.onStop();
118+
}
119+
120+
@Override
121+
public boolean onOptionsItemSelected(MenuItem item) {
122+
if (item.getItemId() == android.R.id.home) {
123+
finish();
124+
return true;
125+
}
126+
return super.onOptionsItemSelected(item);
127+
}
128+
}

0 commit comments

Comments
 (0)