首页 > QQ技巧 > 利用蓝牙模拟手环伪造微信运动步数

利用蓝牙模拟手环伪造微信运动步数

时间:2016-12-17 10:12 作者:QQ地带 我要评论

伪造微信运动步数的方法有很多种,可以hook系统提供步数统计的模块,可以伪造GPS,可以找第三方手环的漏洞。
第三方手环走微信iot平台AirSync协议的话可能通信过程启用AES加密,很难对其攻击。于是考虑自己成为一个手环设备生产商并伪造一个运动手环,欺骗微信运动来获取假的运动步数。
 
微信平台配置
 
此部分内容主要参考微信iot平台文档。
 
公众号后台开通“设备功能”插件
 
如果没有认证过的公共号,也可以用公众号测试账号。
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
添加设备时,需要指明接入方案,选平台基础接入方案,连接类型选蓝牙,产品配置选蓝牙发现。登记成功后会得到一个微信硬件的型号编码即product_id。
 
获取access_token
 
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=&secret=
获取完access_token之后,接下来从微信公共号后台找到自己的openid。
 
获取deviceid和二维码
 
https://api.weixin.qq.com/device/getqrcode?access_token=&product_id=
得到如下返回。
 
 
{"base_resp":{"errcode":0,"errmsg":"ok"},"deviceid":"gh_eee2c24a6f8e_852ddc34836c0559","qrticket":"http:\/\/we.qq.com\/d\/AQC5K_3BgSGNsg84sHISxXmHwMJrSp5sDf9AX1sB"}
微信平台会分配一个deviceid和对应的二维码qrticket,在绑定用户的时候用到。
 
设备授权
 
https://api.weixin.qq.com/device/authorize_device?access_token=
POST数据
 
  1.     "device_num":"1", 
  2.     "device_list":[ 
  3.     { 
  4.         "id":"gh_eee2c24a6f8e_852ddc34836c0559", 
  5.         "mac":"ff8d22e19590", 
  6.         "connect_protocol":"3", 
  7.         "auth_key":"", 
  8.         "close_strategy":"1", 
  9.         "conn_strategy":"5", 
  10.         "crypt_method":"0", 
  11.         "auth_ver":"0", 
  12.         "manu_mac_pos":"-1", 
  13.         "ser_mac_pos":"-2", 
  14.         "ble_simple_protocol": "1" 
  15.     } 
  16.     ], 
  17.     "op_type":"0", 
  18.     "product_id": "25806" 
 
主要为开启蓝牙精简协议。在数据包里配置好id、mac和product_id即可。mac为电脑蓝牙的mac地址。协议的具体内容参照微信文档。
 
强制绑定用户和设备
 
https://api.weixin.qq.com/device/compel_bind?access_token=
POST数据
 
 
  1.     "device_id": "gh_eee2c24a6f8e_852ddc34836c0559", 
  2.     "openid": "ouSvtwWqDVHQUGT3u0XkTpiJ9QsY" 
 
 
在数据包里配置好device_id和openid。
 
这样,微信账号就与设备绑定好了。打开公共号会看到公共号下面有个“未连接”的字符串。
 
伪造手环设备
 
根据微信蓝牙精简协议文档
 
设备需要广播包带上微信的service,并在manufature data里带上mac地址。
微信Service uuid:0xFEE7
manufature specific data:需以MAC地址(6字节)结尾。并且manufature specific data长度需大于等于8字节(最前两个字节为company id,没有的话随便填)。
微信service下面需包含一个读特征值,uuid为:0xFEC9,内容为6字节MAC地址(ios系统其他软件连上设备之后,微信会去读该特征值,以确定设备MAC地址)。
 
所以只需要建立一个uuid为0xFEE7的service,里面包含0xFEA1、0xFEA2、0xFEC9三个Characteristic并设置好值和属性即可。
 
