mirror of https://github.com/geohot/qira
This one is more clean and fixes some issues on the old commit, arm/arch64 can be detected now, need more clean up and print the exact cpu_subtype
This commit is contained in:
parent
abf4e1adea
commit
b43491cf49
|
@ -90,6 +90,31 @@ class Program:
|
||||||
# pmaps is global, but updated by the traces
|
# pmaps is global, but updated by the traces
|
||||||
progdat = open(self.program, "rb").read(0x800)
|
progdat = open(self.program, "rb").read(0x800)
|
||||||
|
|
||||||
|
# 12: CPU_TYPE_ARM
|
||||||
|
# 0 : CPU_SUBTYPE_ARM_ALL
|
||||||
|
# 5 : CPU_SUBTYPE_ARM_V4T
|
||||||
|
# 6 : CPU_SUBTYPE_ARM_V6
|
||||||
|
# 7 : CPU_SUBTYPE_ARM_V5TEJ
|
||||||
|
# 8 : CPU_SUBTYPE_ARM_XSCALE
|
||||||
|
# 9 : CPU_SUBTYPE_ARM_V7
|
||||||
|
|
||||||
|
CPU_TYPE_ARM = "\x0C"
|
||||||
|
CPU_SUBTYPE_ARM_ALL = "\x00"
|
||||||
|
CPU_SUBTYPE_ARM_V4T = "\x05"
|
||||||
|
CPU_SUBTYPE_ARM_V6 = "\x06"
|
||||||
|
CPU_SUBTYPE_ARM_V5TEJ = "\x07"
|
||||||
|
CPU_SUBTYPE_ARM_XSCALE = "\x08"
|
||||||
|
CPU_SUBTYPE_ARM_V7 = "\x09"
|
||||||
|
|
||||||
|
MACHO_MAGIC = "\xFE\xED\xFA\xCE"
|
||||||
|
MACHO_CIGAM = "\xCE\xFA\xED\xFE"
|
||||||
|
MACHO_MAGIC_64 = "\xFE\xED\xFA\xCF"
|
||||||
|
MACHO_CIGAM_64 = "\xCF\xFA\xED\xFE"
|
||||||
|
MACHO_FAT_MAGIC = "\xCA\xFE\xBA\xBE"
|
||||||
|
MACHO_FAT_CIGAM = "\xBE\xBA\xFE\xCA"
|
||||||
|
MACHO_P200_FAT_MAGIC = "\xCA\xFE\xD0\x0D"
|
||||||
|
MACHO_P200_FAT_CIGAM = "\x0D\xD0\xFE\xCA"
|
||||||
|
|
||||||
# Linux binaries
|
# Linux binaries
|
||||||
if progdat[0:4] == "\x7FELF":
|
if progdat[0:4] == "\x7FELF":
|
||||||
# get file type
|
# get file type
|
||||||
|
@ -157,32 +182,28 @@ class Program:
|
||||||
else:
|
else:
|
||||||
raise Exception("windows binary with machine "+hex(wh)+" not supported")
|
raise Exception("windows binary with machine "+hex(wh)+" not supported")
|
||||||
|
|
||||||
# Mach-O FAT binaries
|
# MACHO FAT binaries
|
||||||
elif progdat[0:4] in ("\xCA\xFE\xBA\xBE", "\xBE\xBA\xFE\xCA", "\xCA\xFE\xD0\x0D", "\x0D\xD0\xFE\xCA"):
|
elif progdat[0:4] in (MACHO_FAT_MAGIC, MACHO_FAT_CIGAM, MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||||
print "**** Mach-O FAT (Universal) binary detected"
|
print "**** Mach-O FAT (Universal) binary detected"
|
||||||
# 0 : CPU_SUBTYPE_ARM_ALL
|
|
||||||
# 5 : CPU_SUBTYPE_ARM_V4T
|
#if progdat[4:5] == CPU_TYPE_ARM:
|
||||||
# 6 : CPU_SUBTYPE_ARM_V6
|
if progdat[8:9] in (CPU_SUBTYPE_ARM_ALL, CPU_SUBTYPE_ARM_V4T, CPU_SUBTYPE_ARM_V6, CPU_SUBTYPE_ARM_V5TEJ, CPU_SUBTYPE_ARM_XSCALE, CPU_SUBTYPE_ARM_V7):
|
||||||
# 7 : CPU_SUBTYPE_ARM_V5TEJ
|
|
||||||
# 8 : CPU_SUBTYPE_ARM_XSCALE
|
|
||||||
# 9 : CPU_SUBTYPE_ARM_V7
|
|
||||||
if progdat[8:9] in ("\x00", "\x05", "\x06", "\x07", "\x08", "\x09"):
|
|
||||||
print "**** Mach-O ARM architecture detected"
|
print "**** Mach-O ARM architecture detected"
|
||||||
self.macharch = "ARM"
|
self.macharch = "ARM"
|
||||||
else:
|
else:
|
||||||
self.macharch = ""
|
self.macharch = ""
|
||||||
print "**** Mach-O X86/64 architecture detected"
|
print "**** Mach-O X86/64 architecture detected"
|
||||||
|
|
||||||
if progdat[0:4] in ("\xCA\xFE\xD0\x0D", "\x0D\xD0\xFE\xCA"):
|
if progdat[0:4] in (MACHO_P200_FAT_MAGIC, MACHO_P200_FAT_CIGAM):
|
||||||
raise Exception("Pack200 compressed files are not supported")
|
raise Exception("Pack200 compressed files are not supported")
|
||||||
elif progdat[0:4] == "\xCA\xFE\xBA\xBE":
|
elif progdat[0:4] == MACHO_FAT_MAGIC:
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.ARMREGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
else:
|
else:
|
||||||
self.tregs = arch.X86REGS
|
self.tregs = arch.X86REGS
|
||||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||||
elif progdat[0:4] == "\xBE\xBA\xFE\xCA": # big endian...
|
elif progdat[0:4] == MACHO_FAT_CIGAM: # big endian...
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.ARMREGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
|
@ -196,44 +217,40 @@ class Program:
|
||||||
exit()
|
exit()
|
||||||
self.runnable = True
|
self.runnable = True
|
||||||
|
|
||||||
# Mach-O binaries
|
# MACHO binaries
|
||||||
elif progdat[0:4] in ("\xCF\xFA\xED\xFE", "\xFE\xED\xFA\xCF", "\xCE\xFA\xED\xFE", "\xFE\xED\xFA\xCE"):
|
elif progdat[0:4] in (MACHO_MAGIC_64, MACHO_CIGAM_64, MACHO_MAGIC, MACHO_CIGAM):
|
||||||
print "**** Mach-O binary detected"
|
print "**** Mach-O binary detected"
|
||||||
# 0 : CPU_SUBTYPE_ARM_ALL
|
|
||||||
# 5 : CPU_SUBTYPE_ARM_V4T
|
#if progdat[4:5] == CPU_TYPE_ARM:
|
||||||
# 6 : CPU_SUBTYPE_ARM_V6
|
if progdat[8:9] in (CPU_SUBTYPE_ARM_ALL, CPU_SUBTYPE_ARM_V4T, CPU_SUBTYPE_ARM_V6, CPU_SUBTYPE_ARM_V5TEJ, CPU_SUBTYPE_ARM_XSCALE, CPU_SUBTYPE_ARM_V7):
|
||||||
# 7 : CPU_SUBTYPE_ARM_V5TEJ
|
print "**** Mach-O ARM/Aarch64 architecture detected"
|
||||||
# 8 : CPU_SUBTYPE_ARM_XSCALE
|
|
||||||
# 9 : CPU_SUBTYPE_ARM_V7
|
|
||||||
if progdat[8:9] in ("\x00", "\x05", "\x06", "\x07", "\x08", "\x09"):
|
|
||||||
print "**** Mach-O ARM architecture detected"
|
|
||||||
self.macharch = "ARM"
|
self.macharch = "ARM"
|
||||||
else:
|
else:
|
||||||
self.macharch = ""
|
self.macharch = ""
|
||||||
print "**** Mach-O X86/64 architecture detected"
|
print "**** Mach-O X86/64 architecture detected"
|
||||||
|
|
||||||
if progdat[0:4] == "\xCF\xFA\xED\xFE":
|
if progdat[0:4] == MACHO_CIGAM_64: # big endian...
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.AARCH64REGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
else:
|
else:
|
||||||
self.tregs = arch.X64REGS
|
self.tregs = arch.X64REGS
|
||||||
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
||||||
elif progdat[0:4] == "\xFE\xED\xFA\xCF": # big endian...
|
elif progdat[0:4] == MACHO_MAGIC_64:
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.AARCH64REGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
else:
|
else:
|
||||||
self.tregs = arch.X64REGS
|
self.tregs = arch.X64REGS
|
||||||
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
self.pintool = pin_dir + "obj-intel64/qirapin.dylib"
|
||||||
elif progdat[0:4] == "\xCE\xFA\xED\xFE":
|
elif progdat[0:4] == MACHO_CIGAM: # big endian...
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.ARMREGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
else:
|
else:
|
||||||
self.tregs = arch.X86REGS
|
self.tregs = arch.X86REGS
|
||||||
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
self.pintool = pin_dir + "obj-ia32/qirapin.dylib"
|
||||||
elif progdat[0:4] == "\xFE\xED\xFA\xCE": # big endian...
|
elif progdat[0:4] == MACHO_MAGIC:
|
||||||
if self.macharch == "ARM":
|
if self.macharch == "ARM":
|
||||||
self.tregs = arch.ARMREGS
|
self.tregs = arch.ARMREGS
|
||||||
self.pintool = ""
|
self.pintool = ""
|
||||||
|
|
Loading…
Reference in New Issue