MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / PEHeaders

Method PEHeaders

examples/triage/headers.cpp:106–300  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

104
105
106PEHeaders::PEHeaders(BinaryViewRef data)
107{
108 uint64_t peOffset = data->GetStart() + GetValueOfStructMember(data, "DOS_Header", data->GetStart(), "e_lfanew");
109 uint64_t optHeaderStart = GetAddressAfterStruct(data, "COFF_Header", peOffset);
110
111 BinaryNinja::DataBuffer peMagic = data->ReadBuffer(optHeaderStart, 2);
112 bool is64bit;
113 std::string optHeaderName;
114 if ((peMagic.GetLength() == 2) && (peMagic[0] == 0x0b) && (peMagic[1] == 0x01))
115 {
116 optHeaderName = "PE32_Optional_Header";
117 AddField("Type", "PE 32-bit");
118 is64bit = false;
119 }
120 else if ((peMagic.GetLength() == 2) && (peMagic[0] == 0x0b) && (peMagic[1] == 0x02))
121 {
122 optHeaderName = "PE64_Optional_Header";
123 AddField("Type", "PE 64-bit");
124 is64bit = true;
125 }
126 else
127 {
128 AddField("Type", QString::fromStdString(data->GetTypeName()));
129 if (data->GetDefaultPlatform())
130 AddField("Platform", QString::fromStdString(data->GetDefaultPlatform()->GetName()));
131 if (data->IsValidOffset(data->GetEntryPoint()))
132 AddField("Entry Point", QString("0x") + QString::number(data->GetEntryPoint(), 16), CodeHeaderField);
133 return;
134 }
135
136 uint64_t machineValue = GetValueOfStructMember(data, "COFF_Header", peOffset, "machine");
137 QString machineName = GetNameOfEnumerationMember(data, "coff_machine", machineValue);
138 if (machineName.startsWith("IMAGE_FILE_MACHINE_"))
139 machineName = machineName.mid((int)strlen("IMAGE_FILE_MACHINE_"));
140 AddField("Machine", machineName);
141
142 AddField("Endianness", data->GetDefaultEndianness() == BigEndian ? "Big" : "Little");
143
144 uint64_t subsysValue = GetValueOfStructMember(data, optHeaderName, optHeaderStart, "subsystem");
145 QString subsysName = GetNameOfEnumerationMember(data, "pe_subsystem", subsysValue);
146 if (subsysName.startsWith("IMAGE_SUBSYSTEM_"))
147 subsysName = subsysName.mid((int)strlen("IMAGE_SUBSYSTEM_"));
148 AddField("Subsystem", subsysName);
149
150 uint64_t secs = GetValueOfStructMember(data, "COFF_Header", peOffset, "timeDateStamp");
151 QDateTime t = QDateTime::fromSecsSinceEpoch(secs);
152 AddField("Timestamp", t.toString());
153 AddField("Timestamp (Hex)", QString::number(secs, 16).prepend("0x"));
154
155 uint64_t currentBase = data->GetStart();
156 AddField("Current Base", QString("0x") + QString::number(currentBase, 16), AddressHeaderField);
157
158 uint64_t base = GetValueOfStructMember(data, optHeaderName, optHeaderStart, "imageBase");
159 AddField("Image Base", QString("0x") + QString::number(base, 16), AddressHeaderField);
160
161 uint64_t entryPoint = currentBase + GetValueOfStructMember(data, optHeaderName, optHeaderStart, "addressOfEntryPoint");
162 AddField("Entry Point", QString("0x") + QString::number(entryPoint, 16), CodeHeaderField);
163

Callers 1

__init__Method · 0.80

Calls 15

GetDefaultPlatformMethod · 0.80
IsValidOffsetMethod · 0.80
GetEntryPointMethod · 0.80
GetDefaultEndiannessMethod · 0.80
GetClassMethod · 0.80
GetMembersMethod · 0.80
GetEnumerationMethod · 0.80
push_backMethod · 0.80
GetArrayMethod · 0.80
GetKeyValueStoreMethod · 0.80
GetUnsignedIntegerMethod · 0.80

Tested by

no test coverage detected