5

修正する必要のある16ビットチェックサムで保護されたデータセットがあります。チェックサムの場所はわかっていますが、それらが計算される正確な領域と、それらを計算するために使用される正確なアルゴリズムはわかっていません。16ビット、LSBファースト。ある種の16ビットCRCだと思いますが、実際にチェックサムを計算しているコードを見つけることができませんでした。

例:

00    4E00FFFF26EC14091E00A01830393630  
10    30313131313030393030363030313030  
20    30303131313030393030363030313030  
30    30303131313030393030363030313030  
40    3030FFFF225E363436304D313037**0CE0**  
50    64000000000000008080808080800000  
60    00000000**BE6E**FC01E001EB0013010500  

チェックサムは4Eと64に格納されます。各データセクションの最初の単語のオフセットから計算されるのか、それ以降に計算されるのか、それとも全範囲で計算されるのかわかりません。私は多くの一般的なCRCアルゴリズムと多項式を試しましたが運がありませんでした。このアプリケーションで利用できるリファレンスや仕様はありません。

比較のために、CRCが異なる別のデータセクションを次に示します。

00    4E00FFFF26C014091600A01030393132  
10    30313131313030393030313230313030  
20    30303131313030393030313230313030  
30    30303131313030393030313230313030  
40    3030FFFF225E343231324F313044**8348**  
50    64000000000000008080808080800000  
60    00000000**72F8**E001EB00130105000E01  

私の質問は、誰かがアルゴリズムを識別できるかということです。データとCRCからCRC多項式と他の要因を計算する方法はありますか?

ありがとう!

編集:

一般的なCRC16多項式0xA001の分解を検索すると、この関数が明らかになりました。

34F86 ; =============== S U B R O U T I N E =======================================
34F86
34F86
34F86 Possible_Checksum:                    ; CODE XREF: MEM_EXT_4:00034FEEP
34F86                                         ; MEM_EXT_4:0003503AP ...
34F86                 mov     [-r0], r9       ; Move Word
34F88                 mov     r4, r12         ; Move Word
34F8A                 mov     r5, r13         ; Move Word
34F8C                 shr     r4, #14         ; Shift Right
34F8E                 shl     r5, #2          ; Shift Left
34F90                 or      r5, r4          ; Logical OR
34F92                 mov     r4, r12         ; Move Word
34F94                 mov     DPP0, r5        ; Move Word
34F98                 and     r4, #3FFFh      ; Logical AND
34F9C                 movb    rl3, [r4]       ; Move Byte
34F9E                 mov     DPP0, #4        ; Move Word
34FA2                 movbz   r9, rl3         ; Move Byte Zero Extend
34FA4                 mov     r15, #0         ; Move Word
34FA6
34FA6 loc_34FA6:                              ; CODE XREF: MEM_EXT_4:00034FC8j
34FA6                 mov     r4, [r14]       ; Move Word
34FA8                 xor     r4, r9          ; Logical Exclusive OR
34FAA                 and     r4, #1          ; Logical AND
34FAC                 jmpr    cc_Z, loc_34FBA ; Relative Conditional Jump
34FAE                 mov     r4, [r14]       ; Move Word
34FB0                 shr     r4, #1          ; Shift Right
34FB2                 xor     r4, #0A001h     ; Logical Exclusive OR
34FB6                 mov     [r14], r4       ; Move Word
34FB8                 jmpr    cc_UC, loc_34FC0 ; Relative Conditional Jump
34FBA ; ---------------------------------------------------------------------------
34FBA
34FBA loc_34FBA:                              ; CODE XREF: MEM_EXT_4:00034FACj
34FBA                 mov     r4, [r14]       ; Move Word
34FBC                 shr     r4, #1          ; Shift Right
34FBE                 mov     [r14], r4       ; Move Word
34FC0
34FC0 loc_34FC0:                       
4

2 に答える 2

3

loc_34FA6 から投稿したコードは基本的に次のとおりです。

unsigned short
crc16_update(unsigned short crc, unsigned char nextByte)
{
    crc ^= nextByte;

    for (int i = 0; i < 8; ++i) {
        if (crc & 1)
            crc = (crc >> 1) ^ 0xA001;
        else
            crc = (crc >> 1);
    }

    return crc;
}

これは 0xA001 多項式の CRC-16 です。CRC-16 が適用されるデータの範囲を見つけたら、CRC を 0xFFFF に初期化し、シーケンス内の各バイトに対してこの関数を呼び出します。戻り値を保存し、次回に渡します。最後に返される値は、最終的な CRC です。

プロローグが何をしているのかわかりません...

于 2008-12-30T21:46:03.860 に答える
1

より一般的には、CRC の概念の一部は、あるデータ ファイルの CRC を計算し、最後に CRC を追加すると、CRC がファイルの長さに依存する値であるファイルを取得することですが、内容ではありません。(一部の CRC アルゴリズムでは、ファイルの長さに依存しません。)

したがって、リバース エンジニアリングしようとしているアプリがたとえば CRC16 を使用していると思われ、CRC16 を計算するプログラムがあり、同じ長さのサンプルが複数ある場合は、それらのデータ ファイル (以下を含む) の CRC16 を計算するだけです。チェックサム)。毎回同じチェックサム データが返される場合 (同じ長さのファイルの場合)、同じ幅と多項式を使用する CRC チェックサムが含まれている必要があります。

たとえば、2 つの定数を変更して CRC32 アルゴリズムを変更することで、開発者が賢いと思ったファイルをリバース エンジニアリングしなければならなかったことがあります。チェックサムを検証するオブジェクト コードを見つけて逆アセンブルし、難しい方法で理解する必要はありませんでした。この簡単なテストはそれを釘付けにしました。

于 2009-01-07T19:23:22.137 に答える