|
1 | 1 | #include "MachOProcessor.h"
|
2 | 2 | #include "SharedCache.h"
|
| 3 | +#include "macho/types.h" |
3 | 4 |
|
4 | 5 | using namespace BinaryNinja;
|
5 | 6 |
|
@@ -267,116 +268,5 @@ void SharedCacheMachOProcessor::ApplyHeaderDataVariables(SharedCacheMachOHeader&
|
267 | 268 | // TODO: By using a binary reader we assume the sections have all been mapped.
|
268 | 269 | // TODO: Maybe we should just use the virtual memory reader...
|
269 | 270 | // TODO: We can define symbols and data variables even if there is no backing region FWIW
|
270 |
| - BinaryReader reader(m_view); |
271 |
| - // TODO: Do we support non 64 bit header? |
272 |
| - reader.Seek(header.textBase + sizeof(mach_header_64)); |
273 |
| - |
274 |
| - m_view->DefineDataVariable(header.textBase, Type::NamedType(m_view, QualifiedName("mach_header_64"))); |
275 |
| - m_view->DefineAutoSymbol( |
276 |
| - new Symbol(DataSymbol, "__macho_header::" + header.identifierPrefix, header.textBase, LocalBinding)); |
277 |
| - |
278 |
| - auto applyLoadCommand = [&](uint64_t cmdAddr, const load_command& load) { |
279 |
| - switch (load.cmd) |
280 |
| - { |
281 |
| - case LC_SEGMENT: |
282 |
| - { |
283 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("segment_command"))); |
284 |
| - reader.SeekRelative(5 * 8); |
285 |
| - size_t numSections = reader.Read32(); |
286 |
| - reader.SeekRelative(4); |
287 |
| - for (size_t j = 0; j < numSections; j++) |
288 |
| - { |
289 |
| - m_view->DefineDataVariable(reader.GetOffset(), Type::NamedType(m_view, QualifiedName("section"))); |
290 |
| - auto sectionSymName = |
291 |
| - fmt::format("__macho_section::{}_[{}]", header.identifierPrefix, std::to_string(j)); |
292 |
| - auto sectionSym = new Symbol(DataSymbol, sectionSymName, reader.GetOffset(), LocalBinding); |
293 |
| - m_view->DefineAutoSymbol(sectionSym); |
294 |
| - reader.SeekRelative((8 * 8) + 4); |
295 |
| - } |
296 |
| - break; |
297 |
| - } |
298 |
| - case LC_SEGMENT_64: |
299 |
| - { |
300 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("segment_command_64"))); |
301 |
| - reader.SeekRelative(7 * 8); |
302 |
| - size_t numSections = reader.Read32(); |
303 |
| - reader.SeekRelative(4); |
304 |
| - for (size_t j = 0; j < numSections; j++) |
305 |
| - { |
306 |
| - m_view->DefineDataVariable(reader.GetOffset(), Type::NamedType(m_view, QualifiedName("section_64"))); |
307 |
| - auto sectionSymName = |
308 |
| - fmt::format("__macho_section_64::{}_[{}]", header.identifierPrefix, std::to_string(j)); |
309 |
| - auto sectionSym = new Symbol(DataSymbol, sectionSymName, reader.GetOffset(), LocalBinding); |
310 |
| - m_view->DefineAutoSymbol(sectionSym); |
311 |
| - reader.SeekRelative(10 * 8); |
312 |
| - } |
313 |
| - break; |
314 |
| - } |
315 |
| - case LC_SYMTAB: |
316 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("symtab"))); |
317 |
| - break; |
318 |
| - case LC_DYSYMTAB: |
319 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("dysymtab"))); |
320 |
| - break; |
321 |
| - case LC_UUID: |
322 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("uuid"))); |
323 |
| - break; |
324 |
| - case LC_ID_DYLIB: |
325 |
| - case LC_LOAD_DYLIB: |
326 |
| - case LC_REEXPORT_DYLIB: |
327 |
| - case LC_LOAD_WEAK_DYLIB: |
328 |
| - case LC_LOAD_UPWARD_DYLIB: |
329 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("dylib_command"))); |
330 |
| - if (load.cmdsize - 24 <= 150) |
331 |
| - m_view->DefineDataVariable( |
332 |
| - cmdAddr + 24, Type::ArrayType(Type::IntegerType(1, true), load.cmdsize - 24)); |
333 |
| - break; |
334 |
| - case LC_CODE_SIGNATURE: |
335 |
| - case LC_SEGMENT_SPLIT_INFO: |
336 |
| - case LC_FUNCTION_STARTS: |
337 |
| - case LC_DATA_IN_CODE: |
338 |
| - case LC_DYLIB_CODE_SIGN_DRS: |
339 |
| - case LC_DYLD_EXPORTS_TRIE: |
340 |
| - case LC_DYLD_CHAINED_FIXUPS: |
341 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("linkedit_data"))); |
342 |
| - break; |
343 |
| - case LC_ENCRYPTION_INFO: |
344 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("encryption_info"))); |
345 |
| - break; |
346 |
| - case LC_VERSION_MIN_MACOSX: |
347 |
| - case LC_VERSION_MIN_IPHONEOS: |
348 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("version_min"))); |
349 |
| - break; |
350 |
| - case LC_DYLD_INFO: |
351 |
| - case LC_DYLD_INFO_ONLY: |
352 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("dyld_info"))); |
353 |
| - break; |
354 |
| - default: |
355 |
| - m_view->DefineDataVariable(cmdAddr, Type::NamedType(m_view, QualifiedName("load_command"))); |
356 |
| - break; |
357 |
| - } |
358 |
| - }; |
359 |
| - |
360 |
| - try |
361 |
| - { |
362 |
| - for (size_t i = 0; i < header.ident.ncmds; i++) |
363 |
| - { |
364 |
| - load_command load {}; |
365 |
| - uint64_t curOffset = reader.GetOffset(); |
366 |
| - load.cmd = reader.Read32(); |
367 |
| - load.cmdsize = reader.Read32(); |
368 |
| - |
369 |
| - applyLoadCommand(curOffset, load); |
370 |
| - m_view->DefineAutoSymbol(new Symbol(DataSymbol, |
371 |
| - "__macho_load_command::" + header.identifierPrefix + "_[" + std::to_string(i) + "]", curOffset, |
372 |
| - LocalBinding)); |
373 |
| - |
374 |
| - uint64_t nextOffset = curOffset + load.cmdsize; |
375 |
| - reader.Seek(nextOffset); |
376 |
| - } |
377 |
| - } |
378 |
| - catch (ReadException&) |
379 |
| - { |
380 |
| - m_logger->LogError("Error when applying Mach-O header types at %llx", header.textBase); |
381 |
| - } |
| 271 | + MachO::ApplyHeaderTypes(m_view, m_logger, BinaryReader(m_view), header.identifierPrefix, header.textBase, header.ident.ncmds); |
382 | 272 | }
|
0 commit comments