public static AbstractBlob CreateFromStream(ReadingContext SR) { // Read the magic and length (common to all blobs) UInt32 Magic = SR.ReadUInt32(); UInt32 Length = SR.ReadUInt32(); AbstractBlob Result; switch (Magic) { case CSMAGIC_CODEDIRECTORY: Result = new CodeDirectoryBlob(); break; case CSMAGIC_CODEDIR_SIGNATURE: Result = new CodeDirectorySignatureBlob(); break; case CSMAGIC_ENTITLEMENTS: Result = new EntitlementsBlob(); break; case CSMAGIC_REQUIREMENTS_TABLE: Result = new RequirementsBlob(); break; case CSMAGIC_EMBEDDED_SIGNATURE: Result = new CodeSigningTableBlob(); break; case CSMAGIC_REQUIREMENT: default: Result = new OpaqueBlob(); break; } Result.MyMagic = Magic; Result.UnpackageData(SR, Length); if (Config.bCodeSignVerbose) { Console.WriteLine("[Read blob with magic 0x{0:X} and length={1}]\n{2}", Magic, Length, Result.ToString()); } return Result; }
protected override void UnpackageData(ReadingContext SR, int CommandSize) { base.UnpackageData(SR, CommandSize); SR.PushPositionAndJump(BlobFileOffset); SR.bStreamLittleEndian = false; long SavedPosition = SR.Position; // Parse the blob Payload = AbstractBlob.CreateFromStream(SR) as CodeSigningTableBlob; if (Config.bCodeSignVerbose) { Console.WriteLine(Payload.ToString()); } //SR.VerifyStreamPosition(SavedPosition, BlobFileSize); SR.PopPosition(); SR.bStreamLittleEndian = true; }
public static CodeSigningTableBlob Create() { CodeSigningTableBlob Blob = new CodeSigningTableBlob(); return Blob; }