From 488b7196874ae0fdbe65abaaac137cf61af9331e Mon Sep 17 00:00:00 2001 From: xuzhou Date: Fri, 2 Jun 2017 15:03:28 +0800 Subject: [PATCH] =?UTF-8?q?add:=E8=BF=94=E5=9B=9E=E5=8C=85=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=20fix:mitm=E6=8D=A2=E4=BA=86=E6=9B=B4=E9=AB=98?= =?UTF-8?q?=E6=95=88=E7=9A=84=E5=AE=9E=E7=8E=B0=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E7=8E=B0=E5=9C=A8https=E6=8A=93=E5=8C=85=E6=9B=B4=E5=BF=AB?= =?UTF-8?q?=E4=BA=86=20fix:mbp;littleproxy,netty=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 31 +- app/build.gradle | 15 +- ...jar => netty-all-android-4.0.44.Final.jar} | Bin 2247573 -> 2317142 bytes app/src/main/AndroidManifest.xml | 29 +- .../Activity/ChangeFilterActivity.java | 128 + .../Activity/MainActivity.java | 40 +- .../Activity/SettingsActivity.java | 15 +- .../Adapter/ContentFilterAdapter.java | 94 + ...lterAdpter.java => PageFilterAdapter.java} | 4 +- .../Bean/ResponseFilterRule.java | 63 + .../networkdiagnosis/SysApplication.java | 55 +- .../networkdiagnosis/Utils/DeviceUtils.java | 39 + .../Utils/SharedPreferenceUtils.java | 85 + .../net/lightbody/bmp/BrowserMobProxy.java | 15 +- .../lightbody/bmp/BrowserMobProxyServer.java | 84 +- .../net/lightbody/bmp/client/ClientUtil.java | 36 +- .../java/net/lightbody/bmp/core/har/Har.java | 0 .../net/lightbody/bmp/core/har/HarCache.java | 0 .../bmp/core/har/HarCacheStatus.java | 8 +- .../lightbody/bmp/core/har/HarContent.java | 0 .../net/lightbody/bmp/core/har/HarCookie.java | 8 +- .../net/lightbody/bmp/core/har/HarEntry.java | 4 +- .../net/lightbody/bmp/core/har/HarLog.java | 9 +- .../bmp/core/har/HarNameValuePair.java | 0 .../bmp/core/har/HarNameVersion.java | 0 .../net/lightbody/bmp/core/har/HarPage.java | 9 +- .../bmp/core/har/HarPageTimings.java | 0 .../lightbody/bmp/core/har/HarPostData.java | 3 - .../bmp/core/har/HarPostDataParam.java | 0 .../lightbody/bmp/core/har/HarRequest.java | 2 +- .../lightbody/bmp/core/har/HarResponse.java | 0 .../lightbody/bmp/core/har/HarTimings.java | 0 .../bmp/core/json/ISO8601DateFormatter.java | 2 +- .../json/ISO8601WithTDZDateFormatter.java | 2 +- .../bmp/exception/DecompressionException.java | 0 .../UnsupportedCharsetException.java | 0 .../bmp/filters/AddHeadersFilter.java | 0 .../bmp/filters/AutoBasicAuthFilter.java | 0 .../bmp/filters/BlacklistFilter.java | 0 .../filters/BrowserMobHttpFilterChain.java | 0 .../filters/ClientRequestCaptureFilter.java | 0 .../bmp/filters/HarCaptureFilter.java | 60 +- .../filters/HttpConnectHarCaptureFilter.java | 0 .../bmp/filters/HttpsAwareFiltersAdapter.java | 0 .../bmp/filters/HttpsHostCaptureFilter.java | 0 .../HttpsOriginalHostCaptureFilter.java | 0 .../lightbody/bmp/filters/LatencyFilter.java | 0 .../filters/ModifiedRequestAwareFilter.java | 0 .../bmp/filters/RegisterRequestFilter.java | 0 .../lightbody/bmp/filters/RequestFilter.java | 0 .../bmp/filters/RequestFilterAdapter.java | 0 .../filters/ResolvedHostnameCacheFilter.java | 0 .../lightbody/bmp/filters/ResponseFilter.java | 3 +- .../bmp/filters/ResponseFilterAdapter.java | 0 .../bmp/filters/RewriteUrlFilter.java | 0 .../filters/ServerResponseCaptureFilter.java | 0 .../bmp/filters/UnregisterRequestFilter.java | 0 .../bmp/filters/WhitelistFilter.java | 0 .../filters/support/HttpConnectTiming.java | 0 .../bmp/filters/util/HarCaptureUtil.java | 0 .../lightbody/bmp/mitm/CertificateAndKey.java | 0 .../bmp/mitm/CertificateAndKeySource.java | 0 .../lightbody/bmp/mitm/CertificateInfo.java | 0 .../bmp/mitm/CertificateInfoGenerator.java | 0 .../bmp/mitm/ExistingCertificateSource.java | 0 .../HostnameCertificateInfoGenerator.java | 0 .../bmp/mitm/KeyStoreCertificateSource.java | 0 .../mitm/KeyStoreFileCertificateSource.java | 0 .../bmp/mitm/PemFileCertificateSource.java | 0 .../bmp/mitm/RootCertificateGenerator.java | 0 .../net/lightbody/bmp/mitm/TrustSource.java | 4 +- .../CertificateCreationException.java | 0 .../exception/CertificateSourceException.java | 0 .../bmp/mitm/exception/ExportException.java | 0 .../bmp/mitm/exception/ImportException.java | 0 .../mitm/exception/KeyGeneratorException.java | 0 .../exception/KeyStoreAccessException.java | 0 .../bmp/mitm/exception/MitmException.java | 0 .../SslContextInitializationException.java | 0 .../mitm/exception/TrustSourceException.java | 0 .../mitm/exception/UncheckedIOException.java | 0 .../bmp/mitm/keys/ECKeyGenerator.java | 0 .../lightbody/bmp/mitm/keys/KeyGenerator.java | 0 .../bmp/mitm/keys/RSAKeyGenerator.java | 0 .../manager/ImpersonatingMitmManager.java | 2 +- .../CertificateGenerationStatistics.java | 0 .../BouncyCastleSecurityProviderTool.java | 11 +- .../tools/DefaultSecurityProviderTool.java | 15 +- .../bmp/mitm/tools/SecurityProviderTool.java | 0 .../InsecureExtendedTrustManager.java | 31 +- .../InsecureTrustManagerFactory.java | 2 +- .../bmp/mitm/util/EncryptionUtil.java | 3 +- .../lightbody/bmp/mitm/util/KeyStoreUtil.java | 2 +- .../bmp/mitm/util/MitmConstants.java | 0 .../net/lightbody/bmp/mitm/util/SslUtil.java | 26 +- .../lightbody/bmp/mitm/util/TrustUtil.java | 13 +- .../lightbody/bmp/proxy/ActivityMonitor.java | 0 .../lightbody/bmp/proxy/BlacklistEntry.java | 0 .../net/lightbody/bmp/proxy/CaptureType.java | 0 .../net/lightbody/bmp/proxy/RewriteRule.java | 0 .../net/lightbody/bmp/proxy/Whitelist.java | 0 .../lightbody/bmp/proxy/auth/AuthType.java | 0 .../proxy/dns/AbstractHostNameRemapper.java | 0 .../bmp/proxy/dns/AdvancedHostResolver.java | 0 .../bmp/proxy/dns/BasicHostResolver.java | 0 .../bmp/proxy/dns/ChainedHostResolver.java | 0 .../bmp/proxy/dns/DelegatingHostResolver.java | 0 .../bmp/proxy/dns/DnsJavaResolver.java | 0 .../lightbody/bmp/proxy/dns/HostResolver.java | 0 .../dns/NativeCacheManipulatingResolver.java | 0 .../bmp/proxy/dns/NativeResolver.java | 0 .../bmp/util/BrowserMobHttpUtil.java | 22 +- .../bmp/util/BrowserMobProxyUtil.java | 32 +- .../bmp/util/ClasspathResourceUtil.java | 3 +- .../bmp/util/HttpMessageContents.java | 0 .../lightbody/bmp/util/HttpMessageInfo.java | 0 .../lightbody/bmp/util/HttpObjectUtil.java | 38 + .../java/net/lightbody/bmp/util/HttpUtil.java | 0 .../net/sf/uadetector/DeviceCategory.java | 199 - .../net/sf/uadetector/OperatingSystem.java | 203 - .../sf/uadetector/OperatingSystemFamily.java | 394 -- .../sf/uadetector/ReadableDeviceCategory.java | 163 - .../uadetector/ReadableOperatingSystem.java | 97 - .../net/sf/uadetector/ReadableUserAgent.java | 122 - .../sf/uadetector/ReadableVersionNumber.java | 98 - .../java/net/sf/uadetector/UserAgent.java | 450 -- .../net/sf/uadetector/UserAgentFamily.java | 4528 ----------------- .../sf/uadetector/UserAgentStringParser.java | 82 - .../java/net/sf/uadetector/UserAgentType.java | 142 - .../java/net/sf/uadetector/VersionNumber.java | 435 -- .../java/net/sf/uadetector/VersionParser.java | 379 -- .../sf/uadetector/datareader/DataReader.java | 58 - .../uadetector/datareader/XmlDataReader.java | 178 - .../uadetector/datareader/package-info.java | 17 - .../datastore/AbstractDataStore.java | 196 - .../AbstractRefreshableDataStore.java | 250 - .../datastore/AbstractUpdateOperation.java | 217 - .../datastore/CachingXmlDataStore.java | 329 -- .../sf/uadetector/datastore/DataStore.java | 90 - .../datastore/OnlineXmlDataStore.java | 61 - .../datastore/RefreshableDataStore.java | 61 - .../datastore/SimpleXmlDataStore.java | 53 - .../uadetector/datastore/UpdateOperation.java | 52 - .../datastore/UpdateOperationTask.java | 40 - .../UpdateOperationWithCacheFileTask.java | 255 - .../sf/uadetector/datastore/package-info.java | 17 - .../exception/CanNotOpenStreamException.java | 82 - .../exception/CannotCloseException.java | 81 - .../sf/uadetector/exception/package-info.java | 17 - ...owserOperatingSystemMappingComparator.java | 28 - .../net/sf/uadetector/internal/data/Data.java | 379 -- .../uadetector/internal/data/DataBuilder.java | 472 -- .../internal/data/IdentifiableComparator.java | 30 - .../data/OrderedPatternComparator.java | 29 - .../internal/data/XmlDataHandler.java | 709 --- .../internal/data/domain/Browser.java | 512 -- .../domain/BrowserOperatingSystemMapping.java | 230 - .../internal/data/domain/BrowserPattern.java | 337 -- .../internal/data/domain/BrowserType.java | 182 - .../internal/data/domain/Device.java | 275 - .../internal/data/domain/DevicePattern.java | 337 -- .../internal/data/domain/Identifiable.java | 17 - .../internal/data/domain/OperatingSystem.java | 429 -- .../data/domain/OperatingSystemPattern.java | 312 -- .../internal/data/domain/OrderedPattern.java | 41 - .../internal/data/domain/Robot.java | 339 -- .../internal/data/domain/package-info.java | 17 - .../internal/data/package-info.java | 17 - .../internal/util/AlphanumComparator.java | 150 - .../uadetector/internal/util/Closeables.java | 100 - .../internal/util/CompareNullSafe.java | 70 - .../internal/util/DaemonThreadFactory.java | 55 - .../internal/util/ExecutorServices.java | 182 - .../sf/uadetector/internal/util/FileUtil.java | 63 - .../util/RegularExpressionConverter.java | 325 -- .../sf/uadetector/internal/util/UrlUtil.java | 171 - .../internal/util/package-info.java | 17 - .../java/net/sf/uadetector/package-info.java | 17 - .../parser/AbstractUserAgentStringParser.java | 216 - .../UpdatingUserAgentStringParserImpl.java | 117 - .../parser/UserAgentStringParserImpl.java | 59 - .../sf/uadetector/parser/package-info.java | 17 - .../service/UADetectorServiceFactory.java | 326 -- .../sf/uadetector/service/package-info.java | 17 - .../sf/uadetector/writer/IniDataWriter.java | 328 -- .../sf/uadetector/writer/XmlDataWriter.java | 455 -- .../sf/uadetector/writer/package-info.java | 17 - .../org/littleshoot/proxy/mitm/Authority.java | 98 + .../mitm/BouncyCastleSslEngineSource.java | 390 ++ .../proxy/mitm/CertificateHelper.java | 327 ++ .../mitm/CertificateSniffingMitmManager.java | 100 + .../proxy/mitm/FakeCertificateException.java | 11 + .../org/littleshoot/proxy/mitm/Launcher.java | 41 + .../proxy/mitm/MergeTrustManager.java | 73 + .../proxy/mitm/RootCertificateException.java | 11 + .../mitm/SubjectAlternativeNameHolder.java | 61 + .../drawable-hdpi/ic_mode_edit_black_24dp.png | Bin 0 -> 202 bytes .../drawable-mdpi/ic_mode_edit_black_24dp.png | Bin 0 -> 160 bytes .../ic_mode_edit_black_24dp.png | Bin 0 -> 222 bytes .../ic_mode_edit_black_24dp.png | Bin 0 -> 269 bytes .../ic_mode_edit_black_24dp.png | Bin 0 -> 319 bytes .../res/layout/activity_change_filter.xml | 33 + app/src/main/res/layout/alert_resp_filter.xml | 58 + app/src/main/res/layout/item_filter.xml | 47 + .../main/res/menu/activity_main_drawer.xml | 4 + app/src/main/res/xml/pref_data_sync.xml | 6 + build.gradle | 2 +- 207 files changed, 2018 insertions(+), 17031 deletions(-) rename app/libs/{netty-android.jar => netty-all-android-4.0.44.Final.jar} (51%) mode change 100644 => 100755 create mode 100644 app/src/main/java/cn/darkal/networkdiagnosis/Activity/ChangeFilterActivity.java create mode 100644 app/src/main/java/cn/darkal/networkdiagnosis/Adapter/ContentFilterAdapter.java rename app/src/main/java/cn/darkal/networkdiagnosis/Adapter/{FilterAdpter.java => PageFilterAdapter.java} (93%) create mode 100644 app/src/main/java/cn/darkal/networkdiagnosis/Bean/ResponseFilterRule.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/BrowserMobProxy.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/BrowserMobProxyServer.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/client/ClientUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/Har.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarCache.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarCacheStatus.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarContent.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarCookie.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarEntry.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarLog.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarNameValuePair.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarNameVersion.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarPage.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarPageTimings.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarPostData.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarPostDataParam.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarRequest.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarResponse.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/core/har/HarTimings.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/exception/DecompressionException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/exception/UnsupportedCharsetException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/AutoBasicAuthFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/BlacklistFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/BrowserMobHttpFilterChain.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ClientRequestCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/HarCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/HttpConnectHarCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/HttpsAwareFiltersAdapter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/HttpsOriginalHostCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/LatencyFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ModifiedRequestAwareFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/RegisterRequestFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/RequestFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/RequestFilterAdapter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ResolvedHostnameCacheFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ResponseFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ResponseFilterAdapter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/RewriteUrlFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/ServerResponseCaptureFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/UnregisterRequestFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/WhitelistFilter.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/support/HttpConnectTiming.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/filters/util/HarCaptureUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/CertificateAndKey.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/CertificateAndKeySource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/CertificateInfo.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/CertificateInfoGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/ExistingCertificateSource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/HostnameCertificateInfoGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/KeyStoreCertificateSource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/KeyStoreFileCertificateSource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/PemFileCertificateSource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/RootCertificateGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/TrustSource.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/CertificateCreationException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/CertificateSourceException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/ExportException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/ImportException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/KeyGeneratorException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/KeyStoreAccessException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/MitmException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/SslContextInitializationException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/TrustSourceException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/exception/UncheckedIOException.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/keys/ECKeyGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/keys/KeyGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/keys/RSAKeyGenerator.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/manager/ImpersonatingMitmManager.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/stats/CertificateGenerationStatistics.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/tools/BouncyCastleSecurityProviderTool.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/tools/DefaultSecurityProviderTool.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/tools/SecurityProviderTool.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/trustmanager/InsecureExtendedTrustManager.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/trustmanager/InsecureTrustManagerFactory.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/util/EncryptionUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/util/KeyStoreUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/util/MitmConstants.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/util/SslUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/mitm/util/TrustUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/ActivityMonitor.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/BlacklistEntry.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/CaptureType.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/RewriteRule.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/Whitelist.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/auth/AuthType.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/AbstractHostNameRemapper.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/AdvancedHostResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/BasicHostResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/ChainedHostResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/DelegatingHostResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/DnsJavaResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/HostResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/NativeCacheManipulatingResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/BrowserMobHttpUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/BrowserMobProxyUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/ClasspathResourceUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/HttpMessageContents.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/HttpMessageInfo.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/HttpObjectUtil.java mode change 100644 => 100755 app/src/main/java/net/lightbody/bmp/util/HttpUtil.java delete mode 100644 app/src/main/java/net/sf/uadetector/DeviceCategory.java delete mode 100644 app/src/main/java/net/sf/uadetector/OperatingSystem.java delete mode 100644 app/src/main/java/net/sf/uadetector/OperatingSystemFamily.java delete mode 100644 app/src/main/java/net/sf/uadetector/ReadableDeviceCategory.java delete mode 100644 app/src/main/java/net/sf/uadetector/ReadableOperatingSystem.java delete mode 100644 app/src/main/java/net/sf/uadetector/ReadableUserAgent.java delete mode 100644 app/src/main/java/net/sf/uadetector/ReadableVersionNumber.java delete mode 100644 app/src/main/java/net/sf/uadetector/UserAgent.java delete mode 100644 app/src/main/java/net/sf/uadetector/UserAgentFamily.java delete mode 100644 app/src/main/java/net/sf/uadetector/UserAgentStringParser.java delete mode 100644 app/src/main/java/net/sf/uadetector/UserAgentType.java delete mode 100644 app/src/main/java/net/sf/uadetector/VersionNumber.java delete mode 100644 app/src/main/java/net/sf/uadetector/VersionParser.java delete mode 100644 app/src/main/java/net/sf/uadetector/datareader/DataReader.java delete mode 100644 app/src/main/java/net/sf/uadetector/datareader/XmlDataReader.java delete mode 100644 app/src/main/java/net/sf/uadetector/datareader/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/AbstractDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/AbstractRefreshableDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/AbstractUpdateOperation.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/CachingXmlDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/DataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/OnlineXmlDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/RefreshableDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/SimpleXmlDataStore.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/UpdateOperation.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/UpdateOperationTask.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/UpdateOperationWithCacheFileTask.java delete mode 100644 app/src/main/java/net/sf/uadetector/datastore/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/exception/CanNotOpenStreamException.java delete mode 100644 app/src/main/java/net/sf/uadetector/exception/CannotCloseException.java delete mode 100644 app/src/main/java/net/sf/uadetector/exception/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/BrowserOperatingSystemMappingComparator.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/Data.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/DataBuilder.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/IdentifiableComparator.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/OrderedPatternComparator.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/XmlDataHandler.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/Browser.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/BrowserOperatingSystemMapping.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/BrowserPattern.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/BrowserType.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/Device.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/DevicePattern.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/Identifiable.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/OperatingSystem.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/OperatingSystemPattern.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/OrderedPattern.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/Robot.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/domain/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/data/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/AlphanumComparator.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/Closeables.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/CompareNullSafe.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/DaemonThreadFactory.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/ExecutorServices.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/FileUtil.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/RegularExpressionConverter.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/UrlUtil.java delete mode 100644 app/src/main/java/net/sf/uadetector/internal/util/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/parser/AbstractUserAgentStringParser.java delete mode 100644 app/src/main/java/net/sf/uadetector/parser/UpdatingUserAgentStringParserImpl.java delete mode 100644 app/src/main/java/net/sf/uadetector/parser/UserAgentStringParserImpl.java delete mode 100644 app/src/main/java/net/sf/uadetector/parser/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/service/UADetectorServiceFactory.java delete mode 100644 app/src/main/java/net/sf/uadetector/service/package-info.java delete mode 100644 app/src/main/java/net/sf/uadetector/writer/IniDataWriter.java delete mode 100644 app/src/main/java/net/sf/uadetector/writer/XmlDataWriter.java delete mode 100644 app/src/main/java/net/sf/uadetector/writer/package-info.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/Authority.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/BouncyCastleSslEngineSource.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/CertificateHelper.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/CertificateSniffingMitmManager.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/FakeCertificateException.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/Launcher.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/MergeTrustManager.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/RootCertificateException.java create mode 100755 app/src/main/java/org/littleshoot/proxy/mitm/SubjectAlternativeNameHolder.java create mode 100644 app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png create mode 100644 app/src/main/res/layout/activity_change_filter.xml create mode 100644 app/src/main/res/layout/alert_resp_filter.xml create mode 100644 app/src/main/res/layout/item_filter.xml diff --git a/README.md b/README.md index 845043e..793c91e 100644 --- a/README.md +++ b/README.md @@ -18,38 +18,50 @@ Content内容如果为JSON将会自动格式化显示
![image](https://www.darkal.cn/imgd.php?src=/2016/09/230686663947787928.jpg&width=350)
分享功能将抓包生成的所有数据包打包为har文件并压缩为zip,支持分享到微信、QQ等

-2. 环境切换
+2. 返回包注入
+支持修改流量返回包(该版本暂时只支持http的修改)
+![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG180.jpeg&width=350) +![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG181.jpeg&width=350)

+ +3. 环境切换
支持切换模拟为微信、手Q,默认为普通浏览器。
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG81.jpeg&width=350)

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

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

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

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

