2014-09-29 114 views
0

我正在尝试连接到Safecom TA-810(徽章/注册系统),以自动计算员工每天工作多长时间的过程。目前,这是通过:需要帮助反向工程CRC16

  1. 数据拉入正式申请
  2. 打印的列表中的所有“注册”
  3. 手动输入从印刷列表中的值到我们的人力资源应用程序

这是一项可能需要几个小时才能看到自动化的工作。到目前为止,官方技术支持一直令人失望,拒绝分享任何细节。

使用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之前,似乎是相关的。

original application code

任何帮助将非常感激。

编辑:使用ollydbg调试应用程序取得了一些成功。在下面的屏幕截图中,CRC出现在选定行的寄存器(反转)EDX中。

crc showing up

+0

一直在调试流程方面取得了一些进展。似乎比CRC16容易得多。他们只是添加所有字节。 – MythJuha 2014-09-30 18:20:24

回答

0

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

感谢您的反馈!

0

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

+0

一直试图通过查看由ollydbg或ida pro制作的汇编代码来了解更多信息。但目前为止没有运气。我不知道使用哪个字段,甚至是CRC16还是不同的实现。在没有组装经验的情况下,这是一项艰巨的任务。 – MythJuha 2014-09-30 09:48:43