C166 Arch 中的 CRC16 反转

逆向工程 艾达 拆卸 静态分析 CRC c166
2021-06-21 03:07:51

在此之前,我询问了该算法中使用的一段代码(这里)。现在我对算法的其余部分有点问题。所以我必须详细描述这一点。对不起,如果我浪费你的时间来阅读它。
我在下面展示了一个算法。好像是CRC16算法。

CRC_16_Calculate:                       
                                        
                mov     [-r0], r9
                mov     [-r0], r8
                mov     [-r0], r7
                mov     [-r0], r6
                mov     r9, r12
                mov     r8, r15
                jmpr    cc_UC, loc_29D6
; ---------------------------------------------------------------------------

loc_29A4:                               
                mov     r4, r13
                mov     r5, r14
                add     r13, #1
                addc    r14, #0
                exts    r5, #1
                movb    rl3, [r4]
                movbz   r7, rl3
                movb    rl6, #0

loc_29B4:                               
                mov     r4, r9
                xor     r4, r7
                and     r4, #1
                jmpr    cc_Z, loc_29C8
                mov     r4, r9
                shr     r4, #1
                xor     r4, #0A001h
                mov     r9, r4
                jmpr    cc_UC, loc_29CA
; ---------------------------------------------------------------------------

loc_29C8:                               
                shr     r9, #1

loc_29CA:                               
                shr     r7, #1
                addb    rl6, #1
                cmpb    rl6, #8
                jmpr    cc_C, loc_29B4
                sub     r8, #1

loc_29D6:                               
                cmp     r8, #0
                jmpr    cc_UGT, loc_29A4
                mov     r4, r9
                mov     r6, [r0+]
                mov     r7, [r0+]
                mov     r8, [r0+]
                mov     r9, [r0+]
                rets

正如您在下面看到的,我将其转换为 C++ 代码:

static uint16_t intCrc16(uint8_t* cBuffer)
{
    uint16_t wPreset = 0xFFFF;
    uint16_t iBufLen = 6;
    uint16_t temp = 0;
    while (iBufLen--)
    {
        temp = *cBuffer++;
        for (uint8_t j = 0; j < 8; ++j)
        {
            if ((wPreset ^ temp) & 0x01) wPreset = (wPreset >> 1) ^ 0xA001;
            else wPreset >>= 1;
            temp >>= 1;
        }
    }
    return wPreset;
}

似乎一切都很好,但问题就出现在这里。该函数的主循环运行了 6 次 ( iBufLen) 但输入参数 ( cBuffer) 长度始终为 4 字节。为了证明这一点,我们检查该算法调用的位置。看看下面:

mov     r13, r4
mov     r14, r5
mov     r15, #6
calls   0, CRC_16_Calculate

如您所见,r13andr14是输入参数 ascBufferr15等效于iBufLen. 那么,我的错误是什么?顺便说一下,r4r5是我指出的函数的返回值(这里)。

0个回答
没有发现任何回复~