如何在 C 中创建算法......(或 C# 或 C++,基本上是“一种编程语言”)

逆向工程 C++ C 加密
2021-06-20 02:24:36

经过大量发送挑战并记录响应后,我“破坏”了汽车防盗器中的“加密”……这样做的原因是我可以在项目车中使用发动机和变速箱,同时保持 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};
0个回答
没有发现任何回复~