Module: Rex::Arch

Defined in:
lib/rex/arch.rb,
lib/rex/arch/arm.rb,
lib/rex/arch/x86.rb,
lib/rex/arch/amd64.rb,
lib/rex/arch/ppc32.rb,
lib/rex/arch/ppc64.rb,
lib/rex/arch/sparc.rb,
lib/rex/arch/zarch.rb,
lib/rex/arch/mips32.rb,
lib/rex/arch/mips64.rb,
lib/rex/arch/aarch64.rb,
lib/rex/arch/riscv32.rb,
lib/rex/arch/riscv64.rb,
lib/rex/arch/version.rb,
lib/rex/arch/loongarch64.rb

Overview

This module provides generalized methods for performing operations that are architecture specific. Furthermore, the modules contained within this module provide features that are specific to a given architecture.

Defined Under Namespace

Modules: AArch64, AMD64, ARM, LoongArch64, MIPS32, MIPS64, PPC32, PPC64, RISCV32, RISCV64, Sparc, X86, ZArch

Constant Summary collapse

ARCH_ANY =

Architecture constants

'_any_'
ARCH_ALL =
ARCH_TYPES   =
[
  ARCH_X86         = 'x86',
  ARCH_X86_64      = 'x86_64',
  ARCH_X64         = 'x64', # To be used for compatability with ARCH_X86_64
  ARCH_MIPS        = 'mips',
  ARCH_MIPSLE      = 'mipsle',
  ARCH_MIPSBE      = 'mipsbe',
  ARCH_MIPS64      = 'mips64',
  ARCH_MIPS64LE    = 'mips64le',
  ARCH_PPC         = 'ppc',
  ARCH_PPCE500V2   = 'ppce500v2',
  ARCH_PPC64       = 'ppc64',
  ARCH_PPC64LE     = 'ppc64le',
  ARCH_CBEA        = 'cbea',
  ARCH_CBEA64      = 'cbea64',
  ARCH_SPARC       = 'sparc',
  ARCH_SPARC64     = 'sparc64',
  ARCH_ARMLE       = 'armle',
  ARCH_ARMBE       = 'armbe',
  ARCH_AARCH64     = 'aarch64',
  ARCH_CMD         = 'cmd',
  ARCH_PHP         = 'php',
  ARCH_TTY         = 'tty',
  ARCH_JAVA        = 'java',
  ARCH_RUBY        = 'ruby',
  ARCH_DALVIK      = 'dalvik',
  ARCH_PYTHON      = 'python',
  ARCH_NODEJS      = 'nodejs',
  ARCH_FIREFOX     = 'firefox',
  ARCH_ZARCH       = 'zarch',
  ARCH_R           = 'r',
  ARCH_RISCV32BE   = 'riscv32be',
  ARCH_RISCV32LE   = 'riscv32le',
  ARCH_RISCV64BE   = 'riscv64be',
  ARCH_RISCV64LE   = 'riscv64le',
  ARCH_LOONGARCH64 = 'loongarch64',
]
ENDIAN_LITTLE =

Endian constants

0
ENDIAN_BIG =
1
IS_ENDIAN_LITTLE =
( [1].pack('s') == "\x01\x00" ) ? true : false
IS_ENDIAN_BIG =
( not IS_ENDIAN_LITTLE )
VERSION =
"0.1.20"

Class Method Summary collapse

Class Method Details

.adjust_stack_pointer(arch, adjustment) ⇒ Object

This routine adjusts the stack pointer for a given architecture.



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/rex/arch.rb', line 89

def self.adjust_stack_pointer(arch, adjustment)

  if arch.is_a?(::Array)
    arch = arch[0]
  end

  case arch
    when /x86/
      Rex::Arch::X86.adjust_reg(Rex::Arch::X86::ESP, adjustment)
    else
      nil
  end
end

.endian(arch) ⇒ Object

This routine reports the endianess of a given architecture



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/rex/arch.rb', line 161

