经过大量发送挑战并记录响应后,我“破坏”了汽车防盗器中的“加密”……这样做的原因是我可以在项目车中使用发动机和变速箱,同时保持 HS canbus - 用于 ECM 到 TCM 的通信,但移除 MS canbus - 以及与之相关的所有模块......包括处理库存车中防盗功能的车身控制模块。
所以,“加密” - 它基本上是一个带有一堆修饰符的替换密码。格式为 32 位质询和 32 位响应 - 格式化为 4 个字节和 4 个字节。
我目前已经使用 C 语言(对于 arduino)使用响应数组和一堆逻辑对其进行了编码,并且它正在工作 - 但是必须有更好的方法......对吗?
我是机械师,不是程序员,绝对不是数学家......我只是没有知识(或 IQ XD)从我目前所做的事情中跳出来,编写一个功能性数学模型/algorithm 做同样的工作。
作为修饰符逻辑的几个示例,例如如果挑战字节 2 >= 0xEC 然后将响应增加 1,或者如果挑战字节 3 的第 2 位 >= 0x14 然后对适当的响应执行其他操作等。
但老实说……我很想将我的 600 行代码减少到 50 行!
我可以根据需要发布尽可能多的 C/R 对,以在此处获得一些帮助并发布逻辑流程图。
现在只希望有一个白骑士!
编辑添加编码块和其他信息...
void CalcResp()
//Calculate response
{
uint32_t ResponsePreXOR = 0x00000000;
uint32_t ResponsePostXOR;
uint8_t ChalByte[4];
uint8_t RawRespByte[4];
uint8_t XORRespByte[4];
CAN_FRAME ChalFrame;
CAN_FRAME RespFrame;
Can0.watchFor(0x00040020);
if (Can0.available() > 0)
{
Can0.read(ChalFrame);
// Split the Challenge into raw bytes
ChalByte[0] = ChalFrame.data.byte[0];
ChalByte[1] = ChalFrame.data.byte[1];
ChalByte[2] = ChalFrame.data.byte[2];
ChalByte[3] = ChalFrame.data.byte[3];
// if Challenge Byte 3 bit 1 is set
if (ChalByte[3]&0x02)
{
if (ChalByte[3]>=0x16)
{
RawRespByte[3] = TableB2A[(ChalByte[2]+1)&0xFF];
}
else
{
RawRespByte[3] = TableB2A[ChalByte[2]];
}
RawRespByte[2] = TableB3[ChalByte[3]];
RawRespByte[1] = TableB1A[ChalByte[1]];
if (ChalByte[1]>=0xEC)
{
RawRespByte[0] = TableB0A[(ChalByte[0]+1)&0xFF];
}
else
{
RawRespByte[0] = TableB0A[ChalByte[0]];
}
}
// if Challenge Byte 3 bit 1 is not set
else
// Build Response Byte 0
{;
RawRespByte[3] = TableB3[ChalByte[3]];
// Build Response Byte 2
if (RawRespByte[3]>=0x14)
{
RawRespByte[2] = TableB2N[(ChalByte[2]+1)&0xFF];
}
else
{
RawRespByte[2] = TableB2N[ChalByte[2]];
}
// if Challenge byte 1 is above or equal to 0xEC
// Build Response Byte 1
if (ChalByte[1]>=0xEC)
{
if (ChalByte[0]&0x0F==0x0F)
{
RawRespByte[1] = TableB016s[(ChalByte[0]/16)];
}
else
{
RawRespByte[1] = TableB0N[(ChalByte[0]+1)&0xFF];
}
if (ChalByte[1]<0xEC)
{
RawRespByte[1] = TableB0N[ChalByte[0]];
}
//Build Response Byte 0
RawRespByte[0] = TableB1N[ChalByte[1]];
}
//Construct the response out of the response bytes
ResponsePreXOR = uint32_t (RawRespByte[0])<<24;
ResponsePreXOR += uint32_t (RawRespByte[1])<<16;
ResponsePreXOR += uint32_t (RawRespByte[2])<<8;
ResponsePreXOR += uint32_t (RawRespByte[3]);
汽车的 ECM 是西门子 SID 203 - 对此的防盗算法尚未被破坏,我不认为......没有人为它生产模拟器。
我认为同步是来自 ECM 的这个代码片段
u8
data_cs[8]={0xEC,0x68,0x27,0x65,0xEC,0x8E,0x14,0xE6};