doesitarm/helpers/macho/macho.magic.js
2022-07-21 19:49:43 -05:00

88 lines
2.4 KiB
JavaScript

//Global Constants
var MAGICS = [];
/*
@Class MAGIC
@Description
Magic is a specific byte that indicates what for file it is.
In Mach-O there a multiple magics differing from endianess, bits or file type.
*/
let MAGIC =
{
//Macho Magics
// cafebabe: Universal Binary Big Endian. These fat binaries are archives that can include binaries for multiple architectures, but typically contain PowerPC, Intel x86, or ARM.
FAT_MAGIC: 0xcafebabe,
// bebafeca: NXSwapLong(FAT_MAGIC)
FAT_CIGAM: 0xbebafeca,
// cafebabf: ???
FAT_MAGIC64: 0xcafebabf,
// bfbafeca: ???
FAT_CIGAM64: 0xbfbafeca,
// feedface: Mach-O Big Endian (32-bit)
MH_MAGIC: 0xfeedface,
// cefaedfe: Mach-O Little Endian (32-bit)
MH_CIGAM: 0xcefaedfe,
// feedfacf: Mach-O Big Endian (64-bit)
MH_MAGIC64: 0xfeedfacf,
// cffaedfe: Mach-O Little Endian (64-bit)
MH_CIGAM64: 0xcffaedfe,
//Retrieve the magic name of a specified magic
//If an invalid magic was specifed undefined is returned
KEYFORVALUE: function(value) {
return MAGICS[value];
},
//Validate that a specified magic is correct
VALIDATE: function(magic) {
return MAGIC.KEYFORVALUE(magic) != undefined;
},
//returns true if the specified magic is a little-endian magic
ISLITTLEENDIAN: function(magic) {
if(!MAGIC.VALIDATE(magic)) //If it is not a valid magic we are basically done here
return false;
return MAGIC.KEYFORVALUE(magic).split('CIGAM').length > 1; //hacky trick to check if the magic value's keyname contains CIGAM which basically indicates little endian
},
//returns true if the specified magic is 64-bit
IS64BIT: function(magic) {
if(!MAGIC.VALIDATE(magic))
return false;
return MAGIC.KEYFORVALUE(magic).split('64').length > 1; //hacky trick to check if the magic value's keyname contains 64 which basically indicates 64-bit
},
toString : function() {
return JSON.stringify(this);
},
debugdescription: ""
};
MAGICS[MAGIC.FAT_MAGIC] = "FAT_MAGIC";
MAGICS[MAGIC.FAT_CIGAM] = "FAT_CIGAM";
MAGICS[MAGIC.FAT_MAGIC64] = "FAT_MAGIC64";
MAGICS[MAGIC.FAT_CIGAM64] = "FAT_CIGAM64";
MAGICS[MAGIC.MH_MAGIC] = "MH_MAGIC";
MAGICS[MAGIC.MH_CIGAM] = "MH_CIGAM";
MAGICS[MAGIC.MH_MAGIC64] = "MH_MAGIC64";
MAGICS[MAGIC.MH_CIGAM64] = "MH_CIGAM64";
export { MAGIC, MAGICS }