0%

逆向

听名字高大上的, 不过也得分情况,我之前和朋友去华强北买了一个苹果的无线充电宝,发现它有猫腻的,它充电是断断续续的,也就是说它的通信协议不行的,破解的非常不理想。这种逆向就是普普通通的,把通信数据逆向出来,然后找到表示电量的数据位,进行实时修改然后再发送过去,这个逆向是非常捞的,不过华强北那边很多这种科技,不过它便宜啊,而且,它便宜啊,你说对不对呢?还有那种苹果电池也是一样的,华强北技术电池装好之后,系统会提示电池异常,这里就是协议识别失败了,不过能用也能开机,毕竟你系统要吃电的吧,总不能识别电池不对,关机吧,逆天了嗷。

至于那种网络逆向的,那些网络安全方面,黑客方面的,呜呜呜,不是我们这个方向的,未来的赛博世界第一个就是把我淘汰了捏。我只是一个废物,搞嵌入式的。

用途

这个就不是干正经事情的,通常就是为了抄袭原厂,常见就是电池,镜头,充电宝,外设,家居,从机外设等;华强北专区了属于是,不过,利润高的啊,一般逆向都是行业内的大牛,它们为了卖自己的产品,为了垄断产品,嘎嘎设计协议来防止盗版,一旦识别和握手失败就会直接开机失败或者不识别目标外设。

利好群体

有些相机,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防入侵,密钥找不到也是正常的,莫名其妙开辟的数据和空间,恶心人的校验和,锁死芯片本身序列号等都是基操了,而我只是一个小废物捏,呜呜呜。

GPU
GPU管线
GPU编程
OpenGL
DirectX
两者区别和优劣
嵌入式中OpenGL
移动设备中OpenGL ES
总结

ROS

软路由

现在的路由器基本都是无线路由器了,集成wifi和网线于一体。

软路由器其实是在电脑主机的基础上配合软件组合成的路由解决方案,路由的参数通过软件控制和设置。简单的说就是在电脑的硬件基础上加上路由系统来实现路由器的所有功能。硬路由就是我们普遍使用的路由器,由厂家提供整体的解决方案,包括路由器的硬件和软件。

反正软路由就是可以使用第三方软件呢。

路由器VPN

很多时候,连上wifi了,又打开梯子是吧,这个过程有点繁琐,不舒服是吧,这个没得说的,麻烦呢。所以,从路由器着手,就可以实现连上即可vpn。

第三方固件

我的路由器刚好就是TP-Link的,是ok的,直接按照流程,安装clash即可

TP-Link路由器Clash翻墙完全指南 | Clash中文教程网 (clashv2ray.com)

openwrt

现在的路由器基本都是这个了,其实就是像配置我们的windows的静态IP一样,也是配置一个节点的一样的操作的。这个难度就有点高了。

https://zhuanlan.zhihu.com/p/362389529

这个一般是开发人员来搞得,甚至可以编写脚本实现,需要vpn访问特殊ip的时候才使用。

总结

这个是一个好技巧,一劳永逸,注意了。出去了别乱说话和干事哦。

端口port

网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口,比如,ADSL Modem、集线器交换机路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等;二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。计算机“端口” 是英文port的义译,可以认为是计算机与外界通讯交流的出口。

常见端口

常见就是http80,https443,ssh22,FPT21,SSL465.

邮箱发送25或者587,使用SSL加密465

邮箱接收110,SSL加密995.

更多可以查考下面的博客

【计算机网络】端口详解【概念、作用、分类、常见端口】_计算机网络端口的作用-CSDN博客

一般用到的是1到65535,其中0不使用。 1-1023为知名端口(Well-Known Ports)。 1024-49151为用户端口(Registered ports)。 49152-65535称为动态端口(Dynamic Ports)。

端口的实际意义

端口号是用来标识同一台计算机上运行的不同网络应用或服务的标识符。IP地址标识的是一台计算机(或者说一个网络接口),而端口号则标识的是该计算机上具体的应用程序或服务。

当你有一个应用使用了12345端口去访问网络时,回传的数据确实会通过这个端口号返回到你的应用。更具体地说,操作系统会根据IP地址找到相应的计算机,然后根据端口号将数据交给在这个端口上监听的应用程序。

总结一下:

  1. IP地址:定位到具体的设备。
  2. 端口号:定位到设备上运行的具体应用程序或服务。

当你在某个端口(如12345)上启动一个应用程序时,操作系统会确保网络数据包中带有该端口号的数据能够正确传递到这个应用程序中。

修改端口

这个一般分为编程和应用,编程期间,就是可以选择没用到的端口或者多路复用来选择端口,这个是开发层面的了。

应用层,一般就是开应用怎么处理和设计,windows也是可以选择静态网络ip和端口。举个例子咯,我们使用git访问github,总是访问不了,然后显示443错误,这个就是https连接超时了,解决办法,把本地vpn设为静态的本地ip和端口,然后修改git的https也为本地地址和ip

1
2
git config --global http.proxy 127.0.0.1:<你的端口号>
git config --global https.proxy 127.0.0.1:<你的端口号>

LCD

这个不论是MCU还是linux软件开发,都是一个非常常用的输出功能,还有就是LCD+电阻组合成触摸显示屏,LCD的原本名称是液晶显示屏,所以博客就说显示功能了。

LCD显示

不论是MCU还是linux,都是调用厂商提供好的lcd代码进行二次开发,也是把项目添加进去,mcu就把源码加入项目编译即可。linux就是添加lcd设备,写好驱动和设备号,等待上层应用调用,这个调用一般都是直接内存映射过去的,这样可以减少毛刺和传输速度慢的问题。

LCD得到数据之后,显示是要一段时间的。所以,主控在发送数据之前,得确保LCD出于空闲状态,此时就会去查询状态,空闲之后才发送数据,lcd接收数据就开始显示,显示完毕之后再回复设置为空闲状态,进行下一轮。

阻塞问题

根据上面这个流程,就可以知道传输是一个问题,但是等待LCD空闲,这个过程导致主控阻塞等待这也是一个重要因素,为了解决这个问题,就可以利用CPU里面得概念了,就是流水线。

双缓冲

问题就出在,显示的过程中,是无法发送数据的,如果,有两个缓冲区是不是就可以一个用于显示一个用于缓冲呢,这样再显示的过程中,就可以立刻发送空闲,让主控去发数据过来,从而节省阻塞时间。

为什么这样节约时间呢?

原因是,主从设备之间处理速度,一般都是比不过设备自身内部处理速度的。主从通信是要握手,是要双方都就绪才是有效的,而设备内部切换和操作就是瞬间的,就是一个顺手的事情。对于LCD来说就是一个切换指针指向的操作,一下子就可以执行完毕了,但是传输过程是需要确认双方状态的,所以,这个过程才是真正卡脖子的过程。

三缓存

就是在双缓冲的基础上面,再加一个缓冲区,进步增加效果和帧率,三缓存就真的真的够用了,再多就有些多余了,这就像电脑玩游戏一样,cpu到了8核之后,继续添加核心基本没有提升的,就是到了瓶颈了。

总结

缓冲区就是利用类似流水线的思想,把本应当下一帧做的事情,在当前时刻进行并行处理实现对下一个帧的部分事务,让下一帧可以更加快速高效执行,这其实是一个非常非常好的设计思路。