Formats:
struct BinFile{
BYTE signature[7]; // = { 'B', '0', '0', '0', 'F', 'F', '/a' }
DWORD ImageStart
DWORD ImageLength
Record ImageRecords[RecordNum]
};
struct Record{
DWORD address;
DWORD length;
DWORD chksum;
};
在文件的最开端,会放置一个BinFile结构,imageStart和ImageLength分别对应镜像展开后在内存中存放的首地址和长度。该结构中的RecordNum为不确定的,通常在最后一个记录之后增加一个address和Chksum都为0的纪录表示结束,而这个表示结束的结构中的Length则标示其实际入口点。
Image
Offset -----------
0x00 | ImageStart
|
|
0x40 | Rom Signature { 0x43454345 }
0x44 | Pointer to the ROMHDR for this Region
|
|
0x???? | ROMHDR{
| };
|
Chain file
struct _XIPCHAIN_ENTRY {
LPVOID pvAddr; // address of the XIP
DWORD dwLength; // the size of the XIP
DWORD dwMaxLength; // the biggest it can grow to
USHORT usOrder; // where to put into ROMChain_t
USHORT usFlags; // flags/status of XIP
DWORD dwVersion; // version info
CHAR szName[XIP_NAMELEN]; // Name of XIP, typically the bin file's name, w/o .bin
DWORD dwAlgoFlags; // algorithm to use for signature verification
DWORD dwKeyLen; // length of key in byPublicKey
BYTE byPublicKey[596]; // public key data
};
Offset --------------------------
0x00 | DWORD Count;
0x04 | XIPCHAIN_ENTRY[1]{
| };
| XIPCHAIN_ENTRY[2]{
| };
| ...