客户端程序强制抓包(一)

HOW & WHY

抓包的文章在网上一搜一大把了,但大多数是讲对浏览器的抓包,主要用于分析WEB站点内容,常规工具Fillder、burpsuite之类的都是以开启代理的方式去抓取经过代理的数据包。使用此方式会发现有些程序可以抓到、有些抓不到,有些似乎只能抓到一部分,关键的HTTP/HTTPS请求都没抓到,这是为什么呢? 本文就总结下其中的HOW/WHY记录下来。

趋势

现在的Windows桌面应用程序越来越喜欢直接在窗口上放一个Webbrowser或者CEF,直接使用HTML/CSS/Javascript构建用户界面,然后使用HTTP/HTTPS协议与服务器通信,如果该软件同时有WEB界面的话,更是可以直接复用同一个后端,这样使得客户端和服务端的开发效率大大提高,同时也有很好的移植型性。对于逆向分析者来说是好事,至少省去了自定义协议分析这一关,尤其是让人恶心的二进制协议。

抓包的条件

使用Fillder/burpsite开启All Processes后,我们运行第三方程序,会发现有的HTTP/HTTPS包可以抓到,有的抓不到,那是因为Fiddler的这种设置全局代理的方式,只对以下几种情况有效:

  • IE Chrome等浏览器
  • 程序使用WinInet库进行HTTP/HTTPS通信
  • 程序内嵌Webbrowser

        这也很好理解,如果程序没有使用Windows提供的WinInet库进行HTTP通信,而是自带了一个库,比如VC程序使用libcurl,JAVA程序使用JDK中的URLConnection或第三方OkHttp,C#使用System.Net.Http等,这些库在程序内部实现了HTTP包的封装与拆解,那么最终他们将直接调用操作系统的socket api发送数据,操作系统当然就没法给他们设置HTTP/HTTPS代理了。所以Fiddler在这里其实有很大局限性,但如果比较幸运,你要分析的第三方程序,使用WinInet通信或者内嵌了Webbrowser,你仍然可以这样对它进行HTTP/HTTPS抓包分析。还有比如Python的requests包,如果你用Fiddler设置了全局代{理,而Python程序使用requests进行通信而没有在代码里设置HTTP/HTTPS代理,则requests默认会使用系统全局代理通信,从而能在Fiddler中看到Python程序的HTTP通信内容。至于其它编程语言和类库实现的程序,是否会被Fiddler设置的全局代理影响,就没法一一测试了。

解决:强行设置代理

不满足条件的第三方程序,没法用Fiddler/burp抓包,怎么办呢?上面说到了,Fiddler/burp抓包的原理是在本机的8888端口开启了HTTP/HTTPS代理,任何通过Fiddler/burp代理的HTTP/HTTPS通信内容都会被解析,那么只要能给目标程序设置HTTP/HTTPS代理,目标程序的HTTP通讯内容就会乖乖的出现在Fiddler/burp里。

 既然不支持设置代理,我们就借助其他工具给它强制设置代理,比如:

这两款软件都可以让任意程序通过HTTPS/SOCKS5代理访问网络,其中SocksCap64使用黑科技API HOOK技术,HOOK了Windows Sockets API,然后把所有的TCP/UDP包通过代理转发。而Proxifier则是正规军,使用了Windows提供的正规接口,通过安装WinSock LSP模块过滤/转发TCP/UDP包,当然此处还是推荐Proxifier,稳定性和兼容性更好。SocksCap64依赖API HOOK和DLL注入技术,但不是所有程序都随便给你注入的,比如腾讯TP保护下的游戏客户端,所以兼容性和可用性不如Proxifier。

我们拿某浪客户端来说,强行给它设置代理,看看它是怎么和服务器通讯的。

在Proxifier中添加 [127.0.0.1:8888] 这个Fiddler提供的HTTPS代理服务器

设置Proxifier规则,让 某浪 通过代理访问网络

勾选通过代理解析主机名称,英文版的叫 [Resolve hostnames through proxy],让域名解析的工作交给代理服务器,而不是在Proxifier上解析。

默认情况下Proxifier自行解析域名,比如www.baidu.com解析为180.97.33.108,然后发请求给Fiddler:

CONNECT 180.97.33.108:443 HTTP/1.1

。Fiddler并不知道它请求的是哪个域名,于是返回给客户端的伪造证书时,伪造的是为180.97.33.108颁发的证书,有的客户端会做校验,发现这个证书是颁发给180.97.33.108的,而不是颁发给www.baidu.com的,然后报错处理。
        修改Proxifier设置后,把域名解析的工作交给代理服务器,Proxifier会直接向Fiddler发送请求:

CONNECT www.baidu.com:443 HTTP/1.1

这样Fiddler就知道客户端请求的是 www.baidu.com,从而返回客户端伪造的www.baidu.com证书,客户端不报错,Fiddler才能顺利抓包解密。

原文链接:http://www.itawp.com/360.html,转载请注明出处。

0

评论0

没有账号? 注册  忘记密码?