btlejack中的access_address的获取

原理

其实就是利用上一篇中的那个机制来实现对BLE任意数据的抓取然后不断的扫描非广播
信道,在每个信道接受固定次数的数据,然后提取地址查看是否正确。因为任意抓取,
地址有很多干扰啊。
其步骤是
	1.上位机发送“获取access_address”的命令。
	2.启动radio接受,并在中断中设置需要操作的动作。
下面是radio中断里面提取地址的主要代码,其实就是扫描信道,然后对地址进行
合法性检验。

在这里插入图片描述

btlejack原始C++
case SNIFF_AA:
            {
              g_sniffer.pkt_count++;

              /* Dewhiten bytes 4 and 5. */
              candidate_pdu[0] = rx_buffer[4];
              candidate_pdu[1] = rx_buffer[5];
              dewhiten(candidate_pdu, 2, g_sniffer.channel);
              if (((candidate_pdu[0] & 0xF3) == 1) && (candidate_pdu[1] == 0))
              {
                  /* Check AA */
                  aa = rx_buffer[0] | rx_buffer[1]<<8 | rx_buffer[2]<<16 | rx_buffer[3]<<24;
                  if (seen_aa(aa) > 1) {
                      /* We may have a candidate AA. */
                      pLink->notifyAccessAddress(aa, g_sniffer.channel, NRF_RADIO->RSSISAMPLE);
                  }
              }
              else
              {
                /* Shit right by one bit once and twice */
                for (j=0; j<2; j++)
                {
                  /* Shift right. */
                  for (i=0; i<9; i++)
                    //数据传输先从低位开始,所以先处理低位,右移就是保留高位
                    rx_buffer[i] = rx_buffer[i]>>1 | ((rx_buffer[i+1]&0x01) << 7);

                  /* Dewhiten candidate PDU. */
                  candidate_pdu[0] = rx_buffer[4];
                  candidate_pdu[1] = rx_buffer[5];
                  dewhiten(candidate_pdu, 2, g_sniffer.channel);

                  /* Check if PDU is the one expected. */
                  if (((candidate_pdu[0] & 0xF3) == 1) && (candidate_pdu[1] == 0))
                  {
                      aa = rx_buffer[0] | rx_buffer[1]<<8 | rx_buffer[2]<<16 | rx_buffer[3]<<24;
                      if (seen_aa(aa) > 1) {
                          /* We may have a candidate AA. */
                          pLink->notifyAccessAddress(aa, g_sniffer.channel, NRF_RADIO->RSSISAMPLE);
                      }
                  }
                }
              }
              if (g_sniffer.pkt_count > 100)
              {
                  g_sniffer.channel = (g_sniffer.channel + 1)%37;
                  radio_set_sniff(g_sniffer.channel);
                  g_sniffer.pkt_count = 0;
              }

              /* Continue to receive. */
              NRF_RADIO->TASKS_START = 1;
            }
            break;
适配到keil中的,没大改动 c。主要是把 每个信道的接受次数给改一下。
#if 1			//SNIFF_AA
					case SNIFF_AA:{	

              g_sniffer.pkt_count++;
              // 白化第四位第五位, Dewhiten bytes 4 and 5. 
              candidate_pdu[0] = rx_buffer[4];
              candidate_pdu[1] = rx_buffer[5];
              dewhiten(candidate_pdu, 2, g_sniffer.channel);
							
              if (((candidate_pdu[0] & 0xF3) == 1) && (candidate_pdu[1] == 0))
							{// Check AA 
                  aa = rx_buffer[0] | rx_buffer[1]<<8 | rx_buffer[2]<<16 | rx_buffer[3]<<24;
								
									if (is_valid_aa(aa)) {
										printf("第%d轮,正确的地址 %x\r\n",sum,aa);
                      //We may have a candidate AA. 
                    //Link_notifyAccessAddress(aa, g_sniffer.channel, NRF_RADIO->RSSISAMPLE);
										}   
							}else{
									//Shit right by one bit once and twice
									//这是因为地址可能是55开头的,所以需要移动两位,是两位
									for (j=0; j<2; j++){
											// Shift right.
											for (i=0; i<9; i++)
													rx_buffer[i] = rx_buffer[i]>>1 | ((rx_buffer[i+1]&0x01) << 7);

											// Dewhiten candidate PDU. 
											candidate_pdu[0] = rx_buffer[4];
											candidate_pdu[1] = rx_buffer[5];
											dewhiten(candidate_pdu, 2, g_sniffer.channel);

											// Check if PDU is the one expected.
											if (((candidate_pdu[0] & 0xF3) == 1) && (candidate_pdu[1] == 0)) {
													aa = rx_buffer[0] | rx_buffer[1]<<8 | rx_buffer[2]<<16 | rx_buffer[3]<<24;
													if (is_valid_aa(aa)) {
														// We may have a candidate AA. 
															printf("第%d轮,正确的地址 %x\r\n",sum,aa);
														//Link_notifyAccessAddress(aa, g_sniffer.channel, NRF_RADIO->RSSISAMPLE);
													}
											}
									}
								}
								if(g_sniffer.pkt_count >10){
											sum++;
											g_sniffer.channel = (g_sniffer.channel + 1)%37;
											radio_set_sniff(g_sniffer.channel);
											g_sniffer.pkt_count = 0;
								}
									// Continue to receive. 
										NRF_RADIO->TASKS_START = 1;
							}break;							
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值