2017-03-05 79 views
1

我目前正在對具有串行協議的設備進行反向工程。從ASCII字符串反向工程校驗和?

我主要在那裏,但我無法弄清楚字符串的一部分。

對於機器返回的每個字符串,它總是有!XXXX,其中XXXX在十六進制值中變化。從我能找到的這可能是CRC16?

但是我無法弄清楚如何自己計算CRC來確認它是正確的。

下面是3個響應的示例。

U;0;!1F1B 
U;1;!0E92 
U;2;!3C09 

該數字可以用一系列ASCII字符替換。例如,這是我將經常使用的內容。

U;RYAN W;!FF0A 

如何計算校驗和的生成方式?

回答

2

您需要更多不同長度的示例。

使用reveng,您需要反轉CRC字節,例如, 1b1f,而不是1f1b。看起來CRC是根據分號之間的內容來計算的。隨着reveng,我得到多項式是0x1021,這是一個非常常見的16位多項式,並且反映了CRC。

% reveng -w 16 -s 301b1f 31920e 32093c 5259414e20570aff 
width=16 poly=0x1021 init=0x1554 refin=true refout=true xorout=0x07f0 check=0xfa7e name=(none) 
width=16 poly=0x1021 init=0xe54b refin=true refout=true xorout=0xffff check=0xfa7e name=(none) 

隨着越來越多的例子,你將能夠確定CRC寄存器的初始值,什麼結果被異或運算用。

2

有可進行反向工程CRC計算工具:CRC復仇http://reveng.sourceforge.net/

你可以給它輸入和校驗的十六進制字符串,並要求它什麼CRC算法的輸入相匹配。下面是前三個串輸入(假設消息U; 0;,U; 1;和U; 2):

$ reveng -w 16 -s 553b303b1f1b 553b313b0e92 553b323b3c09 
width=16 poly=0xa097 init=0x63bc refin=false refout=false xorout=0x0000 check=0x6327 residue=0x0000 name=(none) 

校驗跟隨輸入消息。不幸的是,如果我嘗試RYAN W消息,這不起作用。您可能想要嘗試編輯輸入消息以查看字符串的哪一部分正被輸入到CRC中。

+0

謝謝。 我發現RYAN W它似乎在U斷線;當做一些實驗時。 我曾嘗試reveng,但不知道如何使用它。感謝您向我展示如何。 –