本帖最后由 selangqishi 于 2016-9-26 19:24 编辑
一次未完成的bili注册分析
0x0 前言目的是开发注册机,但并没有完成,该文只是记录下已经完成的部分分析,望客官海涵 0x1 抓包分析工具使用:Fiddler,bili的包是https协议,注意配置 通过使用bili软件注册和查看发送的包,得知注册流程:输入手机号获取验证码→发送验证码→输入用户名密码,完成注册。整个过程发送三个包: 上图是第一步和第二步发送的包。 0x2 动态分析1.如何定位发包method 我使用的是DDMS的MethodProfiling功能,因为发送网络请求通常是在线程的run方法里,那么使用MethodProfiling后必然能发现.run()方法,注意尽量只是在点击“获取验证码”按钮前才开启MethodProfiling,不然会出现大量方法不方便定位关键方法。 上图是MethodProfiling显示中第一个bili的线程run方法,那么就从这个方法开始调试跟踪吧
2.调试跟踪 在apr.run()方法下断点,观察到apr的a:Lcom/android/volley/Request;成员变量中https包的url就已经构造好了,这个a变量是在init方法中赋值,所以在init方法下断点(注意:在点击按钮前再下断,因为其他操作也会使用这个类),这下整个从按钮点击事件到url构造的整个调用链就显示出来了: 注意图中的a():193,atm这个方法,它使用了java动态代{过}{滤}理,在静态分析时,我还是不太明白如何找到实现接口的类,但动态调试可以直接看到是auo$b.
Lbl/arw类的buildUri()Landroid/net/Uri;是关键方法,其中调用了a(Ljava/lang/String;Ljava/util/SortedMap;)V方法来填充除了sign外的uri参数,而sign参数是在其余参数赋值后,在 Appkey:获取Lbl/asa类的a:Ljava/lang/String;成员变量,该成员变量是在application类中赋值,即程序启动时进行初始化,它的值是由native方法得到的,但我调试时是固定值,所以没分析native方法,也许是通过Imei来计算得到一个值吧。
Build:同上 mobi_app:同上 platform:android ts:调用系统currentTimeMillis()方法,取整千 country_id:用户输入,默认为1(中国大陆+86) tel:用户输入的手机号 sign:固定值+上面得到的uristring,再做变化。调用Lbl/atc类的a(Ljava/lang/String;Ljava/lang/String;Ljava/util/SortedMap;Ljava/lang/String;)Ljava/lang/String;方法实现(详见附件) 完整的uristring: https://passport.bilibili.com/api/sms/sendCaptcha?appkey=1d8b6e7d45233436&build=425000&country_id=1&mobi_app=android&platform=android&tel=13888888888&ts=1474635557000&sign=2763c6de6d00e3bc204b312ab2e36113
之后将构造好的uristring转换为url,再创建httpURLConnection连接,设置连接参数,(Lbl/ard类的a(Ljava/net/HttpURLConnection;Lcom/android/volley/Request;)V方法实现)。 但这里问题来了,https请求头中有cookie,但我实在没有在代码中找到设置cookie的地方,一直卡在这里。由于不能完全模拟发送https包,所以测试时也不能成功收到验证码的短信。这篇文章到这里也就结束了,这里才进行到模拟注册的第一步----获取验证码,后续两步也没有继续进行下去了。另外第三步注册时的https请求中有参数是验证码的,所以是不能跳过前两步直接注册的。
9.25更新,测试发现不设置Cookie直接发送https请求也可以实现同样的效果,在自己的注册机程序(代码在附件)中发送https请求后,手机就收到了验证码短信。难道服务端没有检查Cookie吗,不清楚原理。总之第一步目标达成,待后续
0x3 Game Over如何从图形界面按钮一直静态分析定位到关键函数的过程我没写出来,因为我静态分析时在前文说的动态代{过}{滤}理那里卡住了,所以就没写了,但动静结合还是能很好的分析的。Native代码也没分析,因为我弱。。。最后,小生第一次发帖,思路很乱,望各位大大见谅。有大大能指点下cookie的问题就更好了,谢谢。
|