0

我正在尝试连接到 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 出现

4

2 回答 2

0

看看CRC RevEng。如果你能正确识别出CRC正在操作的数据和CRC的位置,你应该能够确定CRC参数。如果是CRC。

于 2014-09-29T21:52:52.540 回答
0

我设法通过使用 OllyDbg 调试应用程序来创建一个执行 CRC 计算的 php 脚本。

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);
?>

感谢您的反馈!

于 2014-10-01T07:19:48.583 回答