Class: Rex::MachParsey::Mach

Inherits:
MachBase show all
Defined in:
lib/rex/machparsey/mach.rb

Constant Summary

Constants inherited from MachBase

Rex::MachParsey::MachBase::CPU_SUBTYPE_BIG_ENDIAN, Rex::MachParsey::MachBase::CPU_SUBTYPE_LITTLE_ENDIAN, Rex::MachParsey::MachBase::CPU_TYPE_ARM, Rex::MachParsey::MachBase::CPU_TYPE_I386, Rex::MachParsey::MachBase::CPU_TYPE_POWERPC, Rex::MachParsey::MachBase::CPU_TYPE_POWERPC64, Rex::MachParsey::MachBase::CPU_TYPE_X86_64, Rex::MachParsey::MachBase::LC_DYSYMTAB, Rex::MachParsey::MachBase::LC_FVMFILE, Rex::MachParsey::MachBase::LC_IDENT, Rex::MachParsey::MachBase::LC_IDFVMLIB, Rex::MachParsey::MachBase::LC_ID_DYLIB, Rex::MachParsey::MachBase::LC_ID_DYLINKER, Rex::MachParsey::MachBase::LC_LOADFVMLIB, Rex::MachParsey::MachBase::LC_LOAD_DYLIB, Rex::MachParsey::MachBase::LC_LOAD_DYLINKER, Rex::MachParsey::MachBase::LC_PREBOUND_DYLIB, Rex::MachParsey::MachBase::LC_PREPAGE, Rex::MachParsey::MachBase::LC_SEGMENT, Rex::MachParsey::MachBase::LC_SEGMENT_64, Rex::MachParsey::MachBase::LC_SYMSEG, Rex::MachParsey::MachBase::LC_SYMTAB, Rex::MachParsey::MachBase::LC_THREAD, Rex::MachParsey::MachBase::LC_UNIXTHREAD, Rex::MachParsey::MachBase::LOAD_COMMAND_LSB, Rex::MachParsey::MachBase::LOAD_COMMAND_MSB, Rex::MachParsey::MachBase::LOAD_COMMAND_SIZE, Rex::MachParsey::MachBase::MACH_HEADER_64_LSB, Rex::MachParsey::MachBase::MACH_HEADER_64_MSB, Rex::MachParsey::MachBase::MACH_HEADER_LSB, Rex::MachParsey::MachBase::MACH_HEADER_MSB, Rex::MachParsey::MachBase::MACH_HEADER_SIZE, Rex::MachParsey::MachBase::MACH_HEADER_SIZE_64, Rex::MachParsey::MachBase::MH_CIGAM, Rex::MachParsey::MachBase::MH_CIGAM_64, Rex::MachParsey::MachBase::MH_MAGIC, Rex::MachParsey::MachBase::MH_MAGIC_64, Rex::MachParsey::MachBase::SEGMENT_COMMAND_64_LSB, Rex::MachParsey::MachBase::SEGMENT_COMMAND_64_MSB, Rex::MachParsey::MachBase::SEGMENT_COMMAND_LSB, Rex::MachParsey::MachBase::SEGMENT_COMMAND_MSB, Rex::MachParsey::MachBase::SEGMENT_COMMAND_SIZE, Rex::MachParsey::MachBase::SEGMENT_COMMAND_SIZE_64

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(isource, offset = 0, fat = false) ⇒ Mach

Returns a new instance of Mach


14
15
16
17
18
19
20
21
22
23
# File 'lib/rex/machparsey/mach.rb', line 14

def initialize(isource, offset = 0, fat = false)
  _parse_mach_header(isource, offset)
  if fat == true
    self.fat_offset = offset
  else
    self.fat_offset = 0
  end

  self.isource = isource
end

Instance Attribute Details

#archObject

Returns the value of attribute arch


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def arch
  @arch
end

#bitsObject

Returns the value of attribute bits


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def bits
  @bits
end

#endianObject

Returns the value of attribute endian


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def endian
  @endian
end

#fat_offsetObject

Returns the value of attribute fat_offset


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def fat_offset
  @fat_offset
end

#isourceObject

Returns the value of attribute isource


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def isource
  @isource
end

#mach_headerObject

Returns the value of attribute mach_header


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def mach_header
  @mach_header
end

#segmentsObject

Returns the value of attribute segments


12
13
14
# File 'lib/rex/machparsey/mach.rb', line 12

def segments
  @segments
end

Class Method Details

.new_from_file(filename, disk_backed = false) ⇒ Object


61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rex/machparsey/mach.rb', line 61

def self.new_from_file(filename, disk_backed = false)

  file = ::File.open(filename, "rb")

  if disk_backed
    return self.new(ImageSource::Disk.new(file))
  else
    obj = new_from_string(file.read)
    file.close
    return obj
  end
end

.new_from_string(data) ⇒ Object


74
75
76
# File 'lib/rex/machparsey/mach.rb', line 74

def self.new_from_string(data)
  return self.new(ImageSource::Memory.new(data))
end

Instance Method Details

#_parse_mach_header(isource, offset) ⇒ Object


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/rex/machparsey/mach.rb', line 25

def _parse_mach_header(isource, offset)
  self.mach_header = MachHeader.new(isource.read(offset, MACH_HEADER_SIZE_64))
  bits = mach_header.bits
  endian = mach_header.endian
  ncmds = mach_header.ncmds

  if bits == BITS_32
    offset += MACH_HEADER_SIZE
  else
    offset += MACH_HEADER_SIZE_64
  end


  segments = []
  ncmds.times do
    load_command = LoadCommand.new(isource.read(offset, LOAD_COMMAND_SIZE), endian)

    case load_command.cmd
      when LC_SEGMENT
        segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE), bits, endian)
      when LC_SEGMENT_64
        segments << Segment.new(isource.read(offset, SEGMENT_COMMAND_SIZE_64), bits, endian)
    end

    offset += load_command.cmdsize
  end

  self.mach_header = mach_header
  self.segments = segments
  self.isource = isource
  self.bits = bits
  self.endian = endian

  return segments
end

#closeObject


98
99
100
# File 'lib/rex/machparsey/mach.rb', line 98

def close
  isource.close
end

#index(*args) ⇒ Object


94
95
96
# File 'lib/rex/machparsey/mach.rb', line 94

def index(*args)
  isource.index(*args)
end

#ptr_32?Boolean

Returns:

  • (Boolean)

82
83
84
# File 'lib/rex/machparsey/mach.rb', line 82

def ptr_32?
  ptr_64? == false
end

#ptr_64?Boolean

Returns:

  • (Boolean)

78
79
80
# File 'lib/rex/machparsey/mach.rb', line 78

def ptr_64?
  mach_header.bits == BITS_64
end

#ptr_s(vaddr) ⇒ Object


86
87
88
# File 'lib/rex/machparsey/mach.rb', line 86

def ptr_s(vaddr)
  (ptr_32?) ? ("0x%.8x" % vaddr) : ("0x%.16x" % vaddr)
end

#read(offset, len) ⇒ Object


90
91
92
# File 'lib/rex/machparsey/mach.rb', line 90

def read(offset, len)
  isource.read(fat_offset + offset, len)
end