Class: Rex::MachParsey::Fat

Inherits:
FatBase
  • Object
show all
Defined in:
lib/rex/machparsey/mach.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(isource, offset = 0) ⇒ Fat

Returns a new instance of Fat.



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/rex/machparsey/mach.rb', line 107

def initialize(isource, offset = 0)
	self.fat_archs = []
	self.machos = []
	self.isource = isource
	self.fat_header = FatHeader.new(isource.read(offset, FAT_HEADER_SIZE))
		
	if !self.fat_header
		raise FatHeaderError, "Could not parse FAT header"
	end
	
	print "Detected " +  self.fat_header.nfat_arch.to_s +  " archs in binary.\n"

	offset += FAT_HEADER_SIZE
	
	self.fat_header.nfat_arch.times do
		fat_arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.fat_header.endian)
		self.fat_archs << fat_arch
		self.machos << Mach.new(isource, fat_arch.offset, true) 
		offset += FAT_ARCH_SIZE
	end
	
	
end

Instance Attribute Details

#fat_archsObject

Returns the value of attribute fat_archs.



105
106
107
# File 'lib/rex/machparsey/mach.rb', line 105

def fat_archs
  @fat_archs
end

#fat_headerObject

Returns the value of attribute fat_header.



105
106
107
# File 'lib/rex/machparsey/mach.rb', line 105

def fat_header
  @fat_header
end

#isourceObject

Returns the value of attribute isource.



105
106
107
# File 'lib/rex/machparsey/mach.rb', line 105

def isource
  @isource
end

#machosObject

Returns the value of attribute machos.



105
106
107
# File 'lib/rex/machparsey/mach.rb', line 105

def machos
  @machos
end

Class Method Details

.new_from_file(filename, disk_backed = false) ⇒ Object



163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/rex/machparsey/mach.rb', line 163

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



177
178
179
# File 'lib/rex/machparsey/mach.rb', line 177

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

Instance Method Details

#_parse_fat_header(isource, offset) ⇒ Object

this is useful for debugging but we don’t use it for anything.



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/rex/machparsey/mach.rb', line 132

def _parse_fat_header(isource, offset)
	archs = []
	nfat_arch = self.fat_header.nfat_arch

	print "Number of archs in binary: " + nfat_arch.to_s + "\n"

	nfat_arch.times do
		arch = FatArch.new(isource.read(offset, FAT_ARCH_SIZE), self.endian)
	
		case arch.cpu_type

		when CPU_TYPE_I386
			print "i386\n"
		
		when CPU_TYPE_X86_64
			print "x86_64\n"
		
		when CPU_TYPE_ARM
			print "Arm\n"
		
		when CPU_TYPE_POWERPC
			print "Power PC\n"
		
		when CPU_TYPE_POWERPC64
			print "Power PC 64\n"
		end
	
		offset += FAT_ARCH_SIZE
	end
end

#closeObject



201
202
203
# File 'lib/rex/machparsey/mach.rb', line 201

def close
	isource.close
end

#index(*args) ⇒ Object



197
198
199
# File 'lib/rex/machparsey/mach.rb', line 197

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

#ptr_32?Boolean

Returns:

  • (Boolean)


185
186
187
# File 'lib/rex/machparsey/mach.rb', line 185

def ptr_32?
	ptr_64? == false
end

#ptr_64?Boolean

Returns:

  • (Boolean)


181
182
183
# File 'lib/rex/machparsey/mach.rb', line 181

def ptr_64?
	mach_header.bits == BITS_64		
end

#ptr_s(vaddr) ⇒ Object



189
190
191
# File 'lib/rex/machparsey/mach.rb', line 189

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

#read(offset, len) ⇒ Object



193
194
195
# File 'lib/rex/machparsey/mach.rb', line 193

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