当前位置:   article > 正文

关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA“

0xe00abe00

关于自制CMSIS_DAP离线下载器下载算法的代码说明:“0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA”


在自制CMSIS_DAP离线下载器的时候,利用FLM文件生成下载算法里面,每个下载算法都会有一个32个字节的头部"0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA",除去这32个字节的头部数据才是真正的从flm文件中提取出来的算法,国内都是魔改差不多能用就不再去深究了,所以在国内各大论坛都没有找到相关解答,后来在国外几位开发者的github上提交issues,其中就包括在ARM官方DAPLink的github下提交issues,终于是有两位给了回复,下面说一下这部分代码的作用。

我提交的issues给的相关回复在这里:

这两位作者给的回复都是将这32字节使用arm编译工具链进行了代码反汇编,通过反汇编代码进行分析,具体操作步骤如下:

首先将这32字节用二进制形式写入到一个bin格式文件中:

int main(void)
{
	uint32_t header[] = {0xE00ABE00, 0x062D780D, 0x24084068, 0xD3000040, 0x1E644058, 0x1C49D1FA, 0x2A001E52, 0x4770D1F2};
	int fd;
	fd = open("D:/algo.bin", O_RDWR | O_BINARY | O_CREAT);
	write(fd, header, sizeof(header));
	close(fd);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后使用arm交叉编译器对其反汇编:

具体命令为:

arm-none-eabi-objdump.exe -b binary -m arm -M force-thumb -D D:/algo.bin
  • 1

然后就得到了反汇编代码:

00000000 <.data>:
   0:   be00            bkpt    0x0000
   2:   e00a            b.n     0x1a
   4:   780d            ldrb    r5, [r1, #0]
   6:   062d            lsls    r5, r5, #24
   8:   4068            eors    r0, r5
   a:   2408            movs    r4, #8
   c:   0040            lsls    r0, r0, #1
   e:   d300            bcc.n   0x12
  10:   4058            eors    r0, r3
  12:   1e64            subs    r4, r4, #1
  14:   d1fa            bne.n   0xc
  16:   1c49            adds    r1, r1, #1
  18:   1e52            subs    r2, r2, #1
  1a:   2a00            cmp     r2, #0
  1c:   d1f2            bne.n   0x4
  1e:   4770            bx      lr
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

反汇编代码在转成C语言就是这样:

// r0 = initial value
// r1 = ptr
// r2 = count
// r3 = modifier xor'd into r0
uint32_t foo(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3)
{
    while (r2 != 0)
    {
        uint32_t r5 = *(uint8_t *)r1;
        r5 <<= 24;
        r0 ^= r5;

        uint32_t r4 = 8;
        do {
            uint32_t b = r0 & (1 << 31);
            r0 <<= 1;
            if (b)
            {
                r0 ^= r3;
            }
            r4 -= 1;
        } while (r4 != 0);

        r1 += 1;
        r2 -= 1;
    }

    return r0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

这段汇编代码什么意思呢?

对于汇编不了解的同学我就先简单说一下,不展开说ARM汇编指令了。

bkpt指令是断点中断指令,执行该指令可以暂停程序的运行,以上反汇编代码中除去bkpt指令会操作硬件,其他指令都是软件层面的,例如b指令是跳转指令,ldrb(Load Register Byte)字节数据加载指令,cmp比较指令等。所以除去bkpt指令,其他汇编代码其实就是在做类似于CRC校验算法的一个计算过程。

那么现在这段代码的功能结合C代码也就明确了,首先使用bkpt指令暂停了程序的运行,然后使用b指令跳转到了0X1A这个地址处运行,由于内存地址是从0X20000000开始的,也就是跳转到了0X2000001A地址处运行。执行完这个类似于CRC检验算法的这个过程后,就去执行0X20000021开始的地方,也就是真正的FLM中提取出来的下载算法代码了,接下来就是通过DAP对目标程序进行调试了。


完!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/905410
推荐阅读
相关标签
  

闽ICP备14008679号