繁体   English   中英

需要帮助对CRC16进行逆向工程

[英]Need help reverse engineering a CRC16

我正在尝试连接到Safecom TA-810(徽章/注册系统),以自动化计算员工每天工作多长时间的过程。 目前,这是通过以下方式完成的:

  1. 将数据拉入官方应用程序
  2. 打印所有“注册”列表
  3. 从打印清单中手动输入值到我们的HR应用程序中

这项工作可能要花费几个小时,我们希望看到它是自动化的。 到目前为止,官方技术支持令人失望,并拒绝透露任何细节。

使用Wireshark,我一直在捕获UDP传输,并且在理解协议的构建方面非常成功。 我只对我认为是CRC字段有疑问。 我不知道它是如何计算的(CRC类型和参数)以及使用哪些字段...

这是消息头的样子:

D0 07 71 BC BE 3B 00 00

D0 07 - Message type
71 BC - This i believe is the CRC
BE 3B - Some kind of session identifier. Stays the same for every message after the initial message (initial message has '00 00' as value)
00 00 - Message number. '01 00', '02 00', '03 00'

一些例子:

Header only examples
E8 03 17 FC 00 00 00 00 -> initial request (#0, no session nr)
D0 07 71 BC BE 3B 00 00 -> Initial response (#0, device sends a session nr)
4C 04 EF BF BE 3B 06 00 -> Message #6, still using the same session # as the initial response

Larger example, which has data
0B 00 07 E1 BE 3B 01 00 7E 45 78 74 65 6E 64 46 6D 74

我也一直试图通过从原始应用程序中读取反汇编的代码来解决这个问题。 下面的屏幕快照发生在socket.sendto之前,并且似乎相关。

原始应用程序代码

任何帮助将不胜感激。

编辑 :使用ollydbg调试应用程序取得了一些成功。 CRC出现在以下屏幕快照中所选行的EDX寄存器中(反向)。

crc出现

看一下CRC RevEng 如果可以正确识别CRC操作的数据和CRC的位置,则应该能够确定CRC参数。 如果是CRC。

我设法创建了一个PHP脚本,通过使用OllyDbg调试应用程序来进行CRC计算。

CRC是通过每2个字节(每个短)相加得出的。 如果结果大于空头,则将“最高有效空头”添加到“最低有效空头”,直到结果适合空头。 最后,CRC(短)被反转。

为了完整性,我将添加我的php脚本:

<?php
function CompareHash($telegram)
{
  $telegram = str_replace(" ", "", $telegram);
  $telegram_crc = substr($telegram, 4, 4);
  $telegram = str_replace($telegram_crc, "0000", $telegram);

  echo "Telegram: ", $telegram, ', Crc: ', $telegram_crc, ' (', hexdec($telegram_crc), ')<br />';

  $crc = 0; 
  $i = 0;

  while ($i < strlen($telegram)) 
  {
    $short = substr($telegram, $i, 4);

    if (strlen($short) < 4) $short = $short . '00';

    $crc += hexdec($short);
    $i += 4;
  }

  echo "Crc: ", $crc, ', inverse: ', ~$crc;

  // Region "truncate CRC to Int16"
  while($crc > hexdec('FFFF'))
  {
    $short = $crc & hexdec ('FFFF');

    // Region "unsigned shift right by 16 bits"
    $crc = $crc >> 16;
    $crc = $crc & hexdec ('FFFF');
    // End region

    $crc =  $short + $crc;
  }
  // End region

  // Region "invert Int16"
  $crc = ~$crc;
  $crc = $crc & hexdec ('FFFF');
  // End region

  echo ', shifted ', $crc;

  if (hexdec($telegram_crc) == $crc)
  {
    echo "<br />MATCH!!! <br />";
  }
  else
  {
    echo "<br />failed .... <br />";
  }
}

$s1_full = "E8 03 17 FC 00 00 00 00";
$s2_full = "D0 07 71 BC BE 3B 00 00";
$s3_full = "D0 07 4E D4 E1 23 00 00";
$s4_full = "D0 07 35 32 BE 3B 07 00   7E 44 65 76 69 63 65  4E    61 6D 65 3D 54 41 38 31 30 00";
$s5_full = "0B 00 39 6C BE 3B 05 00   7E 52 46 43 61 72 64  4F    6E";

CompareHash($s1_full);
CompareHash($s2_full);
CompareHash($s3_full);
CompareHash($s4_full);
CompareHash($s5_full);
?>

感谢您的反馈!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM