浅析APP代理检测对抗

根据上表可知,SSL做数据加密是在表示层,也就是说,HTTPS实际上是建立在SSL之上的HTTP协议,而普通的HTTP协议是建立在TCP协议之上的 。
所以,当HTTPS访问URL时,由于URL在网络传送过程中最后是处于HTTP协议数据报头中,而HTTP协议位于SSL的上层,所以凡是HTTP协议所负责传输的数据就全部被加密了;但是IP地址并没加密,因为处理IP地址的协议(网络层)位于处理SSL协议(表示层)的下方 。
额,说了这么多,就是要告诉你一个重要的关键点:数据的封装是自下而上的 !在网络数据处理方面,如果是上层做了检测处理,则需要在同层或下层进行逻辑绕过,这就是攻与防的关键了,偷家(底层)才是硬道理 。
接下来,我们再理解一下代理与VPN 。
【浅析APP代理检测对抗】代理与VPN 3.1、代理
代理(proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另外一个终端(一般为服务器)进行非直接的连接 。
一个完整的代理请求过程为:客户端首先根据代理服务器所使用的代理协议,与代理服务器创建连接,接着按照协议请求对目标服务器创建连接、或者获得目标服务器的指定资源 。
3.2、VPN
VPN()(虚拟专用网络 )是常用于连接中、大型企业或团体间私人网络的通讯方法 。它利用隧道协议( )来达到发送端认证、消息保密与准确性等功能 。
3.3、代理和VPN的区别
从各自的定义,我们就能看出VPN的特点是采取隧道协议进行数据传输和保护;而代理使用的则是对应的代理协议 。
下面是VPN和代理的常用协议:
VPN 协议大多是作用在 OSI 的第二层和第三层之间,所以使用 VPN 时,几乎能转发所有的流量 。而代理协议多作用在应用层,最高层 。
安卓代理检测
知道了代理与VPN的作用后,在APP中,如果开发人员在代码中添加了一些网络层的检测机制,而这些机制恰恰又是针对工作层协议进行的检测,那么只要分析出工作在IOS的哪一层,抢先一步在下层做出应对,那APP在上层无论怎么检测,都没有用 。
下面将对测试场景进行详细分析 。
抓包的步骤:
1.在客户端(手机)中设置代理服务器的地址
2.开启代理服务器(burp)的代理功能
如果在客户端对代理服务进行过滤,禁止客户端通过代理服务器进行访问,添加如下代码:
connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
官方对于Proxy.的描述如下:
/** * A proxy setting that represents a {@code DIRECT} connection, * basically telling the protocol handler not to use any proxying. * Used, for instance, to create sockets bypassing any other global * proxy settings (like SOCKS): ** {@code Socket s = new Socket(Proxy.NO_PROXY);} * */public final static Proxy NO_PROXY = new Proxy();// Creates the proxy that represents a {@code DIRECT} connection.private Proxy() {type = Type.DIRECT;sa = null;}
实际上就是type属性为的一个Proxy对象,这个type有三种:
所以,Proxy.的意思是的请求是直连 。
此时若通过系统进行代理,app对外请求会失效,也就是视觉上看到的卡死状态,就是不让走系统代理 。
安卓手机上设置系统代理即是在【设置】-【WLAN】-【修改网络】手动设置代理 。
针对不走系统代理的情况有如下两种应对:
1、使用基于VPN模式的
2、使用基于的
对此,我做出了如下一些测试:
4.1、使用系统代理
APP关键代码如下:
private void sendRequestWithHttpURLConnection(){new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try{URL url = new URL("http://www.baidu.com");connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);connection.setRequestMethod("GET");InputStream in = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null){response.append(line);}showResponse(response.toString());} catch (Exception e){e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e){e.printStackTrace();}}if (connection != null){connection.disconnect();}}}}).start();}