unit uTokens; //////////////////////////////////////////////////////////////////////////////// // // Structure of Tokens // //////////////////////////////////////////////////////////////////////////////// {-------------------------------------------------------------------------------------- { BB5 Flash-token: Type 1 54 01 17 0E 00 00 00 0D BA 01 00 00 40 00 01 6E 00 00 62 TH ST ST HL DEVICE DC DC UN LL LL LL LL SS SS SS SS HC Type 2 54 01 30 15 00 03 00 A2 72 00 00 00 08 FF FF FF FF 00 04 00 00 00 00 00 00 9A TH ST ST HL FI FI FI DC DC ?? ?? ?? ?? ?? ?? ?? ?? LL LL LL LL SS SS SS SS HC TH - Token Header ST - SubType (type of token) HL - Header Length FF - Flash ID DC - Data Checksum LL - Length of data between two tokens SS - Start adress in flash HC - Header Checksum --------------------------------------------------------------------------------------- { BB5 Cert-token Type 1 5D 01 27 2D ............... .............. 00 00 00 23 0C 00 00 04 00 00 00 06 C0 AE 5D 01 27 2D ............... .............. 00 00 00 8D B6 00 00 04 00 00 00 06 C0 D6 5D 01 27 2D ............... .............. 01 01 00 C1 26 00 00 04 00 00 07 00 00 48 TH ST ST HL [20 byte SHA1?] [12 byte name] FF FF FF DC DC LL LL LL LL SS SS SS SS HC Type 2 5D 01 28 43 ............... .............. 00 00 00 5A 5A 00 00 03 00 FF FF FF FF ................ 02 00 9D 5D 01 28 43 ............... .............. 01 01 00 BF 2B 00 00 04 00 FF FF FF FF ................ 02 00 48 5D 01 28 43 ............... .............. 00 00 00 8C 2E 00 00 02 80 FF FF FF FF ................ 01 00 25 5D 01 28 43 E9EFF4BFAA5393217CA6B17755FC3E1415658E9A 50415055424B455953000000000000 1D26 00000600 FFFFFFFF 64 3B2F33E3E6EEFC2D6F45213419C8E368FCB9960100 6D TH ST ST HL [20 byte SHA1?] [12 byte name] FF FF FF DC DC LL LL LL LL SS SS SS SS [20 bytes SHA1?] ?? ?? HC TH HLEN NAME/DESC DCHK BLKSZ LAST_BYTE_IS_H_CHECKSUM --------------------------------------------------------------------------------------- { BB5 Image-token allways applied in starting image-token F0F0 0001 FF00 0000 FFF0 FFFF 00000000 [some identifier] [ident?] [ part ] part is starting with 0 every 0x208 bytes (including this 8 bytes): FFF0 FFFF [ part ] every 0x20000 bytes this sequence is starting again but part is still continuing letzter 0x20000 part: F0F0 0001 FFC0 0000 FFF0 FFFF 0000 xxxx yy <- $C0 marks end ---------------------------------------------------------------------------------------} interface uses Classes, SysUtils, Hexutils; procedure DeletePhoenixTokens(var ms:TMemoryStream; var res:Boolean; var FirstTokenType:Word; var SizeOfDataInToken: Cardinal); procedure InsertPhoenixTokens(sc:TMemoryStream; var res:Boolean; var TokenType:Word; var Offset, SizeOfDataInToken: Cardinal); function FlashTokenChekSum(Buf:Pointer; BufLen: integer): Word; function FlashTokenCRC(Buf:Pointer; BufLen: integer): byte; implementation procedure DeletePhoenixTokens(var ms:TMemoryStream; var res:Boolean; var FirstTokenType:Word; var SizeOfDataInToken: Cardinal); var i, HdrLen : integer; TokenBuf : array of byte; Data : Byte; CurrTokenType : Word; CurrTokenSize : Cardinal; dest : TMemoryStream; begin i:=0; res:=false; dest:=TMemoryStream.Create; {ms.Read(i,1); if i<>$B2 then exit; SetLength(TokenBuf, 4); ms.ReadBuffer(TokenBuf[0], 4);//Длина Flash Header HdrLen := HexToInt(IntToHex(TokenBuf[0], 2)+IntToHex(TokenBuf[1], 2)+IntToHex(TokenBuf[2], 2)+IntToHex(TokenBuf[3], 2)); ms.Seek(0,sofromBeginning); dest.CopyFrom(ms, HdrLen+5);} i:=0; while ms.Position Error dest.Free; exit; end; end;//end of case //Если имеются различия между данными о длине блока в токене и реальным значением -> Bad Image File if (ms.size-ms.position) 0 do begin Result:=Result xor Word(Buf^); inc(Integer(Buf));dec(BufLen); inc(Integer(Buf));dec(BufLen); end; end; //Расчет контрольной суммы flash-tokens (последний байт - HC - Header Checksum) function FlashTokenCRC(Buf:Pointer; BufLen: integer): byte; begin Result:=0; while BufLen > 0 do begin Result:=Result+Byte(Buf^); inc(Integer(Buf)); dec(BufLen); end; Result:=Result xor $FF; end; end.