mirror of
https://github.com/geohot/qira
synced 2025-03-13 02:23:07 +03:00
FAT (universal) binaries Aarch64 detection small fix, until i got a pure 64bit arm binary for next push
This commit is contained in:
parent
5714319f1a
commit
89a7505113
@ -108,6 +108,8 @@ class Program:
|
||||
# 0 : CPU_SUBTYPE_ARM64_ALL
|
||||
|
||||
CPU_TYPE_ARM = "\x0C"
|
||||
CPU_TYPE_ARM64 = "\x01\x00\x00\x0C"
|
||||
|
||||
CPU_SUBTYPE_ARM_ALL = "\x00"
|
||||
CPU_SUBTYPE_ARM_V4T = "\x05"
|
||||
CPU_SUBTYPE_ARM_V6 = "\x06"
|
||||
@ -120,11 +122,24 @@ class Program:
|
||||
CPU_SUBTYPE_ARM_V6M = "\x0E"
|
||||
CPU_SUBTYPE_ARM_V7M = "\x0F"
|
||||
CPU_SUBTYPE_ARM_V7EM = "\x0F"
|
||||
CPU_SUBTYPE_ARM = [CPU_SUBTYPE_ARM_ALL, CPU_SUBTYPE_ARM_V4T, CPU_SUBTYPE_ARM_V6, CPU_SUBTYPE_ARM_V5TEJ, CPU_SUBTYPE_ARM_XSCALE, CPU_SUBTYPE_ARM_V7, CPU_SUBTYPE_ARM_V7F, CPU_SUBTYPE_ARM_V7S, CPU_SUBTYPE_ARM_V7K, CPU_SUBTYPE_ARM_V6M, CPU_SUBTYPE_ARM_V7M, CPU_SUBTYPE_ARM_V7EM]
|
||||
|
||||
CPU_TYPE_ARM64 = "\x01\x00\x00\x0C"
|
||||
CPU_SUBTYPE_ARM64_ALL = "\x00"
|
||||
CPU_SUBTYPE_ARM64 = [CPU_SUBTYPE_ARM64_ALL, CPU_SUBTYPE_ARM_V7S]
|
||||
CPU_SUBTYPE_ARM = [
|
||||
CPU_SUBTYPE_ARM_V4T,
|
||||
CPU_SUBTYPE_ARM_V6,
|
||||
CPU_SUBTYPE_ARM_V5TEJ,
|
||||
CPU_SUBTYPE_ARM_XSCALE,
|
||||
CPU_SUBTYPE_ARM_V7,
|
||||
CPU_SUBTYPE_ARM_V7F,
|
||||
CPU_SUBTYPE_ARM_V7K,
|
||||
CPU_SUBTYPE_ARM_V6M,
|
||||
CPU_SUBTYPE_ARM_V7M,
|
||||
CPU_SUBTYPE_ARM_V7EM
|
||||
]
|
||||
|
||||
CPU_SUBTYPE_ARM64 = [
|
||||
CPU_SUBTYPE_ARM_ALL,
|
||||
CPU_SUBTYPE_ARM_V7S
|
||||
]
|
||||
|
||||
MACHO_MAGIC = "\xFE\xED\xFA\xCE"
|
||||
MACHO_CIGAM = "\xCE\xFA\xED\xFE"
|
||||
@ -203,78 +218,91 @@ class Program:
|
||||
raise Exception("windows binary with machine "+hex(wh)+" not supported")
|
||||
|
||||
# MACHO FAT binaries
|
||||
elif progdat[0:4] in (MACHO_FAT_MAGIC, MACHO_FAT_CIGAM, MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||
elif progdat[0x0:0x04] in (MACHO_FAT_MAGIC, MACHO_FAT_CIGAM, MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||
print "**** Mach-O FAT (Universal) binary detected"
|
||||
|
||||
if progdat[4:5] == CPU_TYPE_ARM and progdat[8:9] in CPU_SUBTYPE_ARM:
|
||||
#print " ".join(hex(ord(n)) for n in progdat[0x08:0x0c])
|
||||
#print " ".join(hex(ord(n)) for n in progdat[0x1c:0x20])
|
||||
#print " ".join(hex(ord(n)) for n in progdat[0x30:0x34])
|
||||
|
||||
if progdat[0x04:0x05] == CPU_TYPE_ARM and progdat[0x08:0x09] in CPU_SUBTYPE_ARM:
|
||||
print "**** Mach-O ARM architecture detected"
|
||||
self.macharch = "ARM"
|
||||
elif progdat[4:8] == CPU_TYPE_ARM64 and progdat[8:9] in CPU_SUBTYPE_ARM64:
|
||||
elif (progdat[0x08:0x0c] == CPU_TYPE_ARM64) or (progdat[0x1c:0x20] == CPU_TYPE_ARM64) or (progdat[0x30:0x34] == CPU_TYPE_ARM64):
|
||||
print "**** Mach-O Aarch64 architecture detected"
|
||||
self.macharch = "Aarch64"
|
||||
else:
|
||||
self.macharch = ""
|
||||
print "**** Mach-O X86/64 architecture detected"
|
||||
|
||||
if progdat[0:4] in (MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||
raise Exception("Pack200 compressed files are not supported")
|
||||
elif progdat[0:4] == MACHO_FAT_MAGIC:
|
||||
if progdat[0x0:0x04] in (MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||
raise NotImplementedError("Pack200 compressed files are not supported yet")
|
||||
elif progdat[0x0:0x04] == MACHO_FAT_MAGIC:
|
||||
if self.macharch == "ARM":
|
||||
self.tregs = arch.ARMREGS
|
||||
self.pintool = ""
|
||||
elif self.macharch == "Aarch64":
|
||||
self.tregs = arch.AARCH64REGS
|
||||
self.pintool = ""
|
||||
else:
|
||||
self.tregs = arch.X86REGS
|
||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||
elif progdat[0:4] == MACHO_FAT_CIGAM: # big endian...
|
||||
elif progdat[0x0:0x04] == MACHO_FAT_CIGAM: # big endian...
|
||||
if self.macharch == "ARM":
|
||||
self.tregs = arch.ARMREGS
|
||||
self.pintool = ""
|
||||
elif self.macharch == "Aarch64":
|
||||
self.tregs = arch.AARCH64REGS
|
||||
self.pintool = ""
|
||||
else:
|
||||
self.tregs = arch.X86REGS
|
||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||
else:
|
||||
raise Exception("Mach-O FAT (Universal) binary not supported")
|
||||
if self.macharch == "ARM" or self.macharch == "Aarch64":
|
||||
raise NotImplementedError("ARM/Aarch64 Support is not implemented")
|
||||
if not os.path.isfile(self.pintool):
|
||||
print "Running a Mach-O FAT (Universal) binary requires PIN support. See tracers/pin_build.sh"
|
||||
exit()
|
||||
raise NotImplementedError("Mach-O FAT (Universal) binary not supported")
|
||||
self.runnable = True
|
||||
|
||||
# MACHO binaries
|
||||
elif progdat[0:4] in (MACHO_MAGIC_64, MACHO_CIGAM_64, MACHO_MAGIC, MACHO_CIGAM):
|
||||
elif progdat[0x0:0x04] in (MACHO_MAGIC_64, MACHO_CIGAM_64, MACHO_MAGIC, MACHO_CIGAM):
|
||||
print "**** Mach-O binary detected"
|
||||
|
||||
if progdat[4:5] == CPU_TYPE_ARM and progdat[8:9] in CPU_SUBTYPE_ARM:
|
||||
if progdat[0x04:0x05] == CPU_TYPE_ARM and progdat[0x08:0x09] in CPU_SUBTYPE_ARM:
|
||||
print "**** Mach-O ARM architecture detected"
|
||||
self.macharch = "ARM"
|
||||
elif progdat[4:8] == CPU_TYPE_ARM64 and progdat[8:9] in CPU_SUBTYPE_ARM64:
|
||||
elif progdat[0x04:0x05] == CPU_TYPE_ARM and progdat[0x08:0x09] in CPU_SUBTYPE_ARM64:
|
||||
print "**** Mach-O Aarch64 architecture detected"
|
||||
self.macharch = "Aarch64"
|
||||
else:
|
||||
self.macharch = ""
|
||||
print "**** Mach-O X86/64 architecture detected"
|
||||
|
||||
if progdat[0:4] == MACHO_CIGAM_64: # big endian...
|
||||
if self.macharch == "ARM":
|
||||
if progdat[0x0:0x04] == MACHO_CIGAM_64: # big endian...
|
||||
if self.macharch == "Aarch64":
|
||||
self.tregs = arch.AARCH64REGS
|
||||
self.pintool = ""
|
||||
else:
|
||||
self.tregs = arch.X64REGS
|
||||
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
||||
elif progdat[0:4] == MACHO_MAGIC_64:
|
||||
if self.macharch == "ARM":
|
||||
elif progdat[0x0:0x04] == MACHO_MAGIC_64:
|
||||
if self.macharch == "Aarch64":
|
||||
self.tregs = arch.AARCH64REGS
|
||||
self.pintool = ""
|
||||
else:
|
||||
self.tregs = arch.X64REGS
|
||||
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
||||
elif progdat[0:4] == MACHO_CIGAM: # big endian...
|
||||
elif progdat[0x0:0x04] == MACHO_CIGAM: # big endian...
|
||||
if self.macharch == "ARM":
|
||||
self.tregs = arch.ARMREGS
|
||||
self.pintool = ""
|
||||
else:
|
||||
self.tregs = arch.X86REGS
|
||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||
elif progdat[0:4] == MACHO_MAGIC:
|
||||
elif progdat[0x0:0x04] == MACHO_MAGIC:
|
||||
if self.macharch == "ARM":
|
||||
self.tregs = arch.ARMREGS
|
||||
self.pintool = ""
|
||||
@ -283,6 +311,8 @@ class Program:
|
||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||
else:
|
||||
raise Exception("Mach-O binary not supported")
|
||||
if self.macharch == "ARM" or self.macharch == "Aarch64":
|
||||
raise NotImplementedError("ARM/Aarch64 Support is not implemented")
|
||||
if not os.path.isfile(self.pintool):
|
||||
print "Running a Mach-O binary requires PIN support. See tracers/pin_build.sh"
|
||||
exit()
|
||||
|
Loading…
x
Reference in New Issue
Block a user