FAT (universal) binaries Aarch64 detection small fix, until i got a pure 64bit arm binary for next push

This commit is contained in:
Yahya Lmallas 2016-02-02 16:21:49 +01:00
parent 5714319f1a
commit 89a7505113

View File

@ -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()