module Rex::Arch

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.

Constants

ARCH_ALL
ARCH_ANY

Architecture constants

ENDIAN_BIG
ENDIAN_LITTLE

Endian constants

IS_ENDIAN_BIG
IS_ENDIAN_LITTLE
VERSION

Public Class Methods

adjust_stack_pointer(arch, adjustment) click to toggle source

This routine adjusts the stack pointer for a given architecture.

# File lib/rex/arch.rb, line 72
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) click to toggle source

This routine reports the endianess of a given architecture

# File lib/rex/arch.rb, line 134
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
  end

  return ENDIAN_LITTLE
end
pack_addr(arch, addr) click to toggle source

This route provides address packing for the specified arch

# File lib/rex/arch.rb, line 89
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>')
  end
end