Appetizer Appetizer 截获 http 原理和混淆处理

AppetizerIO for AppetizerIO · 2017年12月28日 · 最后由 sunqingwei@julanling.com 回复于 2018年06月10日 · 912 次阅读

有不少用户好奇Appetizer截获http请求的原理,主要关心:1)会搜集什么数据,会不会搜集到敏感的信息; 2)我的apk的一些请求无法截获为什么;3)https的请求能截获么;这里来一并解释一下:

原理

插桩,就是基于一定规则自动在代码里面打点,例如如果程序有这样的请求代码,通过java标准库的HttpURLConnection发出请求:

URL url = new URL("http://www.example.com/comment");

HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");

OutputStreamWriter writer = new OutputStreamWriter(
connection.getOutputStream());

Appetizer做的就是在代码里面查找openConnection()这个函数调用,在它的后面插桩数据搜集代码,例如:

HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
Appetizer.collect(connection); // 把这个请求的信息保存下来

Appetizer log的信息包括:url,请求发发,请求参数(http request header),返回头(response header);不log 请求体(request body)和返回体(response body);简单来说,只是请求的参数信息,不包括具体传递的POST数据和返回内容,所以安全上,Appetizer不搜集 APK的敏感请求数据

那大家在apk中可能会用不同的http库,比如常用的okhttp等等,Appetizer的做法是对于每一个http都有相应的规则去搜集数据。虽然开发中可能会用到很多不同的http库,事实上绝大多数的库都是对一些基本库的再次封装(尤其是那些所谓的快速开发框架,基本都是用了okhttp来做http请求的)。所以Appetizer通过截获底层的这些库来支持包括HttpURLConnection, Apache HTTP client, okhttp 2/3,retrofit, volley等。同时 https是完全可以截获的,不同于一些抓包工具,抓包工具的原理是代理,而https的设计是防止代理软件看请求内容的,所以抓包工具需要额外配置伪造的证书等等麻烦的事情;而 Appetizer完全是打点,采集的数据好比在源代码里面能看到的数据一样,没有这个问题,https请求的内容可以完全抓到

不支持的情况包括:

  • okhttp <2.2, retrofit <1.8 (我不会说2.2是2014年的东西,今天是2018)
  • apk被强力混淆后okhttp被去除的情况(请看下面的解决方案)

okhttp和混淆

绝大多数的http库都不受到混淆的影响,唯一有问题的是okhttp,我们观测到强力的混淆会去除okhttp一些功能,导致Appetizer无法正常截获请求,解决方案是到proguard-rules.pro里面,添加一下规则防止混淆okhttp,首先找到这个规则文件:

然后添加

-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

-keep class okio.* { *; }
-keep interface okio.* { *; }
-dontwarn okio.**

这些字段保证混淆器不会删除okhttp的功能,Appetizer就能正常工作了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞
AppetizerIO 关于 appium 自动化测试稳定性问题的讨论 中提及了此贴 02月01日 17:38
AppetizerIO 关闭了讨论 04月24日 13:51
AppetizerIO 重新开启了讨论 04月24日 13:51

请问如何让统计一个接口的请求次数呢

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册