def self.endian(arch)

  if ( arch.is_a?(::Array))
    arch = arch[0]
  end

  case arch
    when ARCH_X86
      return ENDIAN_LITTLE
    when ARCH_X86_64
      return ENDIAN_LITTLE
    when ARCH_X64
      return ENDIAN_LITTLE
    when ARCH_MIPS # ambiguous
      return ENDIAN_BIG
    when ARCH_MIPSLE
      return ENDIAN_LITTLE
    when ARCH_MIPSBE
      return ENDIAN_BIG
    when ARCH_MIPS64
      return ENDIAN_BIG
    when ARCH_MIPS64LE
      return ENDIAN_LITTLE
    when ARCH_PPC  # ambiguous
      return ENDIAN_BIG
    when ARCH_PPCE500V2
      return ENDIAN_BIG
    when ARCH_PPC64LE
      return ENDIAN_LITTLE
    when ARCH_SPARC
      return ENDIAN_BIG
    when ARCH_SPARC64
      return ENDIAN_BIG
    when ARCH_ARMLE
      return ENDIAN_LITTLE
    when ARCH_ARMBE
      return ENDIAN_BIG
    when ARCH_AARCH64
      return ENDIAN_LITTLE
    when ARCH_ZARCH
      return ENDIAN_BIG
    when ARCH_RISCV32BE
      return ENDIAN_BIG
    when ARCH_RISCV32LE
      return ENDIAN_LITTLE
    when ARCH_RISCV64BE
      return ENDIAN_BIG
    when ARCH_RISCV64LE
      return ENDIAN_LITTLE
    when ARCH_LOONGARCH64
      return ENDIAN_LITTLE
  end

  return ENDIAN_LITTLE
end

.from_uname(uname_arch) ⇒ Object

This routine maps the output of ‘uname -m` to a Rex architecture constant. Returns nil if the architecture is not recognized.



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/rex/arch.rb', line 221

def self.from_uname(uname_arch)
  case uname_arch.to_s.downcase.strip
  when 'x86_64', 'x64', 'amd64'
    ARCH_X64
  when 'i686', 'i386', 'i486', 'i586'
    ARCH_X86
  when 'aarch64', 'arm64'
    ARCH_AARCH64
  when /\Aarmv[0-9].*l\Z/
    ARCH_ARMLE
  when /\Aarmv[0-9].*b\Z/
    ARCH_ARMBE
  when 'mips'
    ARCH_MIPSBE
  when 'mipsel'
    ARCH_MIPSLE
  when 'mips64'
    ARCH_MIPS64
  when 'mips64el'
    ARCH_MIPS64LE
  when 'ppc'
    ARCH_PPC
  when 'ppc64'
    ARCH_PPC64
  when 'ppc64le'
    ARCH_PPC64LE
  when 's390x'
    ARCH_ZARCH
  when 'sparc'
    ARCH_SPARC
  when 'sparc64'
    ARCH_SPARC64
  when 'riscv32'
    ARCH_RISCV32LE
  when 'riscv64'
    ARCH_RISCV64LE
  when 'loongarch64'
    ARCH_LOONGARCH64
  end
end

.pack_addr(arch, addr) ⇒ Object

This route provides address packing for the specified arch



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
# File 'lib/rex/arch.rb', line 106

def self.pack_addr(arch, addr)

  if ( arch.is_a?(::Array))
    arch = arch[0]
  end

  case arch
    when ARCH_X86
      [addr].pack('V')
    when ARCH_X86_64, ARCH_X64
      [addr].pack('Q<')
    when ARCH_MIPS # ambiguous
      [addr].pack('N')
    when ARCH_MIPSBE
      [addr].pack('N')
    when ARCH_MIPSLE
      [addr].pack('V')
    when ARCH_MIPS64
      [addr].pack('Q>')
    when ARCH_MIPS64LE
      [addr].pack('Q<')
    when ARCH_PPC  # ambiguous
      [addr].pack('N')
    when ARCH_PPCE500V2
      [addr].pack('N')
    when ARCH_PPC64LE
      [addr].pack('Q<')
    when ARCH_SPARC
      [addr].pack('N')
    when ARCH_SPARC64
      [addr].pack('Q>')
    when ARCH_ARMLE
      [addr].pack('V')
    when ARCH_ARMBE
      [addr].pack('N')
    when ARCH_AARCH64
      [addr].pack('Q<')
    when ARCH_ZARCH
      [addr].pack('Q>')
    when ARCH_RISCV32BE
      [addr].pack('N')
    when ARCH_RISCV32LE
      [addr].pack('V')
    when ARCH_RISCV64BE
      [addr].pack('Q>')
    when ARCH_RISCV64LE
      [addr].pack('Q<')
    when ARCH_LOONGARCH64
      [addr].pack('Q<')
  end
end