【问题标题】:Need help reverse engineering a CRC16需要帮助对 CRC16 进行逆向工程
【发布时间】:2014-11-23 13:22:34
【问题描述】:

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

【问题讨论】:

  • 在调试流程方面取得了一些不错的进展。似乎比CRC16容易得多。他们只是添加所有字节。

标签: reverse-engineering network-protocols crc crc16


【解决方案1】:

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

【讨论】:

  • 一直在尝试通过查看 ollydbg 或 ida pro 制作的汇编代码来了解更多信息。但到目前为止没有运气。我不知道使用了哪个字段,也不知道它是 CRC16 还是不同的实现。如果没有装配经验,这是一项艰巨的任务。
【解决方案2】:

我已经设法创建了一个 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);
?>

感谢您的反馈!

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2014-11-27
    • 2015-06-23
    • 2014-04-23
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多