| 104 | |
| 105 | |
| 106 | PEHeaders::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 |
no test coverage detected