利用paypal开源的gatt,修改example里的server.go,在脚本里设置好蓝牙的mac和想要的步数,运行即可。
 
  1. package main 
  2. import ( 
  3.     "fmt" 
  4.     "log" 
  5.     "github.com/paypal/gatt" 
  6.     "github.com/paypal/gatt/examples/option" 
  7. func main() { 
  8.   mac := []byte{0x13, 0x37, 0xde, 0xad, 0xbe, 0xef} 
  9.   // steps little endian 
  10.   // 01 (步数)10 27 00(1万步) 0x002710 = 10000 
  11.   // http://iot.weixin.qq.com/wiki/new/index.html?page=4-3 
  12.   steps := []byte{0x01, 0x10, 0x27, 0x00} 
  13.     const ( 
  14.         flagLimitedDiscoverable = 0x01 // LE Limited Discoverable Mode 
  15.         flagGeneralDiscoverable = 0x02 // LE General Discoverable Mode 
  16.         flagLEOnly              = 0x04 // BR/EDR Not Supported. Bit 37 of LMP Feature Mask Definitions (Page 0) 
  17.         flagBothController      = 0x08 // Simultaneous LE and BR/EDR to Same Device Capable (Controller). 
  18.         flagBothHost            = 0x10 // Simultaneous LE and BR/EDR to Same Device Capable (Host). 
  19.     ) 
  20.     d, err :gatt.NewDevice(option.DefaultServerOptions...) 
  21.     if err != nil { 
  22.         log.Fatalf("Failed to open device, err: %s", err) 
  23.     } 
  24.     // Register optional handlers. 
  25.     d.Handle( 
  26.         gatt.CentralConnected(func(c gatt.Central) { fmt.Println("Connect: ", c.ID()) }), 
  27.         gatt.CentralDisconnected(func(c gatt.Central) { fmt.Println("Disconnect: ", c.ID()) }), 
  28.     ) 
  29.     // A mandatory handler for monitoring device state. 
  30.     onStateChanged :func(d gatt.Device, s gatt.State) { 
  31.         fmt.Printf("State: %s\n", s) 
  32.         switch s { 
  33.         case gatt.StatePoweredOn: 
  34.             s0 :gatt.NewService(gatt.UUID16(0xFEE7)) 
  35.             c0 :s0.AddCharacteristic(gatt.UUID16(0xFEA1)) 
  36.             c0.HandleReadFunc( 
  37.                 func(rsp gatt.ResponseWriter, req *gatt.ReadRequest) { 
  38.                     log.Println("Read: 0xFEA1") 
  39.                     rsp.Write(steps) 
  40.                 }) 
  41.             c0.HandleNotifyFunc( 
  42.                 func(r gatt.Request, n gatt.Notifier) { 
  43.                     go func() { 
  44.                         n.Write(steps) 
  45.                         log.Printf("Indicate 0xFEA2") 
  46.                     }() 
  47.                 }) 
  48.             c1 :s0.AddCharacteristic(gatt.UUID16(0xFEA2)) 
  49.             c1.HandleReadFunc( 
  50.                 func(rsp gatt.ResponseWriter, req *gatt.ReadRequest) { 
  51.                     log.Println("Read: 0xFEA2") 
  52.                     rsp.Write(steps) 
  53.                 }) 
  54.             c1.HandleNotifyFunc( 
  55.                 func(r gatt.Request, n gatt.Notifier) { 
  56.                     go func() { 
  57.                         n.Write(steps) 
  58.                         log.Printf("Indicate 0xFEA2") 
  59.                     }() 
  60.                 }) 
  61.             c1.HandleWriteFunc( 
  62.                 func(r gatt.Request, data []byte) (status byte) { 
  63.                     log.Println("Wrote 0xFEA2:", string(data)) 
  64.                     return gatt.StatusSuccess 
  65.                 }) 
  66.             c2 :s0.AddCharacteristic(gatt.UUID16(0xFEC9)) 
  67.             c2.HandleReadFunc( 
  68.                 func(rsp gatt.ResponseWriter, req *gatt.ReadRequest) { 
  69.                     log.Println("Read: 0xFEC9") 
  70.                     rsp.Write(mac) 
  71.                 }) 
  72.             d.AddService(s0) 
  73.             // Advertise device name and service's UUIDs. 
  74.             a := &gatt.AdvPacket{} 
  75.             a.AppendFlags(flagGeneralDiscoverable | flagLEOnly) 
  76.             a.AppendUUIDFit([]gatt.UUID{s0.UUID()}) 
  77.             a.AppendName("salt") 
  78.             // company id and data, MAC Address 
  79.             // https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers 
  80.             a.AppendManufacturerData(0x2333, mac) 
  81.             d.Advertise(a) 
  82.         default: 
  83.         } 
  84.     } 
  85.     d.Init(onStateChanged) 
  86.     select {} 
 
 
另外看到国内有人用nodejs实现了类似的功能。
 
注意node版本需要大于0.12,另外bleno版本需要为0.4.0。
 
 
  1. sudo apt-get install libusb-1.0-0-dev 
  2. npm install bleno@0.4.0 
 
 
 

标签: 微信
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告