赞
踩
在自制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;
}
然后使用arm交叉编译器对其反汇编:
具体命令为:
arm-none-eabi-objdump.exe -b binary -m arm -M force-thumb -D D:/algo.bin
然后就得到了反汇编代码:
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
反汇编代码在转成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; }
这段汇编代码什么意思呢?
对于汇编不了解的同学我就先简单说一下,不展开说ARM汇编指令了。
bkpt指令是断点中断指令,执行该指令可以暂停程序的运行,以上反汇编代码中除去bkpt指令会操作硬件,其他指令都是软件层面的,例如b指令是跳转指令,ldrb(Load Register Byte)字节数据加载指令,cmp比较指令等。所以除去bkpt指令,其他汇编代码其实就是在做类似于CRC校验算法的一个计算过程。
那么现在这段代码的功能结合C代码也就明确了,首先使用bkpt指令暂停了程序的运行,然后使用b指令跳转到了0X1A这个地址处运行,由于内存地址是从0X20000000开始的,也就是跳转到了0X2000001A地址处运行。执行完这个类似于CRC检验算法的这个过程后,就去执行0X20000021开始的地方,也就是真正的FLM中提取出来的下载算法代码了,接下来就是通过DAP对目标程序进行调试了。
完!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。