网站首页 > 编程文章 正文
此文所介绍的《IAP升级文件自动加头部信息》的编译即生成头部信息,只能生成固定信息,但这种方式不能保证升级文件不被恶意篡改,比如,将正常头部加在一份病毒文件头部,则MCU将识别不出来词升级文件是否正常,则跳转后则无法正常运行。因此,我们需要给升级文件加上一些动态的,含有正常文件校验码的信息到头部,使得允许下载进去的升级内容是正常可允许的程序。
我们可以单独开发一个给升级文件加头部的上位机来完成加头部,以及使用拼装方式输出烧录文件或者使用JFLASH工具回读方式生成烧录文件,但均较为繁琐,本文使用python,轻松开发。
- 制定头部协议:
- 我们使用python对输出文件进行处理
# 指定源文件路径,读出源文件
apppath = 'src.bin'
with open(apppath,'rb') as appfin:
s_app = appfin.read()
# 厂商ID【8byte】,如"XYZK----"
apphead = []
s1 = 0
apphead.insert(s1,ord('X'))
apphead.insert(s1 + 1,ord('Y'))
apphead.insert(s1 + 2,ord('Z'))
apphead.insert(s1 + 3,ord('K'))
for i in range(s1 + 4, 8):
apphead.insert(i,ord('-'))
# 客户ID【8byte】,如"MEIY----"
s2 = 8
apphead.insert(s2,ord('M'))
apphead.insert(s2 + 1,ord('E'))
apphead.insert(s2 + 2,ord('I'))
apphead.insert(s2 + 3,ord('Y'))
for i in range(s2 + 4, 32):
apphead.insert(i,ord('-'))
####....................
#产品类型【8byte】
#产品ID【8byte】
#主控型号【8byte】
#硬件版本号【4byte】
#软件版本号【4byte】
#头部长度【2byte】
#实际升级文件长度【4byte】
#实际升级文件CRC【4byte】
#头部长度【2byte】
#预留空间【6byte】
#头部CRC【2bytes】
# 需要做至少256字节的偏移【对M0来说】
for i in range(64, 192):
apphead.insert(i,ord('-'))
# crc16校验函数
def crc16(data):
crcGen = 0xE32A
# data = bytearray.fromhex(string)
crc = 0xFFFF
for pos in data:
crc ^= pos
for i in range(8):
if ((crc & 0x01) != 0):
crc >>= 1;
crc ^= crcGen
else:
crc >>= 1;
return crc
- 得到头部信息后,重新写入新文件
# 指定输出文件路径,可运行脚本手动设置输出文件名或者固定文件名输出,本文输出固定文件名
otapath = 'XXXX.bin'
# 输出OTA文件【app头部64字节 + app原文件】
with open(otapath,'wb') as fota:
fota.write(bytearray(apphead))
fota.write(bytearray(s_app))
至此,已经完成对升级文件的打包工作,接下来,我们将直接生成烧录文件。
需要生成烧录文件,则需要知道,boot程序大小,以及新程序跳转地址,以及片内FLASH加载地址,然后我们使用脚本拼装成一个整体的bin文件,由于我们跳转app前会对OTA数据下载区域进行校验,我们会把头部64字节一并下载到FLASH上。
我们设定:boot大小0x1000, 程序下载地址为0x8000000 + 0x1000, 新程序跳转地址0x8000000 + 0x1000 + 0x100。
接下来对BOOT文件进行读取
bootpath = 'boot.bin'
with open(bootpath,'rb') as bootfin:
s_boot = bootfin.read()
if(os.path.exists(bootpath)):
bootlen = os.path.getsize(bootpath)
bootend = []
if (bootlen <= 4 * 1024):
boot_packedlen = 4 * 1024 - bootlen
for i in range(0, boot_packedlen):
bootend.insert(i, 0xFF)
最后进行整体拼装【本文使用的MCU空间: RAM8K,FLASH64K】
wr_bin_path = 'WR.bin'
# 输出烧录文件【boot4K + app文件 + app填充 + boot信息区域 + 数据存储区域 + 整体尾布填充至64K】
with open(wr_bin_path,'wb') as fwr:
fwr.write(bytearray(s_boot))
fwr.write(bytearray(bootend))
fwr.write(bytearray(apphead))
fwr.write(bytearray(s_app))
fwr.write(bytearray(append))
fwr.write(bytearray(packapp))
fwr.write(bytearray(bootflag))
fwr.write(bytearray(wrbin_end))
接下来,我们可以将WR.bin文件转为WR.hex文件,借助强大的python库完成此项任务:
wr_hex_path = 'WR.hex'
from intelhex import compat,bin2hex
offset = 0x8000000
sys.exit(bin2hex(wr_bin_path, wr_hex_path, offset))
至此,你将斩获一键生成带头部信息的升级文件+烧录文件的愉快体验!
猜你喜欢
- 2024-10-12 分享面试最常见的30道Redis面试题!
- 2024-10-12 Huntpad:一款专为渗透测试人员设计的Notepad应用程序
- 2024-10-12 50道Redis面试题史上最全,以后面试再也不怕问Redis了
- 2024-10-12 值得一看的35个Redis经典知识点(redis常用)
- 2024-10-12 20 道 Redis 面试题,面试官能问的都被我找到了
- 2024-10-12 redis已成为2020面试必问知识点,搞懂redis这些知识点,面试无忧
- 2024-10-12 推荐:工业数字化系统开发用到的串口调试小助手
- 2024-10-12 来漫谈一下Web缓存架构(web前端缓存技术)
- 2024-10-12 技术问答:送你 50 道 Redis 面试题,助你全面理解Redis!
- 2024-10-12 46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)
你 发表评论:
欢迎- 06-24一个老爸画了超级有爱的365幅画 | 父亲节献礼
- 06-24产品小白看魏则西事件——用产品思维审视百度推广
- 06-24某教程学习笔记(一):13、脚本木马原理
- 06-24十大常见web漏洞——命令执行漏洞
- 06-24初涉内网,提权那些事(内网渗透提权)
- 06-24黑客命令第16集:47种最常见的**网站方法2/2
- 06-24铭说 | 一句话木马的多种变形方式
- 06-24Java隐藏的10倍效率技巧!90%程序员不知道的魔法方法(附代码)
- 最近发表
- 标签列表
-
- spire.doc (70)
- instanceclient (62)
- solidworks (78)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)