-7. 设置系统代理,监听其他app请求包
+8. 设置系统代理,监听其他app请求包
当将用户手机的代理服务器设置为127.0.0.1:8888时,可以对其他app(例如微信)的HTTP数据进行抓包
(此时AndroidHttpCapture就是一个手机上的fiddler)
![image](https://www.darkal.cn/imgd.php?src=/2016/09/WechatIMG80.jpeg&width=350)

- + ### Q & A
1. 分享的http包如何查看和分析?
   分享的文件解压后为.har文件,可以通过fiddler方式或者在线工具进行分析。
Fiddler方式需要先将包导到电脑上,然后使用fiddler导入该包:Import Sessions->Select Import Format ->HTTPArchive ->选择包,即可
在线工具外网:http://h5.darkal.cn/har/ 只需要将包拖入此工具即可分析

- + +### 已知BUG
+1. 信任所有的服务器证书不做校验
+2. 开启返回包注入功能后,https返回的部分页面存在 err_CONTENT_LENGTH_MISMATCH 错误
+ +#### 如果觉得工具好用的话请多多star以及Pull requests
支持我喝杯咖啡请扫描下面的二维码,谢谢(ง •̀_•́)ง
+![image](http://h5.darkal.cn/har/guide/img/code.jpg)

+ ### 致谢
AndroidHttpCapture基于Netty、browsermob-proxy来实现核心抓包的功能
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
@@ -58,8 +70,7 @@ https://github.com/netty/netty
A free utility to help web developers watch and manipulate network traffic from their AJAX applications.
https://github.com/lightbody/browsermob-proxy
-修改了多处browsermob-proxy的源码适配Android系统
-#### 目前遗留了一个Bug:信任所有的服务器证书不做校验

+修改了多处browsermob-proxy的源码适配Android系统

MIT License
Copyright (c) 2016 AndroidHttpCapture diff --git a/app/build.gradle b/app/build.gradle index b7d13ca..7239ec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { applicationId "cn.darkal.networkdiagnosis" minSdkVersion 14 targetSdkVersion 22 - versionCode 25 - versionName "2.4.26" + versionCode 30 + versionName "3.1.30" // Enabling multidex support. multiDexEnabled true resConfigs "zh" @@ -76,10 +76,11 @@ dependencies { compile 'com.android.support:support-annotations:24.2.1' compile 'com.android.support:multidex:1.0.1' // littleproxy及其依赖 - compile('net.lightbody.bmp:littleproxy:1.1.0-beta-bmp-13') { + compile('net.lightbody.bmp:littleproxy:1.1.0-beta-bmp-16') { exclude group: 'io.netty' } - compile 'net.sf.qualitycheck:quality-check:1.3' + + compile group: 'org.apache.directory.studio', name: 'org.apache.commons.io', version: '2.4' compile 'javax.annotation:jsr250-api:1.0' compile 'com.fasterxml.jackson.core:jackson-core:2.7.6' compile 'com.fasterxml.jackson.core:jackson-databind:2.7.6' @@ -92,10 +93,12 @@ dependencies { compile 'com.google.jimfs:jimfs:1.1' compile 'com.jcraft:jzlib:1.1.3' // 日志处理 - compile 'org.slf4j:slf4j-api:1.7.21' +// compile 'org.slf4j:slf4j-api:1.7.21' + compile 'org.slf4j:slf4j-log4j12:1.7.21' + // compile 'org.slf4j:jcl-over-slf4j:1.7.21' // 启用Netty的日志输出(调试用) - // compile 'com.noveogroup.android:android-logger:1.3.5' +// compile 'com.noveogroup.android:android-logger:1.3.5' // 文件上传插件 compile 'net.gotev:uploadservice:3.0.3' // Bugly上报 diff --git a/app/libs/netty-android.jar b/app/libs/netty-all-android-4.0.44.Final.jar old mode 100644 new mode 100755 similarity index 51% rename from app/libs/netty-android.jar rename to app/libs/netty-all-android-4.0.44.Final.jar index 892b86f3e73e39ec0c19c8df5f1a9fc3a087dcc8..5e356a1c3d1674bf42aac7d08fd8b09bb86df488 GIT binary patch delta 938750 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

NoIXe%pTlg1# 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