2014-09-29 111 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