zoukankan      html  css  js  c++  java
  • WIFI万能钥匙协议分析

    WIFI万能钥匙协议分析

    需求:

    android 市场下载任意一款,wifi万能钥匙 软件,对其进行 协议分析和逆向,达成如下结果:通过对软件的分析,完成自动化爬虫,爬wifi万能钥匙的wifi库,或 自动查询 (比如输入经纬度,得到当地共享密码的wifi列表数据)时限为两周,不论做到什么程度都可以出说明文档,交由我方评定。

     

    分析结果:

    1. wifi万能钥匙使用的HTTP协议的Get请求方式获取附近的wifi列表

    2. 数据包以JSON数据包格式进行传输

    3. 获取附近的wifi列表协议数据包如下

     

    4.字段sign的值是使用其他值做MD5算法求出的

     

     

     

    分析过程:

    分析对象:WIFIwnys.apk  2.9.20  

    小提示:选择分析对象,优先选择较早的版本,在百度找到最早的版本是2012年版本wifilocating.apk  1.5.2, 但是这个版本的由于查询wifi附近列表功能已经不再有效。所以另选这个版本。这个版本功能有效,但是量很大。

     

    分析工具:

    1. Android Killer1.3      DEX分析工具

    2. JEB2.0       反汇编工具

    3. Charles 4.0           抓包工具

    4. Chrome插件Postman  Htttp 协议测试工具

     

     

    分析过程: 大胆假设,小心验证

     

    1.抓包

    安装WIFIwnys.apk程序,使用查询wifi附近列表功能,用chares 4.0 抓网络数据包。在数据包中使用wifi关键字过滤一些非我们关注的包,在这些包找我们发现一个pid=qryapnearby 数据包。查看这个数据包内容(为了方便解释,内容已整理,如下)。 接下来就是根据抓的包和代码进行分析,

    URL : http://wifiapi02.51y5.net/wifiapi/fa.cmd;  

    lo=114.382686&

    d=2&

    capbssid=80%3A89%3A17%3Afc%3A6e%3A5d&

    ii=866048020492064&

    appid=0001&

    pid=qryapnearby&                               ;pid=qryapnearby

    mac=18%3A59%3A36%3Af4%3A3a%3Af1&

    lang=cn&

        sign=C8937F7842952034F2307FF2E6802101&

    capssid=cr21&

    v=383&

    mapSP=b&

    la=30.500757&

    uhid=a0000000000000000000000000000001&

    st=m&

    chanid=baidu&

    dhid=33986deebca441a180714f6cc57cbb84

     

    2.字段lo la 的分析

    根据协议包的作用,我们肯定这个协议包一定有坐标信息,如果坐标信息没有加密的话,坐标信息一定是个浮点型,所以猜测:lo=114.382686 la=30.500757 可能是经纬度。

    现在登录http://www.gpsspg.com/maps.htm 网站,查询我当前位置经纬度。如下图所示

     

    我们数据和百度数据位置最为相似,这是因为wifi万能钥匙,定位就是使用百度服务的API。多次验证,我们判断是正确。

    lo 字段: 当前位置的纬度, la:当前位置的经度。

     

    2.字段d

    使用Android Killer1.3分析WIFIwnys.apk 程序,由于笔者发现qryapnearby这个请求包,于是笔者在Android Killer1.3分析WIFIwnys.apk的工程中搜索qryapnearby 这个关键字。

     

    于是使用JEB2.0 分析 WIFIwnys.apk, 打开类com.snda.wifilocating.u, 反编译查看源码。源码经过命名混淆, 笔者已重名了。

     

    回溯发现在 MapNearAPActivity  queryNearAP 函数中,调用,发现传参 2  验证查询qrynearap 包中d=2

     

     

     

     

     

    3.字段mapSP

    分析mapSP字段,mapSP字段是桐谷歌MapManger 管理器拿到的

     

    笔者已经分析出这个mapSP 这个字段是地图服务商(Baidu地图,Google地图)的简称,我们看看它值由哪些,已经是如何实现的吧。

    MapManager.getMapManager(),这是单模式获取MapManager地图服务管理器, getMapShortName 的实现如下

     

    其中mMapEnum 的类型是MapEnum

     

     

    其中笔者抓取的qryapnearby 包中mapSP=b, 可知我们使用时百度服务商,笔者打开手机,发现手机Wifi确实使用的百度地图服务。

     

     

     

    4.字段capssid, capbssid

    现在我们继续分析字段capssidcapbssid, 由于笔者之前有开发路由器经验,看见这两个关键字,很自然想到了路由器的SSID, 和BSSID, 于是进入路由器查看,笔

    者家用的有路由器SSIDcr21 BSSID= 80-89-17-FC-6E-5D, 然后查看capbssid=80%3A89%3A17%3Afc%3A6e%3A5d,其中%3A是分割符 和capssid=cr21.

     

    5.字段mac

    笔者看见这个mac, 大胆假设他手机网卡的MAC地址,于是于是笔者查看自己手机的MAC地址:185936f43af1, 然后查看qryapnearby 数据包

    mac=18%3A59%3A36%3Af4%3A3a%3Af1 ,其中%3A分割符

     

     

    另外进入CreateCoreJSON 函数中 看到函数,看到MAC 对应值就是从WifiManage人中获取的macaddress

     

     

     

    6.字段ii

    另外进入CreateCoreJSON 函数中 看到函数,

     

    另外进入GlobalApplication getIMEI函数中 看到函数的实现,可知只是获取手机的IMEI, 其中IMEI(International Mobile Equipment Identity)

    国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台移动电话机一一对应,而且该码是全世界唯一的。每

    一只移动电话机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录

     

    笔者查看自己的手机IMEI qryapnearby 数据包的ii字段(ii=866048020492064)进行比较,

     

     

    7.字段dhid && uhid

    进入CreateCoreJSON 函数中 看到函数,看到dhiduhid 数据是从配置文件SharesPrefernces中读取出来的

     

    进入,发现这个值是通过 关键字 dhid  获取的  uhid

     

     

    SharesPrefernces同样找到设置dhid  获取的  uhid函数

     

     

    分析字段dhid, JEB工具中查看调用setDhid 的函数,发现只有一处在,然后最终追查到第一次调用setUserrutils strUnhid 给的空置,所以对我们这款WIFI钥匙的dhid是恒定为

    a0000000000000000000000000000001 的, 查看uhid=a0000000000000000000000000000001

     

    分析字段 dhid=33986deebca441a180714f6cc57cbb84

     

     

    8.app相关的字段v, appid,chanid, st, lang

    进入CreateCoreJSON 函数中 看到函数,有获取wifi万能钥匙app的相关信息

     

    JSONFactory.getAppinfo函数,发现有v, appidchanid, st, lang 等五个字段

     

     

    先看v字段,进入 类GlobalApplication 的函数GetVersionCode 函数,为获取app 的版本号

     

    验证v字段;查看程序清单中VersionCode 的值383 和抓取的qryapnearby中 v=383比较,是一致的。

     

     

    再看字段appid和st 的值是两个固定值appid=0001 st=m , 验证查看qryapnearby包中 appid=0001 , st=m, 一致。笔者对appid字段能app的编号,

    St的意义笔者没有过分分析,由于这个值是固定值,分析意义不大,笔者就不分析了。

     

    再看chanid, 进入GlobalApplication 类的GetAppChannel()函数中,发现chnnid的值从程序的自定义数据中拿到的

     

    查看程序清单的meta数据中的APPLICATION_CHANNEL valuebaidu 查看qryapnearby包中 chanid=baidu 一致。笔者对appid字段能app的编号

     

    笔者搜索一下关于meta数据的作用:接入第三方服务。笔者觉得有道理, 就信了。

     

    字段lang, 这个字段笔者大胆猜测是语言的意思,于是验证了一下,确实如此, 如下图, 查看qryapnearby包中lang=cn

     

     

     

     

    9.字段sign

      另外进入CreateCoreJSON 函数中 看到函数, 其中 ConstString.mStrSignPriKey = "LQ9$ne@gH*Jq%KOL";

     

    进入public static String makeSign(Map signParam, String strSignPriKey)函数内有:

     

    进入关键的MD5加密函数 public static final String EncryptByMD5(String strSrc)

     

  • 相关阅读:
    当年的笔记_apache配置虚拟主机
    sqlserver 调优(三)
    bat命令自用其(一)
    Always On主辅延迟相关描述
    sqlserver中常用的windows命令行的操作
    mysql复制以及一主多从等常见集群概述
    sqlserver 调优(二)
    sqlserver 获取实例上用户数据库的数据字典
    sqlserver事务隔离小结
    mysql 慢查询的小结
  • 原文地址:https://www.cnblogs.com/jiaoxiake/p/6798144.html
Copyright © 2011-2022 走看看