| 259 | |
| 260 | |
| 261 | MachOHeader MachoView::HeaderForAddress(BinaryView* data, uint64_t address, bool isMainHeader, std::string identifierPrefix) |
| 262 | { |
| 263 | MachOHeader header{}; |
| 264 | header.isMainHeader = isMainHeader; |
| 265 | |
| 266 | header.identifierPrefix = identifierPrefix; |
| 267 | header.stringList = new DataBuffer(); |
| 268 | |
| 269 | std::string errorMsg; |
| 270 | if (isMainHeader) { |
| 271 | header.loadCommandOffset = g_machoViewType->ParseHeaders(data, m_universalImageOffset + address, header.ident, &m_arch, &m_plat, errorMsg); |
| 272 | if (!header.loadCommandOffset) |
| 273 | throw MachoFormatException(errorMsg); |
| 274 | } |
| 275 | else |
| 276 | { |
| 277 | // address is a Raw file offset |
| 278 | BinaryReader subReader(data); |
| 279 | subReader.Seek(address); |
| 280 | |
| 281 | header.ident.magic = subReader.Read32(); |
| 282 | |
| 283 | BNEndianness endianness; |
| 284 | if (header.ident.magic == MH_MAGIC || header.ident.magic == MH_MAGIC_64) |
| 285 | endianness = LittleEndian; |
| 286 | else if (header.ident.magic == MH_CIGAM || header.ident.magic == MH_CIGAM_64) |
| 287 | endianness = BigEndian; |
| 288 | else |
| 289 | { |
| 290 | throw ReadException(); |
| 291 | } |
| 292 | |
| 293 | subReader.SetEndianness(endianness); |
| 294 | header.ident.cputype = subReader.Read32(); |
| 295 | header.ident.cpusubtype = subReader.Read32(); |
| 296 | header.ident.filetype = subReader.Read32(); |
| 297 | header.ident.ncmds = subReader.Read32(); |
| 298 | header.ident.sizeofcmds = subReader.Read32(); |
| 299 | header.ident.flags = subReader.Read32(); |
| 300 | if ((header.ident.cputype & MachOABIMask) == MachOABI64) // address size == 8 |
| 301 | { |
| 302 | header.ident.reserved = subReader.Read32(); |
| 303 | } |
| 304 | header.loadCommandOffset = subReader.GetOffset(); |
| 305 | } |
| 306 | |
| 307 | |
| 308 | if (isMainHeader) |
| 309 | { |
| 310 | if (header.ident.magic == MH_MAGIC || header.ident.magic == MH_MAGIC_64) |
| 311 | { |
| 312 | m_endian = LittleEndian; |
| 313 | m_logger->LogDebug("Recognized Little Endian Mach-O"); |
| 314 | } |
| 315 | else // (header.ident.magic == MH_CIGAM || header.ident.magic == MH_CIGAM_64) |
| 316 | { |
| 317 | m_endian = BigEndian; |
| 318 | m_logger->LogDebug("Recognized Big Endian Mach-O"); |
nothing calls this directly
no test coverage detected