中级会员
- 积分
- 354
- 金钱
- 354
- 注册时间
- 2018-9-14
- 在线时间
- 157 小时
|
楼主 |
发表于 2020-11-23 14:06:38
|
显示全部楼层
本帖最后由 sppz 于 2020-12-19 22:40 编辑
被romcode所加载的image必须有一个header
我们可以直接用链接脚本生成这个头,但需要改动验证相关的字节,这里我们需要改checksum
链接脚本如下- MEMORY
- {
- _ram(rwx) : ORIGIN = 0x2ffc2400, LENGTH = 252928
- }
- ENTRY(px_entry)
- SECTIONS
- {
- . = ALIGN(4);
- /* stm32 header */
- .stm32 :
- {
- LONG(0x324D5453); /* magic number "STM"32 */
- QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); /* image signature */
- LONG(0); /* image checksum */
- LONG(0x00010000); /* header version */
- LONG(SIZEOF(.ARM.exidx) + SIZEOF(.ARM.extab) + SIZEOF(.init_array) + SIZEOF(.rodata) + SIZEOF(.bss) + SIZEOF(.data) + SIZEOF(.text)); /* image length */
- LONG(px_entry); /* image entry */
- LONG(0); /* reserved */
- LONG(0x2ffc2500); /* load address of image */
- LONG(0); /* reserved */
- LONG(0); /* image version */
- LONG(0x00000001); /* option flags */
- LONG(0x00000001); /* ECDSA algorithm */
- QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); /* ECDSA public key */
- QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); SHORT(0); BYTE(0); /* padding */
- BYTE(0x0); /* binary type */
- }
- > _ram
- /* exception sections */
- .ARM.exidx : { *(.ARM.exidx); } > _ram
- .ARM.extab : { *(.ARM.extab); } > _ram
- /* .init_array */
- .init_array : { *.(init_array); } > _ram
- /* rodata */
- .rodata : { *(.rodata); . = . + (. % 4 == 0 ? 0 : 4 - . % 4); } > _ram
- /* bss */
- .bss : { *(.bss); . = . + (. % 4 == 0 ? 0 : 4 - . % 4); } > _ram
- /* data */
- .data : { *(.data); . = . + (. % 4 == 0 ? 0 : 4 - . % 4); } > _ram
- /* text */
- .text : { *(.text); . = . + (. % 4 == 0 ? 0 : 4 - . % 4); } > _ram
- }
复制代码
用此链接脚本生成程序后,再用objdump就可抽出带header的二进制内容
之后我们需要改动checksum
此处写一个最简单的小工具来计算和改写checksum,如下
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <cstdint>
- int main(int argc, char** argv) {
- if (argc < 2) {
- std::cout << "usage:" << argv[0] << "file" << std::endl;
- return 1;
- }
- std::fstream file(argv[1], std::ios::in | std::ios::out | std::ios::binary);
- if (!file.is_open()) {
- std::cout << "open " << argv[1] << " filed" << std::endl;
- return 1;
- }
- file.seekg(256);
- std::uint32_t sum;
- std::uint8_t v;
- do {
- v = (std::uint8_t)file.get();
- if (file.eof()) {
- break;
- }
- sum += v;
- } while (true);
- file.clear();
- file.seekp(68);
- file.write((char*)&sum, 4);
- file.close();
复制代码
具体流程请参看程序相关makefile
|
|