逆向
听名字高大上的, 不过也得分情况,我之前和朋友去华强北买了一个苹果的无线充电宝,发现它有猫腻的,它充电是断断续续的,也就是说它的通信协议不行的,破解的非常不理想。这种逆向就是普普通通的,把通信数据逆向出来,然后找到表示电量的数据位,进行实时修改然后再发送过去,这个逆向是非常捞的,不过华强北那边很多这种科技,不过它便宜啊,而且,它便宜啊,你说对不对呢?还有那种苹果电池也是一样的,华强北技术电池装好之后,系统会提示电池异常,这里就是协议识别失败了,不过能用也能开机,毕竟你系统要吃电的吧,总不能识别电池不对,关机吧,逆天了嗷。
至于那种网络逆向的,那些网络安全方面,黑客方面的,呜呜呜,不是我们这个方向的,未来的赛博世界第一个就是把我淘汰了捏。我只是一个废物,搞嵌入式的。
用途
这个就不是干正经事情的,通常就是为了抄袭原厂,常见就是电池,镜头,充电宝,外设,家居,从机外设等;华强北专区了属于是,不过,利润高的啊,一般逆向都是行业内的大牛,它们为了卖自己的产品,为了垄断产品,嘎嘎设计协议来防止盗版,一旦识别和握手失败就会直接开机失败或者不识别目标外设。
利好群体
有些相机,3D打印机,彩色打印机,喷漆/喷漆机器等,它们的设备卖的好便宜的,不过,这些都是耐用的东西,其实是很难卖出很多份的。所以,它们就把目标打到了消耗品和从机上面,比如镜头,油墨,打印纸盒,油漆等。
就用打印机举例,它们直接把油墨封装到一个盒子上面,盒子上面有接口,只有设备和接口对齐,然后握手识别成功之后,设备才能正常运行。所以,它们的消耗品就卖的非常非常非常非常贵,真的就是恶心人。所以,如果能够把这个逆向出来,就可以极大的节约成本,不过这个确实是灰色产业来着,咳咳咳。公司还是用正版吧,不过私人和工作室的话,嘻嘻嘻。
协议帧逆向操作流程
首先,要有心理准备,而且要考虑逆向多少东西出来,时间成本是根据要逆向的数据成指数增长的。比如上面的苹果无线充电宝,它握手可能只要不断的发送当前充电宝的电量这一个数据就好了,其他的不用修改。但是手机电池就不一样了,可能还要你返回压力,返回温度,返回电量,返回很多奇奇怪怪的校验位,少一个就会识别为异常。运气好的话,就可以继续工作,运气不好的话,就直接识别设备异常不使用关机了。
就是想办法把数据搞出来。首先,找到电源引脚,找到通信引脚,看看用的是什么通信协议,spi,iic,usb还是啥。然后,把原厂的设备拆了,把对应的引脚引出来使用逻辑分析仪进行处理和分析。接着,把数据使用自己编写的脚本导出来。拿一个mcu,进行对应通信协议代码编写,然后根据双方的握手情况进行逻辑编写和数据发送,此时数据一个都不用改,直接般原厂的,理论上是可以实现通信的。
一般都是做从机的,所以,默认状态都是接受,等待来自主机的通信请求,进行对应的回复和处理。
数据帧类型
我个人喜欢把数据帧分为:开机帧,握手帧,开始帧,属性帧,空闲帧,工作帧,循环帧,请求帧,停止帧。
开机帧:好理解,其实就是一些电平的拉高拉低,和原厂一样就好了。
握手帧:就是开机帧之后,第一次的较量了,他会判断你是不是它公司的设备,不一定有的。
开始帧:握手成功之后,就是开始了,改变通信速度,发送标志位,发送请求等都有可能,不一定有的。
属性帧:为了确认你真的是我家设备,肯定会问序列号,问固件版本,生产日期,厂商、当前设备的设置的属性(比如苹果电池,pg00231234xxxxxxxx,pg是工厂 0023是电量最小值 1234是电量最大值。后续就会发送对应数据范围内数据来告诉手机,手机就可以根据它发送过来的数据知道当前电量了,电量不一定就是0-100啊,0-100只是一个百分比罢了。)
空闲帧:其实我觉得叫心跳包更好点,不是吗?应该都有的。
工作帧:就是主机让从机干某些工作来着,比如强行关闭电池阀门。应该都有的。
循环帧:就是定期发送当前从机属性给主机,方便主机去实时监控从机,一般是有实时性的数据才有意义,这个大概有的,比如可以实时传输当前电量。应该都有的。
请求帧:就是主机来询问从机状态,这些状态可能是不常变化的,也可以是经常变化的,反正就是我没事还不能来看看你吗?应该都有的。
停止帧:就是关机,待机,结束通信,有始有终嘛,应该都有的,有时可能还有结束握手也就是关机帧呢,有点tcp的味道了。
然后就是根据对应的数据帧,进行数据分析了。比如电量吧,看看循环帧中那些数据位随着电量改变了,说明它就是我们要找的数据位,进行对应的操作和编写,然后在少到mcu中去测试一下结果,看看主机是什么反应。就是这样的枯燥无味,但是有利可图。
note:
1.千万千万千万千万要考虑逆向数据的数量,比如循环帧随着电量改变的数据位怎么可能只有几位,肯定是有好好多位一起变的,因为电池电量改变了可不简单啊,涉及到很多材料学、电路设计和走线等,它的很多物理属性都会变化的。它的电压是会变化的,它的电流也会变化,电阻,电容啥的都会变,这个一下子就变了很多数据,分析非常困难。
2.数据不一定就是数据,比如pg00231234xxxxxxxx,0023你怎么知道我没加密呢?1234你怎么知道就是这个电量呢?我可以使用挡位设计,我可以对数据进行拆分等诸多加密操作。挡位 00是一个挡位 23是一个模式;也可以12是一个挡位 34是一个计算公式的参数;说不定我这个数据的高八位放在前两个字节中,低八位放到后面两个字节中呢,然后中间穿插0101,穿插校验和来迷惑?这样得到的逆向数据可以说是一点用都没有的垃圾数据罢了。这个难度就是大大增加了,不过对应通信的可靠性是真的增加了呢。
感悟
其实说白了,神魔之争,魔高一尺道高一丈,只要有利益,就会引来其他人的贪婪,说白了,就是一群资本家的丑恶嘴脸罢了。不过是违法的,怎么说呢,其实从中,也能学到一些东西。如果我开发了一个程序、做了一个很不错的产品,但是别人盗版怎么办,这个时候,我就要设计一个非常非常非常非常非常非常非常非常阴间的通信协议来尽可能的保护我的产品权益,光是靠法律,别人和你好着,等你告赢了,别人早就盈利了。
首先,学习逆向协议,就知道一个主从通信的逻辑,设计一个属于自己的通信协议,注意了这里不是那些外设,而是软件层面的通信协议,可以清楚的理解和知道工作流程和行为状态,可以知道如何增强通信可靠和信号数据安全,这些其实都是纸老虎来着。世上无难事,只怕有心人。别人想要逆向你的协议,被破解只是迟早的事情罢了。不过是利益、时间、安全、成本等权衡和较量罢了。
如果你看我的博客,然后做了某些产业被抓了。。。咳咳咳,到时候别把我供出来就好了,呜呜呜。
对了,还有那种逆向代码的大佬,直接看bin来操作的,看汇编的,不得不说,你们是才是真正的逆向大佬,你们能把源码搞出来的话,确实牛逼的,不过时间成本应该不用我说,难度也是非常吓人。代码加密是常态,引导丢失,程序flash自我删除,防拆处理,BKP防入侵,密钥找不到也是正常的,莫名其妙开辟的数据和空间,恶心人的校验和,锁死芯片本身序列号等都是基操了,而我只是一个小废物捏,呜呜呜。