修改Android源码,解放HTTPS抓包

修改Android源码,解放HTTPS抓包

2023年6月28日发(作者:)

修改Android源码,解放HTTPS抓包⽂章⽬录为什么HTTPS不能抓包了?Google在Android 7.0以后的版本中,添加了“”的相关配置项。其旨在增强App的安全性,可以避免TargetSDK版本>=N的App内部⽹络请求在⾮测试环境下被恶意抓包。Network Sercurity Configuration对安全性的保证,主要是通过以下⼏个途径:是否允许明⽂HTTP请求(⾮HTTPS)、HTTPS证书(区分系统、⽤户)信任设置、域名以及App的Debug或Release配置,只有符合Manifest中配置的NetworkConfig字段内容下的条件,才可以进⾏正常的HTTP请求,如果需要使⽤Charles、Fiddler等⼯具进⾏抓包,也需要利⽤NetworkConfig来配置可以信任的证书,否则HTTPS请求在CONNECT阶段,就会返回错误,同时LogCat会打印出类似以下的错误信息: Caused by: icateException: xxx. at Chain(:661) at rustedRecursive(:539) at rustedRecursive(:605) at rusted(:495) at erverTrusted(:321) at erverTrusted(:113) at erverTrusted(:87) at erverTrusted(:116) at erverTrusted(:105) at erverTrusted(:212) at CertificateChain(:404) at _do_handshake(Native Method) at shake(:375)通常,Android开发者会将NetworkConfig按照以下XML⽂件进⾏配置: 然⽽对于开发者来说,通常App发版上线会选择使⽤Release版本的安装包,如果希望对Release包抓包,只能使⽤Android 6.0及以下的⼿机,这样⼀来,有时候出现线上问题,便⽆法进⾏HTTPS抓包,并不利于测试和修正如何解决这⼀问题?基本的⼏个思路反编译APK,修改NetworkConfig相关的XML⽂件,让App可以信任⽤户配置的证书这个⽅案局限性⽐较⼤,现在很多App都对反编译技术(主要是apktool)进⾏了防御,有的App使⽤apktool解包以后,就⽆法成功打包了,还有的⽤上了加固技术,通⽤的反编译⼯具⽆法直接获取真正Apk内部的⽂件。不过,如果能够使⽤apktool成功获得解码后的XML⽂件,且进⾏修改后能够重新打包成可以运⾏的Apk,这样做也是可⾏的使⽤Hook使⽤Xposed框架在App请求过程中进⾏Hook,依赖的基础仍然是反编译,且Xposed框架需要建⽴在Root后的基础上,成功率⽐较低,且成本还⽐较⾼修改Android源码这个应该是最成功且⼀劳永逸的办法了,但成本不⼩,需要有⼀台性能不错的电脑(⾄少硬盘空间够⼤)和⼀台Google的⼿机,具体如何实现,下⾯详细来说寻求⼀个适合⾃⼰的办法这⾥并不是说修改源码就是最好的,举例来讲,能使⽤6.0⼿机,是最简单的办法,但随着现在最低SDK版本的提升,在不久的将来,⼀些App或许就不会再⽀持6.0了,所以我只是在寻找⼀个更为靠谱的⽅案如何改Android源码准备⼯作分析源码AOSP的源码⾮常的庞⼤,如果是初次接触,可能会完全摸不着头脑,当然,我们也不可能完全把它的结构和内容摸索清楚再进⾏修改,学会⽤⽂本查找很重要这⾥安利VSCode,我们不需要使⽤Android Studio这样的⼯具,因为太慢!⾸先去搜索⼀下NetworkSecurityConfig,就会发现有以下相关的⽂件其中和就和证书判断逻辑相关仔细分析⼀波NetworkSucurityConfig类,可以发现这个类使⽤了Android中常见的Builder模式来进⾏创建,其中包括⼀个返回默认配置Builder的静态⽅法public static final Builder getDefaultBuilder(ApplicationInfo info)在Android 9以前,这个⽅法的参数为两个int型字段:int targetSdkVersion, int targetSandboxVesrsion这⾥列出这个⽅法的详细代码 /** * Return a {@link Builder} for the default {@code NetworkSecurityConfig}. * *

* The default configuration has the following properties: *

    *
  1. If the application targets API level 27 (Android O MR1) or lower then cleartext traffic * is allowed by default.
  2. *
  3. Cleartext traffic is not permitted for ephemeral apps.
  4. *
  5. HSTS is not enforced.
  6. *
  7. No certificate pinning is used.
  8. *
  9. The system certificate store is trusted for connections.
  10. *
  11. If the application targets API level 23 (Android M) or lower then the user certificate * store is trusted by default as well for non-privileged applications.
  12. *
  13. Privileged applications do not trust the user certificate store on Android P and higher. *
  14. *
* * @hide */ public static Builder getDefaultBuilder(ApplicationInfo info) { Builder builder = new Builder() .setHstsEnforced(DEFAULT_HSTS_ENFORCED) // System certificate store, does not bypass static pins. .addCertificatesEntryRef( new CertificatesEntryRef(tance(), false)); final boolean cleartextTrafficPermitted = SdkVersion < N_CODES.P && SandboxVersion < 2; artextTrafficPermitted(cleartextTrafficPermitted); // Applications targeting N and above must opt in into trusting the user added certificate // store. if (SdkVersion <= N_CODES.M && !ilegedApp()) { // User certificate store, does not bypass static pins. tificatesEntryRef( new CertificatesEntryRef(tance(), false)); } return builder; }可以看出以下⼏个特点:1. Android 9(假设Target和系统版本⼀样)以下默认允许明⽂传输(⾮HTTPS)2. 默认只信任系统内置的根证书,Android 7以下添加对⽤户配置的证书信任3. HSTS不强制开启于是再次搜索这个⽅法的调⽤其中,第⼀个调⽤的地⽅是重写了XmlConfigSource实现的ConfigSource类中的⽅法getDefaultConfig⽽第⼆个地⽅则是在private void parseNetworkSecurityConfig(XmlResourceParser parser)这个⽅法当中,根据⽅法名,就知道这是在解析XML配置中的⽹络安全配置那么再分别查看它们的调⽤那么,系统读取App⽹络安全配置的基本流程就可以猜想出来了:1. ⾸先是解析⽂件2. 中间会初始化⼀个XmlConfigSource实例⽤来解析NetworkConfig3. 当需要⽤到⽹络配置的具体内容时,会调⽤XmlConfigSource实例的getDefaultConfig⽅法,其中ensureInitialized会具体负责解析XML⽂件中的证书、域名、是否允许明⽂等配置4.

parseNetworkSecurityConfig⽅法会⾸先利⽤NetworkSecurityConfig类的getDefaultBuilder⽅法获取⼀个通⽤的Builder,构建⼀个默认配置,再根据XML中的实际情况进⾏补充修改相关源码了解了⽹络安全配置加载的流程,那么从理论上来说,我们可以在任⼀环境进⾏修改,即可去掉HTTPS的抓包限制,其中,修改的⼏个点如下:1. ⾸先修改NetworkSecurityConfig的默认Builder,让它能够和Android 6.0以下的配置⼀样,默认添加对⽤户配置的证书信任,具体修改如下: //

//

修改前 public static Builder getDefaultBuilder(ApplicationInfo info) { Builder builder = new Builder() .setHstsEnforced(DEFAULT_HSTS_ENFORCED) // System certificate store, does not bypass static pins. .addCertificatesEntryRef( new CertificatesEntryRef(tance(), false)); final boolean cleartextTrafficPermitted = SdkVersion < N_CODES.P && SandboxVersion < 2; artextTrafficPermitted(cleartextTrafficPermitted); // Applications targeting N and above must opt in into trusting the user added certificate // store. if (SdkVersion <= N_CODES.M && !ilegedApp()) { // User certificate store, does not bypass static pins. tificatesEntryRef( new CertificatesEntryRef(tance(), false)); } return builder; } //

//

修改后 public static final Builder getDefaultBuilder(ApplicationInfo info) { Builder builder = new Builder() .setHstsEnforced(DEFAULT_HSTS_ENFORCED) // System certificate store, does not bypass static pins. .addCertificatesEntryRef( new CertificatesEntryRef(tance(), false)); final boolean cleartextTrafficPermitted = SdkVersion < N_CODES.P && SandboxVersion < 2; artextTrafficPermitted(true); //

修改点1:忽略targetSdkVersion的判断,直接添加UserCertificateSource tificatesEntryRef(new CertificatesEntryRef(tance(), false)); return builder; }2. 其次我们需要忽略App内置的配置,直接忽略XmlConfigSource中的解析结果,getDefaultConfig⽅法直接返回我们改过的DefaultConfig: // //

修改前 public NetworkSecurityConfig getDefaultConfig() { ensureInitialized(); return mDefaultConfig; } // //

修改后 public NetworkSecurityConfig getDefaultConfig() { //

防⽌出现其他异常,其他初始化操作不进⾏修改(保留ensureInitialized⽅法的调⽤) ensureInitialized(); //

修改点2:不使⽤解析后的mDefaultConfig,重新获取⼀个DefaultConfig r builder = aultBuilder(null); return (); }刷机验证确认没有基本的Java语法问题以后,lunch、make⼀波⾛起!!稍等⽚刻,刷机试验……注意:刷完机后,先不要着急连上WiFi挂上代理抓包,很多⼿机刷完以后时间会还原,所以先去设置中把时间调成正确的,否则⽆论如何证书都是过期的……调整好时间后,连上Charles或者Fiddler的代理,装上它们的证书,即可对任意的App进⾏HTTPS抓包了!终于不是满屏红叉了!!

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687954499a60525.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信