Data + CRC- 임베디드 애플리케이션에서 CRC 알고리즘 결정.

StackOverflow https://stackoverflow.com/questions/401231

  •  03-07-2019
  •  | 
  •  

문제

수정 해야하는 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:                       
도움이 되었습니까?

해결책

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입니다.

프롤로그가 무엇을하고 있는지 잘 모르겠습니다 ...

다른 팁

보다 일반적으로 CRC 개념의 일부는 일부 데이터 파일의 CRC를 계산 한 다음 마지막에 CRC를 추가 할 때 CRC가 파일의 길이에 따라 달라지는 값이라는 파일을 얻는다는 것입니다. 내용이 아닙니다. (일부 CRC 알고리즘의 경우 파일 길이에도 의존하지 않습니다.)

따라서 리버스 엔지니어링을하려는 앱이 CRC16을 사용하고 있다고 의심하고 CRC16을 계산하는 프로그램이 있으며 동일한 길이의 여러 샘플이 있으므로 해당 데이터 파일의 CRC16을 계산합니다 (여기에는 포함됩니다. 체크섬). 매번 동일한 체크섬 데이터 (동일한 길이의 파일)와 동일한 체크섬 데이터가 다시 제공되면 동일한 너비와 다항식을 사용하여 CRC 체크섬을 포함해야합니다.

예를 들어, 한 번은 두 개의 상수를 변경하여 CRC32 알고리즘을 변경하여 개발자가 영리하다고 생각한 일부 파일을 리버스 엔지니어링해야했습니다. 체크섬을 검증 한 객체 코드를 찾아서 분해 한 다음 어려운 방법으로 파악할 필요가 없었습니다. 이 간단한 테스트는 그것을 못 박았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top