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

Method HeaderForAddress

view/macho/machoview.cpp:261–861  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

259
260
261MachOHeader 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");

Callers

nothing calls this directly

Calls 15

ReadExceptionClass · 0.85
BuildToolVersionToStringFunction · 0.85
BuildPlatformToStringFunction · 0.85
BuildToolToStringFunction · 0.85
CommandToStringFunction · 0.85
LogDebugMethod · 0.80
SetVirtualBaseMethod · 0.80
push_backMethod · 0.80
LogInfoMethod · 0.80
LogErrorMethod · 0.80
c_strMethod · 0.80

Tested by

no test coverage detected