mirror of
https://github.com/Vita3K/unicorn.git
synced 2024-11-24 13:59:58 +00:00
ruby binding added
This commit is contained in:
parent
d2ffea0e88
commit
5e72ce39f0
@ -7,6 +7,7 @@ The following bindings are contributed by community.
|
||||
- Go binding: by Ryan Hileman.
|
||||
- .NET binding: by Antonio Parata.
|
||||
- MSVC binding: by Zak Escano
|
||||
- Ruby binding: by Sascha Schirra
|
||||
|
||||
More bindings created & maintained externally by community are available as follows.
|
||||
|
||||
|
@ -24,6 +24,22 @@ template = {
|
||||
'comment_open': '#',
|
||||
'comment_close': '',
|
||||
},
|
||||
'ruby': {
|
||||
'header': "# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.rb]\n\nmodule Unicorn\n",
|
||||
'footer': "end",
|
||||
'line_format': '\tUC_%s = %s\n',
|
||||
'out_file': './ruby/unicorn_gem/lib/unicorn/%s_const.rb',
|
||||
# prefixes for constant filenames of all archs - case sensitive
|
||||
'arm.h': 'arm',
|
||||
'arm64.h': 'arm64',
|
||||
'mips.h': 'mips',
|
||||
'x86.h': 'x86',
|
||||
'sparc.h': 'sparc',
|
||||
'm68k.h': 'm68k',
|
||||
'unicorn.h': 'unicorn',
|
||||
'comment_open': '#',
|
||||
'comment_close': '',
|
||||
},
|
||||
'go': {
|
||||
'header': "package unicorn\n// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [%s_const.go]\nconst (\n",
|
||||
'footer': ")",
|
||||
|
11
bindings/ruby/Makefile
Normal file
11
bindings/ruby/Makefile
Normal file
@ -0,0 +1,11 @@
|
||||
# Ruby binding for Unicorn engine. Sascha Schirra <sashs@scoding.de>
|
||||
|
||||
.PHONY: gen_const
|
||||
|
||||
install:
|
||||
$(MAKE) gen_const
|
||||
cd unicorn_gem && rake build
|
||||
cd unicorn_gem && gem install --local pkg/unicorn-0.9.0.gem
|
||||
|
||||
gen_const:
|
||||
cd .. && python const_generator.py ruby
|
20
bindings/ruby/README.md
Normal file
20
bindings/ruby/README.md
Normal file
@ -0,0 +1,20 @@
|
||||
Installation
|
||||
============
|
||||
|
||||
1. Softwarerequirements
|
||||
|
||||
Linux
|
||||
- ruby >= 1.9.3
|
||||
- rubygems
|
||||
- make
|
||||
- gcc
|
||||
|
||||
Mac OS
|
||||
- ruby >= 1.9.3
|
||||
- rubygems
|
||||
- make
|
||||
- XCode
|
||||
|
||||
2. Install unicorn
|
||||
|
||||
|
511
bindings/ruby/sample_x86.rb
Normal file
511
bindings/ruby/sample_x86.rb
Normal file
@ -0,0 +1,511 @@
|
||||
#!/usr/bin/env ruby
|
||||
require 'unicorn'
|
||||
require 'unicorn/x86_const'
|
||||
|
||||
include Unicorn
|
||||
|
||||
X86_CODE32 = "\x41\x4a" # INC ecx; DEC edx
|
||||
X86_CODE32_LOOP = "\x41\x4a\xeb\xfe" # INC ecx; DEC edx; JMP self-loop
|
||||
X86_CODE32_MEM_READ = "\x8B\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov ecx,[0xaaaaaaaa]; INC ecx; DEC edx
|
||||
X86_CODE32_MEM_WRITE = "\x89\x0D\xAA\xAA\xAA\xAA\x41\x4a" # mov [0xaaaaaaaa], ecx; INC ecx; DEC edx
|
||||
X86_CODE64 = "\x41\xBC\x3B\xB0\x28\x2A\x49\x0F\xC9\x90\x4D\x0F\xAD\xCF\x49\x87\xFD\x90\x48\x81\xD2\x8A\xCE\x77\x35\x48\xF7\xD9\x4D\x29\xF4\x49\x81\xC9\xF6\x8A\xC6\x53\x4D\x87\xED\x48\x0F\xAD\xD2\x49\xF7\xD4\x48\xF7\xE1\x4D\x19\xC5\x4D\x89\xC5\x48\xF7\xD6\x41\xB8\x4F\x8D\x6B\x59\x4D\x87\xD0\x68\x6A\x1E\x09\x3C\x59"
|
||||
X86_CODE32_INOUT = "\x41\xE4\x3F\x4a\xE6\x46\x43" # INC ecx; IN AL, 0x3f; DEC edx; OUT 0x46, AL; INC ebx
|
||||
X86_CODE64_SYSCALL = "\x0f\x05" # SYSCALL
|
||||
X86_CODE16 = "\x00\x00" # add byte ptr [bx + si], al
|
||||
|
||||
# memory address where emulation starts
|
||||
ADDRESS = 0x1000000
|
||||
|
||||
|
||||
# callback for tracing basic blocks
|
||||
HOOK_BLOCK = Proc.new do |uc, address, size, user_data |
|
||||
puts(">>> Tracing basic block at 0x%x, block size = 0x%x" % [address, size])
|
||||
end
|
||||
|
||||
# callback for tracing instructions
|
||||
HOOK_CODE = Proc.new do |uc, address, size, user_data|
|
||||
puts(">>> Tracing instruction at 0x%x, instruction size = %u" % [address, size])
|
||||
end
|
||||
|
||||
|
||||
# callback for tracing invalid memory access (READ or WRITE)
|
||||
HOOK_MEM_INVALID = lambda do |uc, access, address, size, value, user_data|
|
||||
if access == UC_MEM_WRITE_UNMAPPED
|
||||
puts(">>> Missing memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" % [address, size, value])
|
||||
# map this memory in with 2MB in size
|
||||
uc.mem_map(0xaaaa0000, 2 * 1024*1024)
|
||||
# return True to indicate we want to continue emulation
|
||||
return true
|
||||
else
|
||||
puts(">>> Missing memory is being READ at 0x%x" % address)
|
||||
# return False to indicate we want to stop emulation
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# callback for tracing memory access (READ or WRITE)
|
||||
HOOK_MEM_ACCESS = Proc.new do |uc, access, address, size, value, user_data|
|
||||
if access == UC_MEM_WRITE
|
||||
puts(">>> Memory is being WRITE at 0x%x, data size = %u, data value = 0x%x" % [address, size, value])
|
||||
else # READ
|
||||
puts(">>> Memory is being READ at 0x%x, data size = %u" % [address, size])
|
||||
end
|
||||
end
|
||||
|
||||
# callback for IN instruction
|
||||
HOOK_IN = lambda do |uc, port, size, user_data|
|
||||
eip = uc.reg_read(UC_X86_REG_EIP)
|
||||
puts("--- reading from port 0x%x, size: %u, address: 0x%x" % [port, size, eip])
|
||||
if size == 1
|
||||
# read 1 byte to AL
|
||||
return 0xf1
|
||||
end
|
||||
if size == 2
|
||||
# read 2 byte to AX
|
||||
return 0xf2
|
||||
end
|
||||
if size == 4
|
||||
# read 4 byte to EAX
|
||||
return 0xf4
|
||||
end
|
||||
# we should never reach here
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
# callback for OUT instruction
|
||||
HOOK_OUT = Proc.new do |uc, port, size, value, user_data|
|
||||
|
||||
eip = uc.reg_read(UC_X86_REG_EIP)
|
||||
puts("--- writing to port 0x%x, size: %u, value: 0x%x, address: 0x%x" % [port, size, value, eip])
|
||||
|
||||
# confirm that value is indeed the value of AL/AX/EAX
|
||||
v = 0
|
||||
if size == 1
|
||||
# read 1 byte in AL
|
||||
v = uc.reg_read(UC_X86_REG_AL)
|
||||
end
|
||||
if size == 2
|
||||
# read 2 bytes in AX
|
||||
v = uc.reg_read(UC_X86_REG_AX)
|
||||
end
|
||||
if size == 4
|
||||
# read 4 bytes in EAX
|
||||
v = uc.reg_read(UC_X86_REG_EAX)
|
||||
end
|
||||
|
||||
puts("--- register value = 0x%x" %v)
|
||||
end
|
||||
|
||||
|
||||
# Test X86 32 bit
|
||||
def test_i386()
|
||||
puts("Emulate i386 code")
|
||||
begin
|
||||
# Initialize emulator in X86-32bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_32
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE32)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_ECX, 0x1234)
|
||||
mu.reg_write(UC_X86_REG_EDX, 0x7890)
|
||||
|
||||
# tracing all basic blocks with customized callback
|
||||
mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK)
|
||||
|
||||
# tracing all instructions with customized callback
|
||||
mu.hook_add(UC_HOOK_CODE, HOOK_CODE)
|
||||
mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED, HOOK_MEM_INVALID)
|
||||
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE32.bytesize)
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
r_ecx = mu.reg_read(UC_X86_REG_ECX)
|
||||
r_edx = mu.reg_read(UC_X86_REG_EDX)
|
||||
puts(">>> ECX = 0x%x" % r_ecx)
|
||||
puts(">>> EDX = 0x%x" % r_edx)
|
||||
|
||||
# read from memory
|
||||
tmp = mu.mem_read(ADDRESS, 2)
|
||||
print(">>> Read 2 bytes from [0x%x] =" % (ADDRESS))
|
||||
tmp.each_byte { |i| print(" 0x%x" % i) }
|
||||
|
||||
|
||||
puts
|
||||
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_i386_loop()
|
||||
puts("Emulate i386 code with infinite loop - wait for 2 seconds then stop emulation")
|
||||
begin
|
||||
# Initialize emulator in X86-32bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_32
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE32_LOOP)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_ECX, 0x1234)
|
||||
mu.reg_write(UC_X86_REG_EDX, 0x7890)
|
||||
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_LOOP.bytesize, 2 * UC_SECOND_SCALE)
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
r_ecx = mu.reg_read(UC_X86_REG_ECX)
|
||||
r_edx = mu.reg_read(UC_X86_REG_EDX)
|
||||
puts(">>> ECX = 0x%x" % r_ecx)
|
||||
puts(">>> EDX = 0x%x" % r_edx)
|
||||
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_i386_invalid_mem_read()
|
||||
puts("Emulate i386 code that read from invalid memory")
|
||||
begin
|
||||
# Initialize emulator in X86-32bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_32
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE32_MEM_READ)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_ECX, 0x1234)
|
||||
mu.reg_write(UC_X86_REG_EDX, 0x7890)
|
||||
|
||||
# tracing all basic blocks with customized callback
|
||||
mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK)
|
||||
|
||||
# tracing all instructions with customized callback
|
||||
mu.hook_add(UC_HOOK_CODE, HOOK_CODE)
|
||||
|
||||
begin
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_READ.bytesize)
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
r_ecx = mu.reg_read(UC_X86_REG_ECX)
|
||||
r_edx = mu.reg_read(UC_X86_REG_EDX)
|
||||
puts(">>> ECX = 0x%x" % r_ecx)
|
||||
puts(">>> EDX = 0x%x" % r_edx)
|
||||
|
||||
rescue UcError => e
|
||||
print("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_i386_invalid_mem_write()
|
||||
puts("Emulate i386 code that write to invalid memory")
|
||||
begin
|
||||
# Initialize emulator in X86-32bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_32
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE32_MEM_WRITE)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_ECX, 0x1234)
|
||||
mu.reg_write(UC_X86_REG_EDX, 0x7890)
|
||||
|
||||
# tracing all basic blocks with customized callback
|
||||
#mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK)
|
||||
|
||||
# tracing all instructions with customized callback
|
||||
#mu.hook_add(UC_HOOK_CODE, HOOK_CODE)
|
||||
|
||||
# intercept invalid memory events
|
||||
mu.hook_add(UC_HOOK_MEM_READ_UNMAPPED | UC_HOOK_MEM_WRITE_UNMAPPED, HOOK_MEM_INVALID)
|
||||
|
||||
begin
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_MEM_WRITE.bytesize)
|
||||
rescue UcError => e
|
||||
puts "ERROR: %s" % e
|
||||
end
|
||||
|
||||
# now print out some registers
|
||||
puts ">>> Emulation done. Below is the CPU context"
|
||||
|
||||
r_ecx = mu.reg_read(UC_X86_REG_ECX)
|
||||
r_edx = mu.reg_read(UC_X86_REG_EDX)
|
||||
puts ">>> ECX = 0x%x" % r_ecx
|
||||
puts ">>> EDX = 0x%x" % r_edx
|
||||
|
||||
begin
|
||||
# read from memory
|
||||
print ">>> Read 4 bytes from [0x%x] = " % (0xaaaaaaaa)
|
||||
tmp = mu.mem_read(0xaaaaaaaa, 4)
|
||||
tmp.each_byte { |i| print(" 0x%x" % i) }
|
||||
puts
|
||||
|
||||
print ">>> Read 4 bytes from [0x%x] = " % 0xffffffaa
|
||||
tmp = mu.mem_read(0xffffffaa, 4)
|
||||
tmp.each_byte { |i| puts(" 0x%x" % i) }
|
||||
puts
|
||||
|
||||
rescue UcError => e
|
||||
puts "ERROR: %s" % e
|
||||
end
|
||||
|
||||
rescue UcError => e
|
||||
puts "ERROR: %s" % e
|
||||
end
|
||||
end
|
||||
|
||||
# Test X86 32 bit with IN/OUT instruction
|
||||
def test_i386_inout()
|
||||
puts("Emulate i386 code with IN/OUT instructions")
|
||||
begin
|
||||
# Initialize emulator in X86-32bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_32
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE32_INOUT)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_EAX, 0x1234)
|
||||
mu.reg_write(UC_X86_REG_ECX, 0x6789)
|
||||
|
||||
# tracing all basic blocks with customized callback
|
||||
mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK)
|
||||
|
||||
# tracing all instructions with customized callback
|
||||
mu.hook_add(UC_HOOK_CODE, HOOK_CODE)
|
||||
|
||||
# handle IN & OUT instruction
|
||||
mu.hook_add(UC_HOOK_INSN, HOOK_IN, nil, 1, 0, UC_X86_INS_IN)
|
||||
mu.hook_add(UC_HOOK_INSN, HOOK_OUT, nil, 1, 0, UC_X86_INS_OUT)
|
||||
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE32_INOUT.bytesize)
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
r_ecx = mu.reg_read(UC_X86_REG_ECX)
|
||||
r_eax = mu.reg_read(UC_X86_REG_EAX)
|
||||
puts ">>> EAX = 0x%x" % r_eax
|
||||
puts ">>> ECX = 0x%x" % r_ecx
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_x86_64()
|
||||
puts("Emulate x86_64 code")
|
||||
begin
|
||||
# Initialize emulator in X86-64bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_64
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE64)
|
||||
|
||||
# initialize machine registers
|
||||
mu.reg_write(UC_X86_REG_RAX, 0x71f3029efd49d41d)
|
||||
mu.reg_write(UC_X86_REG_RBX, 0xd87b45277f133ddb)
|
||||
mu.reg_write(UC_X86_REG_RCX, 0xab40d1ffd8afc461)
|
||||
mu.reg_write(UC_X86_REG_RDX, 0x919317b4a733f01)
|
||||
mu.reg_write(UC_X86_REG_RSI, 0x4c24e753a17ea358)
|
||||
mu.reg_write(UC_X86_REG_RDI, 0xe509a57d2571ce96)
|
||||
mu.reg_write(UC_X86_REG_R8, 0xea5b108cc2b9ab1f)
|
||||
mu.reg_write(UC_X86_REG_R9, 0x19ec097c8eb618c1)
|
||||
mu.reg_write(UC_X86_REG_R10, 0xec45774f00c5f682)
|
||||
mu.reg_write(UC_X86_REG_R11, 0xe17e9dbec8c074aa)
|
||||
mu.reg_write(UC_X86_REG_R12, 0x80f86a8dc0f6d457)
|
||||
mu.reg_write(UC_X86_REG_R13, 0x48288ca5671c5492)
|
||||
mu.reg_write(UC_X86_REG_R14, 0x595f72f6e4017f6e)
|
||||
mu.reg_write(UC_X86_REG_R15, 0x1efd97aea331cccc)
|
||||
|
||||
# setup stack
|
||||
mu.reg_write(UC_X86_REG_RSP, ADDRESS + 0x200000)
|
||||
|
||||
# tracing all basic blocks with customized callback
|
||||
mu.hook_add(UC_HOOK_BLOCK, HOOK_BLOCK)
|
||||
|
||||
# tracing all instructions in range [ADDRESS, ADDRESS+20]
|
||||
mu.hook_add(UC_HOOK_CODE, HOOK_CODE, 0, ADDRESS, ADDRESS+20)
|
||||
|
||||
# tracing all memory READ & WRITE access
|
||||
mu.hook_add(UC_HOOK_MEM_WRITE, HOOK_MEM_ACCESS)
|
||||
mu.hook_add(UC_HOOK_MEM_READ, HOOK_MEM_ACCESS)
|
||||
# actually you can also use READ_WRITE to trace all memory access
|
||||
#mu.hook_add(UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE, hook_mem_access)
|
||||
|
||||
begin
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE64.bytesize)
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
rax = mu.reg_read(UC_X86_REG_RAX)
|
||||
rbx = mu.reg_read(UC_X86_REG_RBX)
|
||||
rcx = mu.reg_read(UC_X86_REG_RCX)
|
||||
rdx = mu.reg_read(UC_X86_REG_RDX)
|
||||
rsi = mu.reg_read(UC_X86_REG_RSI)
|
||||
rdi = mu.reg_read(UC_X86_REG_RDI)
|
||||
r8 = mu.reg_read(UC_X86_REG_R8)
|
||||
r9 = mu.reg_read(UC_X86_REG_R9)
|
||||
r10 = mu.reg_read(UC_X86_REG_R10)
|
||||
r11 = mu.reg_read(UC_X86_REG_R11)
|
||||
r12 = mu.reg_read(UC_X86_REG_R12)
|
||||
r13 = mu.reg_read(UC_X86_REG_R13)
|
||||
r14 = mu.reg_read(UC_X86_REG_R14)
|
||||
r15 = mu.reg_read(UC_X86_REG_R15)
|
||||
|
||||
puts(">>> RAX = %d" % rax)
|
||||
puts(">>> RBX = %d" % rbx)
|
||||
puts(">>> RCX = %d" % rcx)
|
||||
puts(">>> RDX = %d" % rdx)
|
||||
puts(">>> RSI = %d" % rsi)
|
||||
puts(">>> RDI = %d" % rdi)
|
||||
puts(">>> R8 = %d" % r8)
|
||||
puts(">>> R9 = %d" % r9)
|
||||
puts(">>> R10 = %d" % r10)
|
||||
puts(">>> R11 = %d" % r11)
|
||||
puts(">>> R12 = %d" % r12)
|
||||
puts(">>> R13 = %d" % r13)
|
||||
puts(">>> R14 = %d" % r14)
|
||||
puts(">>> R15 = %d" % r15)
|
||||
#BUG
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE64.bytesize)
|
||||
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_x86_64_syscall()
|
||||
puts("Emulate x86_64 code with 'syscall' instruction")
|
||||
begin
|
||||
# Initialize emulator in X86-64bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_64
|
||||
|
||||
# map 2MB memory for this emulation
|
||||
mu.mem_map(ADDRESS, 2 * 1024 * 1024)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(ADDRESS, X86_CODE64_SYSCALL)
|
||||
|
||||
hook_syscall = Proc.new do |mu, user_data|
|
||||
rax = mu.reg_read(UC_X86_REG_RAX)
|
||||
if rax == 0x100
|
||||
mu.reg_write(UC_X86_REG_RAX, 0x200)
|
||||
else
|
||||
puts('ERROR: was not expecting rax=%d in syscall' % rax)
|
||||
end
|
||||
end
|
||||
|
||||
# hook interrupts for syscall
|
||||
mu.hook_add(UC_HOOK_INSN, hook_syscall, nil, 1, 0, UC_X86_INS_SYSCALL)
|
||||
|
||||
# syscall handler is expecting rax=0x100
|
||||
mu.reg_write(UC_X86_REG_RAX, 0x100)
|
||||
|
||||
begin
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(ADDRESS, ADDRESS + X86_CODE64_SYSCALL.bytesize)
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
rax = mu.reg_read(UC_X86_REG_RAX)
|
||||
puts(">>> RAX = 0x%x" % rax)
|
||||
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def test_x86_16()
|
||||
puts("Emulate x86 16-bit code")
|
||||
begin
|
||||
# Initialize emulator in X86-16bit mode
|
||||
mu = Uc.new UC_ARCH_X86, UC_MODE_16
|
||||
|
||||
# map 8KB memory for this emulation
|
||||
mu.mem_map(0, 8 * 1024)
|
||||
|
||||
# set CPU registers
|
||||
mu.reg_write(UC_X86_REG_EAX, 7)
|
||||
mu.reg_write(UC_X86_REG_EBX, 5)
|
||||
mu.reg_write(UC_X86_REG_ESI, 6)
|
||||
|
||||
# write machine code to be emulated to memory
|
||||
mu.mem_write(0, X86_CODE16)
|
||||
|
||||
# emulate machine code in infinite time
|
||||
mu.emu_start(0, X86_CODE16.bytesize)
|
||||
|
||||
# now print out some registers
|
||||
puts(">>> Emulation done. Below is the CPU context")
|
||||
|
||||
tmp = mu.mem_read(11, 1)
|
||||
puts("[0x%x] = 0x%x" % [11, tmp[0].ord])
|
||||
|
||||
rescue UcError => e
|
||||
puts("ERROR: %s" % e)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
test_i386()
|
||||
puts("=" * 20)
|
||||
test_i386_loop()
|
||||
puts("=" * 20)
|
||||
test_i386_invalid_mem_read()
|
||||
puts("=" * 20)
|
||||
test_i386_invalid_mem_write()
|
||||
puts("=" * 20)
|
||||
test_i386_inout()
|
||||
puts("=" * 20)
|
||||
test_x86_64()
|
||||
puts("=" * 20)
|
||||
test_x86_64_syscall()
|
||||
puts("=" * 20)
|
||||
test_x86_16()
|
3
bindings/ruby/unicorn_gem/Gemfile
Normal file
3
bindings/ruby/unicorn_gem/Gemfile
Normal file
@ -0,0 +1,3 @@
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gemspec
|
2
bindings/ruby/unicorn_gem/Rakefile
Normal file
2
bindings/ruby/unicorn_gem/Rakefile
Normal file
@ -0,0 +1,2 @@
|
||||
require "bundler/gem_tasks"
|
||||
task :default => :spec
|
8
bindings/ruby/unicorn_gem/ext/extconf.rb
Normal file
8
bindings/ruby/unicorn_gem/ext/extconf.rb
Normal file
@ -0,0 +1,8 @@
|
||||
require 'mkmf'
|
||||
|
||||
extension_name = 'unicorn'
|
||||
|
||||
dir_config(extension_name)
|
||||
have_library('unicorn')
|
||||
|
||||
create_makefile(extension_name)
|
454
bindings/ruby/unicorn_gem/ext/unicorn.c
Normal file
454
bindings/ruby/unicorn_gem/ext/unicorn.c
Normal file
@ -0,0 +1,454 @@
|
||||
/*
|
||||
|
||||
Ruby bindings for the Unicorn Emulator Engine
|
||||
|
||||
Copyright(c) 2016 Sascha Schirra
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
version 2 as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
#include "ruby.h"
|
||||
#include <unicorn/unicorn.h>
|
||||
#include <unicorn/x86.h>
|
||||
#include "unicorn.h"
|
||||
|
||||
VALUE UnicornModule = Qnil;
|
||||
VALUE UcClass = Qnil;
|
||||
VALUE UcError = Qnil;
|
||||
|
||||
|
||||
|
||||
void Init_unicorn() {
|
||||
rb_require("unicorn/unicorn_const");
|
||||
UnicornModule = rb_define_module("Unicorn");
|
||||
UcError = rb_define_class_under(UnicornModule, "UcError", rb_eStandardError);
|
||||
|
||||
UcClass = rb_define_class_under(UnicornModule, "Uc", rb_cObject);
|
||||
rb_define_method(UcClass, "initialize", m_uc_initialize, 2);
|
||||
rb_define_method(UcClass, "emu_start", m_uc_emu_start, -1);
|
||||
rb_define_method(UcClass, "emu_stop", m_uc_emu_stop, 0);
|
||||
rb_define_method(UcClass, "reg_read", m_uc_reg_read, 1);
|
||||
rb_define_method(UcClass, "reg_write", m_uc_reg_write, 2);
|
||||
rb_define_method(UcClass, "mem_read", m_uc_mem_read, 2);
|
||||
rb_define_method(UcClass, "mem_write", m_uc_mem_write, 2);
|
||||
rb_define_method(UcClass, "mem_map", m_uc_mem_map, -1);
|
||||
//rb_define_method(UcClass, "mem_map_ptr", m_uc_mem_map_pzt, 4);
|
||||
rb_define_method(UcClass, "mem_unmap", m_uc_mem_unmap, 2);
|
||||
rb_define_method(UcClass, "mem_protect", m_uc_mem_protect, 3);
|
||||
rb_define_method(UcClass, "hook_add", m_uc_hook_add, -1);
|
||||
rb_define_method(UcClass, "hook_del", m_uc_hook_del, 1);
|
||||
rb_define_method(UcClass, "query", m_uc_hook_del, 1);
|
||||
|
||||
|
||||
}
|
||||
|
||||
VALUE m_uc_initialize(VALUE self, VALUE arch, VALUE mode) {
|
||||
uc_engine *_uc;
|
||||
uc_err err;
|
||||
err = uc_open(NUM2INT(arch), NUM2INT(mode), &_uc);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
|
||||
VALUE uc = Data_Wrap_Struct(UcClass, 0, uc_close, _uc);
|
||||
rb_iv_set(self, "@uch", uc);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
VALUE m_uc_emu_start(int argc, VALUE* argv, VALUE self){
|
||||
VALUE begin;
|
||||
VALUE until;
|
||||
VALUE timeout;
|
||||
VALUE count;
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
|
||||
rb_scan_args(argc, argv, "22",&begin, &until, &timeout, &count);
|
||||
if (NIL_P(timeout))
|
||||
timeout = INT2NUM(0);
|
||||
|
||||
if (NIL_P(count))
|
||||
count = INT2NUM(0);
|
||||
|
||||
err = uc_emu_start(_uc, NUM2ULL(begin), NUM2ULL(until), NUM2INT(timeout), NUM2INT(count));
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_emu_stop(VALUE self){
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
|
||||
err = uc_emu_stop(_uc);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_reg_read(VALUE self, VALUE reg_id){
|
||||
|
||||
uc_err err;
|
||||
int32_t tmp_reg = NUM2INT(reg_id);
|
||||
int64_t reg_value = 0;
|
||||
VALUE to_ret;
|
||||
uc_x86_mmr mmr;
|
||||
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
switch(tmp_reg){
|
||||
case UC_X86_REG_GDTR:
|
||||
case UC_X86_REG_IDTR:
|
||||
case UC_X86_REG_LDTR:
|
||||
case UC_X86_REG_TR:
|
||||
mmr.selector = 0;
|
||||
mmr.base = 0;
|
||||
mmr.limit = 0;
|
||||
mmr.flags = 0;
|
||||
err = uc_reg_read(_uc, tmp_reg, &mmr);
|
||||
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
VALUE mmr_ary = rb_ary_new();
|
||||
reg_value = mmr.selector;
|
||||
rb_ary_store(mmr_ary, 0, UINT2NUM(reg_value));
|
||||
rb_ary_store(mmr_ary, 1, ULL2NUM(mmr.base));
|
||||
rb_ary_store(mmr_ary, 2, UINT2NUM(mmr.limit));
|
||||
rb_ary_store(mmr_ary, 3, UINT2NUM(mmr.flags));
|
||||
return mmr_ary;
|
||||
default:
|
||||
|
||||
err = uc_reg_read(_uc, tmp_reg, ®_value);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return LL2NUM(reg_value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
VALUE m_uc_reg_write(VALUE self, VALUE reg_id, VALUE reg_value){
|
||||
uc_err err;
|
||||
int32_t tmp_reg = NUM2INT(reg_id);
|
||||
uc_x86_mmr mmr;
|
||||
int64_t tmp;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
|
||||
switch(tmp_reg){
|
||||
case UC_X86_REG_GDTR:
|
||||
case UC_X86_REG_IDTR:
|
||||
case UC_X86_REG_LDTR:
|
||||
case UC_X86_REG_TR:
|
||||
Check_Type(reg_value, T_ARRAY);
|
||||
|
||||
mmr.selector = NUM2USHORT(rb_ary_entry(reg_value,0));
|
||||
mmr.base = NUM2ULL(rb_ary_entry(reg_value,1));
|
||||
mmr.limit = NUM2UINT(rb_ary_entry(reg_value,2));
|
||||
mmr.flags = NUM2UINT(rb_ary_entry(reg_value,3));
|
||||
err = uc_reg_write(_uc, tmp_reg, &mmr);
|
||||
break;
|
||||
default:
|
||||
tmp = NUM2ULL(reg_value);
|
||||
|
||||
err = uc_reg_write(_uc, NUM2INT(reg_id), &tmp);
|
||||
break;
|
||||
}
|
||||
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_mem_read(VALUE self, VALUE address, VALUE size){
|
||||
size_t isize = NUM2UINT(size);
|
||||
uint8_t bytes[isize];
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
|
||||
err = uc_mem_read(_uc, NUM2ULL(address), &bytes, isize);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return rb_str_new(bytes, isize);
|
||||
}
|
||||
|
||||
VALUE m_uc_mem_write(VALUE self, VALUE address, VALUE bytes){
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
err = uc_mem_write(_uc, NUM2ULL(address), StringValuePtr(bytes), RSTRING_LEN(bytes));
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_mem_map(int argc, VALUE* argv, VALUE self){
|
||||
uc_err err;
|
||||
VALUE address;
|
||||
VALUE size;
|
||||
VALUE perms;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
rb_scan_args(argc, argv, "21",&address, &size, &perms);
|
||||
if (NIL_P(perms))
|
||||
perms = INT2NUM(UC_PROT_ALL);
|
||||
|
||||
err = uc_mem_map(_uc, NUM2ULL(address), NUM2UINT(size), NUM2UINT(perms));
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
// VALUE m_uc_mem_map_ptr(VALUE self, VALUE address, VALUE size, VALUE perms, VALUE ptr){
|
||||
// uc_err err;
|
||||
|
||||
// err = uc_mem_map_ptr(_uc, NUM2INT(address), NUM2INT(size), NUM2INT(perms), NUM2INT(ptr));
|
||||
// if (err != UC_ERR_OK) {
|
||||
// rb_raise(UcError, "%s", uc_strerror(err));
|
||||
// }
|
||||
// return Qnil;
|
||||
// }
|
||||
|
||||
VALUE m_uc_mem_unmap(VALUE self, VALUE address, VALUE size){
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
_uc = (uc_engine*) NUM2ULL(rb_iv_get(self, "@uch"));
|
||||
err = uc_mem_unmap(_uc, NUM2ULL(address), NUM2UINT(size));
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_mem_protect(VALUE self, VALUE address, VALUE size, VALUE perms){
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
err = uc_mem_protect(_uc, NUM2ULL(address), NUM2UINT(size), NUM2UINT(perms));
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
static void cb_hook_code(uc_engine *uc, uint64_t address, uint32_t size, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
rb_funcall(cb, rb_intern("call"), 4, rUc, ULL2NUM(address), UINT2NUM(size), ud);
|
||||
|
||||
}
|
||||
|
||||
static void cb_hook_mem_access(uc_engine *uc, uint32_t access, uint64_t address, uint32_t size, int64_t value, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
|
||||
rb_funcall(cb, rb_intern("call"), 6, rUc, UINT2NUM(access), ULL2NUM(address), UINT2NUM(size), LL2NUM(value), ud);
|
||||
|
||||
}
|
||||
|
||||
static bool cb_hook_mem_invalid(uc_engine *uc, uint32_t access, uint64_t address, uint32_t size, int64_t value, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
return RTEST(rb_funcall(cb, rb_intern("call"), 6, rUc, UINT2NUM(access), ULL2NUM(address), UINT2NUM(size), LL2NUM(value), ud));
|
||||
}
|
||||
|
||||
static uint32_t cb_hook_insn_in(uc_engine *uc, uint32_t port, int size, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
return NUM2UINT(rb_funcall(cb, rb_intern("call"), 4, rUc, UINT2NUM(port), INT2NUM(size), ud));
|
||||
|
||||
}
|
||||
|
||||
static void cb_hook_insn_out(uc_engine *uc, uint32_t port, int size, uint32_t value, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
rb_funcall(cb, rb_intern("call"), 5, rUc, UINT2NUM(port), INT2NUM(size), UINT2NUM(value), ud);
|
||||
|
||||
}
|
||||
|
||||
static void cb_hook_insn_syscall(uc_engine *uc, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
rb_funcall(cb, rb_intern("call"), 2, rUc, ud);
|
||||
|
||||
}
|
||||
|
||||
static void cb_hook_intr(uc_engine *uc, uint64_t address, uint32_t size, int64_t value, void *user_data){
|
||||
VALUE passthrough = (VALUE)user_data;
|
||||
VALUE cb;
|
||||
VALUE ud;
|
||||
VALUE rUc;
|
||||
|
||||
cb = rb_ary_entry(passthrough, 0);
|
||||
ud = rb_ary_entry(passthrough, 1);
|
||||
rUc = rb_ary_entry(passthrough, 2);
|
||||
rb_funcall(cb, rb_intern("call"), 5, rUc, ULL2NUM(address), UINT2NUM(size), LL2NUM(value), ud);
|
||||
|
||||
}
|
||||
|
||||
|
||||
VALUE m_uc_hook_add(int argc, VALUE* argv, VALUE self){
|
||||
VALUE hook_type;
|
||||
VALUE callback;
|
||||
VALUE user_data;
|
||||
VALUE begin;
|
||||
VALUE end;
|
||||
VALUE arg1;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
rb_scan_args(argc, argv, "24",&hook_type, &callback, &user_data, &begin, &end, &arg1);
|
||||
if (NIL_P(begin))
|
||||
begin = ULL2NUM(1);
|
||||
|
||||
if (NIL_P(end))
|
||||
end = ULL2NUM(0);
|
||||
|
||||
if (NIL_P(arg1))
|
||||
arg1 = INT2NUM(0);
|
||||
|
||||
|
||||
VALUE passthrough;
|
||||
uc_hook trace;
|
||||
uc_err err;
|
||||
|
||||
|
||||
if (rb_class_of(callback) != rb_cProc)
|
||||
rb_raise(UcError, "Expected Proc callback");
|
||||
|
||||
passthrough = rb_ary_new();
|
||||
rb_ary_store(passthrough, 0, callback);
|
||||
rb_ary_store(passthrough, 1, user_data);
|
||||
rb_ary_store(passthrough, 2, self);
|
||||
|
||||
uint32_t htype = NUM2UINT(hook_type);
|
||||
if(htype == UC_HOOK_INSN){
|
||||
|
||||
switch(NUM2INT(arg1)){
|
||||
case UC_X86_INS_IN:
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_insn_in,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1));
|
||||
break;
|
||||
case UC_X86_INS_OUT:
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_insn_out,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1));
|
||||
break;
|
||||
case UC_X86_INS_SYSCALL:
|
||||
case UC_X86_INS_SYSENTER:
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_insn_syscall,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end), NUM2INT(arg1));
|
||||
break;
|
||||
}
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_intr,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end));
|
||||
}
|
||||
else if(htype == UC_HOOK_INTR){
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_intr,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end));
|
||||
}
|
||||
else if(htype == UC_HOOK_CODE || htype == UC_HOOK_BLOCK){
|
||||
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_code,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end));
|
||||
}
|
||||
else if (htype & UC_HOOK_MEM_READ_UNMAPPED
|
||||
|| htype & UC_HOOK_MEM_WRITE_UNMAPPED
|
||||
|| htype & UC_HOOK_MEM_FETCH_UNMAPPED
|
||||
|| htype & UC_HOOK_MEM_READ_PROT
|
||||
|| htype & UC_HOOK_MEM_WRITE_PROT
|
||||
|| htype & UC_HOOK_MEM_FETCH_PROT
|
||||
|| htype & UC_HOOK_MEM_READ_INVALID
|
||||
|| htype & UC_HOOK_MEM_WRITE_INVALID
|
||||
|| htype & UC_HOOK_MEM_FETCH_INVALID
|
||||
|| htype & UC_HOOK_MEM_UNMAPPED
|
||||
|| htype & UC_HOOK_MEM_PROT
|
||||
|| htype & UC_HOOK_MEM_INVALID) {
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_mem_invalid,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end));
|
||||
}
|
||||
else{
|
||||
err = uc_hook_add(_uc, &trace, htype, cb_hook_mem_access,(void *)passthrough, NUM2ULL(begin), NUM2ULL(end));
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return INT2NUM(trace);
|
||||
}
|
||||
|
||||
VALUE m_uc_hook_del(VALUE self, VALUE hook){
|
||||
int h = NUM2INT(hook);
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
err = uc_hook_del(_uc, h);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
VALUE m_uc_query(VALUE self, VALUE query_mode){
|
||||
int qm = NUM2INT(query_mode);
|
||||
size_t result;
|
||||
uc_err err;
|
||||
uc_engine *_uc;
|
||||
Data_Get_Struct(rb_iv_get(self,"@uch"), uc_engine, _uc);
|
||||
err = uc_query(_uc, qm, &result);
|
||||
if (err != UC_ERR_OK) {
|
||||
rb_raise(UcError, "%s", uc_strerror(err));
|
||||
}
|
||||
return INT2NUM(result);
|
||||
}
|
34
bindings/ruby/unicorn_gem/ext/unicorn.h
Normal file
34
bindings/ruby/unicorn_gem/ext/unicorn.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
|
||||
Ruby bindings for the Unicorn Emulator Engine
|
||||
|
||||
Copyright(c) 2016 Sascha Schirra
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
version 2 as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
VALUE m_uc_initialize(VALUE self, VALUE arch, VALUE mode);
|
||||
VALUE m_uc_emu_start(int argc, VALUE* argv, VALUE self);
|
||||
VALUE m_uc_emu_stop(VALUE self);
|
||||
VALUE m_uc_reg_read(VALUE self, VALUE reg_id);
|
||||
VALUE m_uc_reg_write(VALUE self, VALUE reg_id, VALUE reg_value);
|
||||
VALUE m_uc_mem_read(VALUE self, VALUE address, VALUE size);
|
||||
VALUE m_uc_mem_write(VALUE self, VALUE address, VALUE bytes);
|
||||
VALUE m_uc_mem_map(int argc, VALUE* argv, VALUE self);
|
||||
//VALUE m_uc_mem_map_ptr(VALUE self, VALUE address, VALUE size, VALUE perms, VALUE ptr);
|
||||
VALUE m_uc_mem_unmap(VALUE self, VALUE address, VALUE size);
|
||||
VALUE m_uc_mem_protect(VALUE self, VALUE address, VALUE size, VALUE perms);
|
||||
VALUE m_uc_hook_add(int argc, VALUE* argv, VALUE self);
|
||||
VALUE m_uc_hook_del(VALUE self, VALUE hook);
|
||||
VALUE m_uc_query(VALUE self, VALUE query_mode);
|
277
bindings/ruby/unicorn_gem/lib/unicorn/arm64_const.rb
Normal file
277
bindings/ruby/unicorn_gem/lib/unicorn/arm64_const.rb
Normal file
@ -0,0 +1,277 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm64_const.rb]
|
||||
|
||||
module Unicorn
|
||||
|
||||
# ARM64 registers
|
||||
|
||||
UC_ARM64_REG_INVALID = 0
|
||||
UC_ARM64_REG_X29 = 1
|
||||
UC_ARM64_REG_X30 = 2
|
||||
UC_ARM64_REG_NZCV = 3
|
||||
UC_ARM64_REG_SP = 4
|
||||
UC_ARM64_REG_WSP = 5
|
||||
UC_ARM64_REG_WZR = 6
|
||||
UC_ARM64_REG_XZR = 7
|
||||
UC_ARM64_REG_B0 = 8
|
||||
UC_ARM64_REG_B1 = 9
|
||||
UC_ARM64_REG_B2 = 10
|
||||
UC_ARM64_REG_B3 = 11
|
||||
UC_ARM64_REG_B4 = 12
|
||||
UC_ARM64_REG_B5 = 13
|
||||
UC_ARM64_REG_B6 = 14
|
||||
UC_ARM64_REG_B7 = 15
|
||||
UC_ARM64_REG_B8 = 16
|
||||
UC_ARM64_REG_B9 = 17
|
||||
UC_ARM64_REG_B10 = 18
|
||||
UC_ARM64_REG_B11 = 19
|
||||
UC_ARM64_REG_B12 = 20
|
||||
UC_ARM64_REG_B13 = 21
|
||||
UC_ARM64_REG_B14 = 22
|
||||
UC_ARM64_REG_B15 = 23
|
||||
UC_ARM64_REG_B16 = 24
|
||||
UC_ARM64_REG_B17 = 25
|
||||
UC_ARM64_REG_B18 = 26
|
||||
UC_ARM64_REG_B19 = 27
|
||||
UC_ARM64_REG_B20 = 28
|
||||
UC_ARM64_REG_B21 = 29
|
||||
UC_ARM64_REG_B22 = 30
|
||||
UC_ARM64_REG_B23 = 31
|
||||
UC_ARM64_REG_B24 = 32
|
||||
UC_ARM64_REG_B25 = 33
|
||||
UC_ARM64_REG_B26 = 34
|
||||
UC_ARM64_REG_B27 = 35
|
||||
UC_ARM64_REG_B28 = 36
|
||||
UC_ARM64_REG_B29 = 37
|
||||
UC_ARM64_REG_B30 = 38
|
||||
UC_ARM64_REG_B31 = 39
|
||||
UC_ARM64_REG_D0 = 40
|
||||
UC_ARM64_REG_D1 = 41
|
||||
UC_ARM64_REG_D2 = 42
|
||||
UC_ARM64_REG_D3 = 43
|
||||
UC_ARM64_REG_D4 = 44
|
||||
UC_ARM64_REG_D5 = 45
|
||||
UC_ARM64_REG_D6 = 46
|
||||
UC_ARM64_REG_D7 = 47
|
||||
UC_ARM64_REG_D8 = 48
|
||||
UC_ARM64_REG_D9 = 49
|
||||
UC_ARM64_REG_D10 = 50
|
||||
UC_ARM64_REG_D11 = 51
|
||||
UC_ARM64_REG_D12 = 52
|
||||
UC_ARM64_REG_D13 = 53
|
||||
UC_ARM64_REG_D14 = 54
|
||||
UC_ARM64_REG_D15 = 55
|
||||
UC_ARM64_REG_D16 = 56
|
||||
UC_ARM64_REG_D17 = 57
|
||||
UC_ARM64_REG_D18 = 58
|
||||
UC_ARM64_REG_D19 = 59
|
||||
UC_ARM64_REG_D20 = 60
|
||||
UC_ARM64_REG_D21 = 61
|
||||
UC_ARM64_REG_D22 = 62
|
||||
UC_ARM64_REG_D23 = 63
|
||||
UC_ARM64_REG_D24 = 64
|
||||
UC_ARM64_REG_D25 = 65
|
||||
UC_ARM64_REG_D26 = 66
|
||||
UC_ARM64_REG_D27 = 67
|
||||
UC_ARM64_REG_D28 = 68
|
||||
UC_ARM64_REG_D29 = 69
|
||||
UC_ARM64_REG_D30 = 70
|
||||
UC_ARM64_REG_D31 = 71
|
||||
UC_ARM64_REG_H0 = 72
|
||||
UC_ARM64_REG_H1 = 73
|
||||
UC_ARM64_REG_H2 = 74
|
||||
UC_ARM64_REG_H3 = 75
|
||||
UC_ARM64_REG_H4 = 76
|
||||
UC_ARM64_REG_H5 = 77
|
||||
UC_ARM64_REG_H6 = 78
|
||||
UC_ARM64_REG_H7 = 79
|
||||
UC_ARM64_REG_H8 = 80
|
||||
UC_ARM64_REG_H9 = 81
|
||||
UC_ARM64_REG_H10 = 82
|
||||
UC_ARM64_REG_H11 = 83
|
||||
UC_ARM64_REG_H12 = 84
|
||||
UC_ARM64_REG_H13 = 85
|
||||
UC_ARM64_REG_H14 = 86
|
||||
UC_ARM64_REG_H15 = 87
|
||||
UC_ARM64_REG_H16 = 88
|
||||
UC_ARM64_REG_H17 = 89
|
||||
UC_ARM64_REG_H18 = 90
|
||||
UC_ARM64_REG_H19 = 91
|
||||
UC_ARM64_REG_H20 = 92
|
||||
UC_ARM64_REG_H21 = 93
|
||||
UC_ARM64_REG_H22 = 94
|
||||
UC_ARM64_REG_H23 = 95
|
||||
UC_ARM64_REG_H24 = 96
|
||||
UC_ARM64_REG_H25 = 97
|
||||
UC_ARM64_REG_H26 = 98
|
||||
UC_ARM64_REG_H27 = 99
|
||||
UC_ARM64_REG_H28 = 100
|
||||
UC_ARM64_REG_H29 = 101
|
||||
UC_ARM64_REG_H30 = 102
|
||||
UC_ARM64_REG_H31 = 103
|
||||
UC_ARM64_REG_Q0 = 104
|
||||
UC_ARM64_REG_Q1 = 105
|
||||
UC_ARM64_REG_Q2 = 106
|
||||
UC_ARM64_REG_Q3 = 107
|
||||
UC_ARM64_REG_Q4 = 108
|
||||
UC_ARM64_REG_Q5 = 109
|
||||
UC_ARM64_REG_Q6 = 110
|
||||
UC_ARM64_REG_Q7 = 111
|
||||
UC_ARM64_REG_Q8 = 112
|
||||
UC_ARM64_REG_Q9 = 113
|
||||
UC_ARM64_REG_Q10 = 114
|
||||
UC_ARM64_REG_Q11 = 115
|
||||
UC_ARM64_REG_Q12 = 116
|
||||
UC_ARM64_REG_Q13 = 117
|
||||
UC_ARM64_REG_Q14 = 118
|
||||
UC_ARM64_REG_Q15 = 119
|
||||
UC_ARM64_REG_Q16 = 120
|
||||
UC_ARM64_REG_Q17 = 121
|
||||
UC_ARM64_REG_Q18 = 122
|
||||
UC_ARM64_REG_Q19 = 123
|
||||
UC_ARM64_REG_Q20 = 124
|
||||
UC_ARM64_REG_Q21 = 125
|
||||
UC_ARM64_REG_Q22 = 126
|
||||
UC_ARM64_REG_Q23 = 127
|
||||
UC_ARM64_REG_Q24 = 128
|
||||
UC_ARM64_REG_Q25 = 129
|
||||
UC_ARM64_REG_Q26 = 130
|
||||
UC_ARM64_REG_Q27 = 131
|
||||
UC_ARM64_REG_Q28 = 132
|
||||
UC_ARM64_REG_Q29 = 133
|
||||
UC_ARM64_REG_Q30 = 134
|
||||
UC_ARM64_REG_Q31 = 135
|
||||
UC_ARM64_REG_S0 = 136
|
||||
UC_ARM64_REG_S1 = 137
|
||||
UC_ARM64_REG_S2 = 138
|
||||
UC_ARM64_REG_S3 = 139
|
||||
UC_ARM64_REG_S4 = 140
|
||||
UC_ARM64_REG_S5 = 141
|
||||
UC_ARM64_REG_S6 = 142
|
||||
UC_ARM64_REG_S7 = 143
|
||||
UC_ARM64_REG_S8 = 144
|
||||
UC_ARM64_REG_S9 = 145
|
||||
UC_ARM64_REG_S10 = 146
|
||||
UC_ARM64_REG_S11 = 147
|
||||
UC_ARM64_REG_S12 = 148
|
||||
UC_ARM64_REG_S13 = 149
|
||||
UC_ARM64_REG_S14 = 150
|
||||
UC_ARM64_REG_S15 = 151
|
||||
UC_ARM64_REG_S16 = 152
|
||||
UC_ARM64_REG_S17 = 153
|
||||
UC_ARM64_REG_S18 = 154
|
||||
UC_ARM64_REG_S19 = 155
|
||||
UC_ARM64_REG_S20 = 156
|
||||
UC_ARM64_REG_S21 = 157
|
||||
UC_ARM64_REG_S22 = 158
|
||||
UC_ARM64_REG_S23 = 159
|
||||
UC_ARM64_REG_S24 = 160
|
||||
UC_ARM64_REG_S25 = 161
|
||||
UC_ARM64_REG_S26 = 162
|
||||
UC_ARM64_REG_S27 = 163
|
||||
UC_ARM64_REG_S28 = 164
|
||||
UC_ARM64_REG_S29 = 165
|
||||
UC_ARM64_REG_S30 = 166
|
||||
UC_ARM64_REG_S31 = 167
|
||||
UC_ARM64_REG_W0 = 168
|
||||
UC_ARM64_REG_W1 = 169
|
||||
UC_ARM64_REG_W2 = 170
|
||||
UC_ARM64_REG_W3 = 171
|
||||
UC_ARM64_REG_W4 = 172
|
||||
UC_ARM64_REG_W5 = 173
|
||||
UC_ARM64_REG_W6 = 174
|
||||
UC_ARM64_REG_W7 = 175
|
||||
UC_ARM64_REG_W8 = 176
|
||||
UC_ARM64_REG_W9 = 177
|
||||
UC_ARM64_REG_W10 = 178
|
||||
UC_ARM64_REG_W11 = 179
|
||||
UC_ARM64_REG_W12 = 180
|
||||
UC_ARM64_REG_W13 = 181
|
||||
UC_ARM64_REG_W14 = 182
|
||||
UC_ARM64_REG_W15 = 183
|
||||
UC_ARM64_REG_W16 = 184
|
||||
UC_ARM64_REG_W17 = 185
|
||||
UC_ARM64_REG_W18 = 186
|
||||
UC_ARM64_REG_W19 = 187
|
||||
UC_ARM64_REG_W20 = 188
|
||||
UC_ARM64_REG_W21 = 189
|
||||
UC_ARM64_REG_W22 = 190
|
||||
UC_ARM64_REG_W23 = 191
|
||||
UC_ARM64_REG_W24 = 192
|
||||
UC_ARM64_REG_W25 = 193
|
||||
UC_ARM64_REG_W26 = 194
|
||||
UC_ARM64_REG_W27 = 195
|
||||
UC_ARM64_REG_W28 = 196
|
||||
UC_ARM64_REG_W29 = 197
|
||||
UC_ARM64_REG_W30 = 198
|
||||
UC_ARM64_REG_X0 = 199
|
||||
UC_ARM64_REG_X1 = 200
|
||||
UC_ARM64_REG_X2 = 201
|
||||
UC_ARM64_REG_X3 = 202
|
||||
UC_ARM64_REG_X4 = 203
|
||||
UC_ARM64_REG_X5 = 204
|
||||
UC_ARM64_REG_X6 = 205
|
||||
UC_ARM64_REG_X7 = 206
|
||||
UC_ARM64_REG_X8 = 207
|
||||
UC_ARM64_REG_X9 = 208
|
||||
UC_ARM64_REG_X10 = 209
|
||||
UC_ARM64_REG_X11 = 210
|
||||
UC_ARM64_REG_X12 = 211
|
||||
UC_ARM64_REG_X13 = 212
|
||||
UC_ARM64_REG_X14 = 213
|
||||
UC_ARM64_REG_X15 = 214
|
||||
UC_ARM64_REG_X16 = 215
|
||||
UC_ARM64_REG_X17 = 216
|
||||
UC_ARM64_REG_X18 = 217
|
||||
UC_ARM64_REG_X19 = 218
|
||||
UC_ARM64_REG_X20 = 219
|
||||
UC_ARM64_REG_X21 = 220
|
||||
UC_ARM64_REG_X22 = 221
|
||||
UC_ARM64_REG_X23 = 222
|
||||
UC_ARM64_REG_X24 = 223
|
||||
UC_ARM64_REG_X25 = 224
|
||||
UC_ARM64_REG_X26 = 225
|
||||
UC_ARM64_REG_X27 = 226
|
||||
UC_ARM64_REG_X28 = 227
|
||||
UC_ARM64_REG_V0 = 228
|
||||
UC_ARM64_REG_V1 = 229
|
||||
UC_ARM64_REG_V2 = 230
|
||||
UC_ARM64_REG_V3 = 231
|
||||
UC_ARM64_REG_V4 = 232
|
||||
UC_ARM64_REG_V5 = 233
|
||||
UC_ARM64_REG_V6 = 234
|
||||
UC_ARM64_REG_V7 = 235
|
||||
UC_ARM64_REG_V8 = 236
|
||||
UC_ARM64_REG_V9 = 237
|
||||
UC_ARM64_REG_V10 = 238
|
||||
UC_ARM64_REG_V11 = 239
|
||||
UC_ARM64_REG_V12 = 240
|
||||
UC_ARM64_REG_V13 = 241
|
||||
UC_ARM64_REG_V14 = 242
|
||||
UC_ARM64_REG_V15 = 243
|
||||
UC_ARM64_REG_V16 = 244
|
||||
UC_ARM64_REG_V17 = 245
|
||||
UC_ARM64_REG_V18 = 246
|
||||
UC_ARM64_REG_V19 = 247
|
||||
UC_ARM64_REG_V20 = 248
|
||||
UC_ARM64_REG_V21 = 249
|
||||
UC_ARM64_REG_V22 = 250
|
||||
UC_ARM64_REG_V23 = 251
|
||||
UC_ARM64_REG_V24 = 252
|
||||
UC_ARM64_REG_V25 = 253
|
||||
UC_ARM64_REG_V26 = 254
|
||||
UC_ARM64_REG_V27 = 255
|
||||
UC_ARM64_REG_V28 = 256
|
||||
UC_ARM64_REG_V29 = 257
|
||||
UC_ARM64_REG_V30 = 258
|
||||
UC_ARM64_REG_V31 = 259
|
||||
|
||||
# pseudo registers
|
||||
UC_ARM64_REG_PC = 260
|
||||
UC_ARM64_REG_ENDING = 261
|
||||
|
||||
# alias registers
|
||||
UC_ARM64_REG_IP1 = 215
|
||||
UC_ARM64_REG_IP0 = 216
|
||||
UC_ARM64_REG_FP = 1
|
||||
UC_ARM64_REG_LR = 2
|
||||
end
|
128
bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb
Normal file
128
bindings/ruby/unicorn_gem/lib/unicorn/arm_const.rb
Normal file
@ -0,0 +1,128 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [arm_const.rb]
|
||||
|
||||
module Unicorn
|
||||
|
||||
# ARM registers
|
||||
|
||||
UC_ARM_REG_INVALID = 0
|
||||
UC_ARM_REG_APSR = 1
|
||||
UC_ARM_REG_APSR_NZCV = 2
|
||||
UC_ARM_REG_CPSR = 3
|
||||
UC_ARM_REG_FPEXC = 4
|
||||
UC_ARM_REG_FPINST = 5
|
||||
UC_ARM_REG_FPSCR = 6
|
||||
UC_ARM_REG_FPSCR_NZCV = 7
|
||||
UC_ARM_REG_FPSID = 8
|
||||
UC_ARM_REG_ITSTATE = 9
|
||||
UC_ARM_REG_LR = 10
|
||||
UC_ARM_REG_PC = 11
|
||||
UC_ARM_REG_SP = 12
|
||||
UC_ARM_REG_SPSR = 13
|
||||
UC_ARM_REG_D0 = 14
|
||||
UC_ARM_REG_D1 = 15
|
||||
UC_ARM_REG_D2 = 16
|
||||
UC_ARM_REG_D3 = 17
|
||||
UC_ARM_REG_D4 = 18
|
||||
UC_ARM_REG_D5 = 19
|
||||
UC_ARM_REG_D6 = 20
|
||||
UC_ARM_REG_D7 = 21
|
||||
UC_ARM_REG_D8 = 22
|
||||
UC_ARM_REG_D9 = 23
|
||||
UC_ARM_REG_D10 = 24
|
||||
UC_ARM_REG_D11 = 25
|
||||
UC_ARM_REG_D12 = 26
|
||||
UC_ARM_REG_D13 = 27
|
||||
UC_ARM_REG_D14 = 28
|
||||
UC_ARM_REG_D15 = 29
|
||||
UC_ARM_REG_D16 = 30
|
||||
UC_ARM_REG_D17 = 31
|
||||
UC_ARM_REG_D18 = 32
|
||||
UC_ARM_REG_D19 = 33
|
||||
UC_ARM_REG_D20 = 34
|
||||
UC_ARM_REG_D21 = 35
|
||||
UC_ARM_REG_D22 = 36
|
||||
UC_ARM_REG_D23 = 37
|
||||
UC_ARM_REG_D24 = 38
|
||||
UC_ARM_REG_D25 = 39
|
||||
UC_ARM_REG_D26 = 40
|
||||
UC_ARM_REG_D27 = 41
|
||||
UC_ARM_REG_D28 = 42
|
||||
UC_ARM_REG_D29 = 43
|
||||
UC_ARM_REG_D30 = 44
|
||||
UC_ARM_REG_D31 = 45
|
||||
UC_ARM_REG_FPINST2 = 46
|
||||
UC_ARM_REG_MVFR0 = 47
|
||||
UC_ARM_REG_MVFR1 = 48
|
||||
UC_ARM_REG_MVFR2 = 49
|
||||
UC_ARM_REG_Q0 = 50
|
||||
UC_ARM_REG_Q1 = 51
|
||||
UC_ARM_REG_Q2 = 52
|
||||
UC_ARM_REG_Q3 = 53
|
||||
UC_ARM_REG_Q4 = 54
|
||||
UC_ARM_REG_Q5 = 55
|
||||
UC_ARM_REG_Q6 = 56
|
||||
UC_ARM_REG_Q7 = 57
|
||||
UC_ARM_REG_Q8 = 58
|
||||
UC_ARM_REG_Q9 = 59
|
||||
UC_ARM_REG_Q10 = 60
|
||||
UC_ARM_REG_Q11 = 61
|
||||
UC_ARM_REG_Q12 = 62
|
||||
UC_ARM_REG_Q13 = 63
|
||||
UC_ARM_REG_Q14 = 64
|
||||
UC_ARM_REG_Q15 = 65
|
||||
UC_ARM_REG_R0 = 66
|
||||
UC_ARM_REG_R1 = 67
|
||||
UC_ARM_REG_R2 = 68
|
||||
UC_ARM_REG_R3 = 69
|
||||
UC_ARM_REG_R4 = 70
|
||||
UC_ARM_REG_R5 = 71
|
||||
UC_ARM_REG_R6 = 72
|
||||
UC_ARM_REG_R7 = 73
|
||||
UC_ARM_REG_R8 = 74
|
||||
UC_ARM_REG_R9 = 75
|
||||
UC_ARM_REG_R10 = 76
|
||||
UC_ARM_REG_R11 = 77
|
||||
UC_ARM_REG_R12 = 78
|
||||
UC_ARM_REG_S0 = 79
|
||||
UC_ARM_REG_S1 = 80
|
||||
UC_ARM_REG_S2 = 81
|
||||
UC_ARM_REG_S3 = 82
|
||||
UC_ARM_REG_S4 = 83
|
||||
UC_ARM_REG_S5 = 84
|
||||
UC_ARM_REG_S6 = 85
|
||||
UC_ARM_REG_S7 = 86
|
||||
UC_ARM_REG_S8 = 87
|
||||
UC_ARM_REG_S9 = 88
|
||||
UC_ARM_REG_S10 = 89
|
||||
UC_ARM_REG_S11 = 90
|
||||
UC_ARM_REG_S12 = 91
|
||||
UC_ARM_REG_S13 = 92
|
||||
UC_ARM_REG_S14 = 93
|
||||
UC_ARM_REG_S15 = 94
|
||||
UC_ARM_REG_S16 = 95
|
||||
UC_ARM_REG_S17 = 96
|
||||
UC_ARM_REG_S18 = 97
|
||||
UC_ARM_REG_S19 = 98
|
||||
UC_ARM_REG_S20 = 99
|
||||
UC_ARM_REG_S21 = 100
|
||||
UC_ARM_REG_S22 = 101
|
||||
UC_ARM_REG_S23 = 102
|
||||
UC_ARM_REG_S24 = 103
|
||||
UC_ARM_REG_S25 = 104
|
||||
UC_ARM_REG_S26 = 105
|
||||
UC_ARM_REG_S27 = 106
|
||||
UC_ARM_REG_S28 = 107
|
||||
UC_ARM_REG_S29 = 108
|
||||
UC_ARM_REG_S30 = 109
|
||||
UC_ARM_REG_S31 = 110
|
||||
UC_ARM_REG_ENDING = 111
|
||||
|
||||
# alias registers
|
||||
UC_ARM_REG_R13 = 12
|
||||
UC_ARM_REG_R14 = 10
|
||||
UC_ARM_REG_R15 = 11
|
||||
UC_ARM_REG_SB = 75
|
||||
UC_ARM_REG_SL = 76
|
||||
UC_ARM_REG_FP = 77
|
||||
UC_ARM_REG_IP = 78
|
||||
end
|
27
bindings/ruby/unicorn_gem/lib/unicorn/m68k_const.rb
Normal file
27
bindings/ruby/unicorn_gem/lib/unicorn/m68k_const.rb
Normal file
@ -0,0 +1,27 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [m68k_const.rb]
|
||||
|
||||
module Unicorn
|
||||
|
||||
# M68K registers
|
||||
|
||||
UC_M68K_REG_INVALID = 0
|
||||
UC_M68K_REG_A0 = 1
|
||||
UC_M68K_REG_A1 = 2
|
||||
UC_M68K_REG_A2 = 3
|
||||
UC_M68K_REG_A3 = 4
|
||||
UC_M68K_REG_A4 = 5
|
||||
UC_M68K_REG_A5 = 6
|
||||
UC_M68K_REG_A6 = 7
|
||||
UC_M68K_REG_A7 = 8
|
||||
UC_M68K_REG_D0 = 9
|
||||
UC_M68K_REG_D1 = 10
|
||||
UC_M68K_REG_D2 = 11
|
||||
UC_M68K_REG_D3 = 12
|
||||
UC_M68K_REG_D4 = 13
|
||||
UC_M68K_REG_D5 = 14
|
||||
UC_M68K_REG_D6 = 15
|
||||
UC_M68K_REG_D7 = 16
|
||||
UC_M68K_REG_SR = 17
|
||||
UC_M68K_REG_PC = 18
|
||||
UC_M68K_REG_ENDING = 19
|
||||
end
|
198
bindings/ruby/unicorn_gem/lib/unicorn/mips_const.rb
Normal file
198
bindings/ruby/unicorn_gem/lib/unicorn/mips_const.rb
Normal file
@ -0,0 +1,198 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [mips_const.rb]
|
||||
|
||||
module Unicorn
|
||||
|
||||
# MIPS registers
|
||||
|
||||
UC_MIPS_REG_INVALID = 0
|
||||
|
||||
# General purpose registers
|
||||
UC_MIPS_REG_PC = 1
|
||||
UC_MIPS_REG_0 = 2
|
||||
UC_MIPS_REG_1 = 3
|
||||
UC_MIPS_REG_2 = 4
|
||||
UC_MIPS_REG_3 = 5
|
||||
UC_MIPS_REG_4 = 6
|
||||
UC_MIPS_REG_5 = 7
|
||||
UC_MIPS_REG_6 = 8
|
||||
UC_MIPS_REG_7 = 9
|
||||
UC_MIPS_REG_8 = 10
|
||||
UC_MIPS_REG_9 = 11
|
||||
UC_MIPS_REG_10 = 12
|
||||
UC_MIPS_REG_11 = 13
|
||||
UC_MIPS_REG_12 = 14
|
||||
UC_MIPS_REG_13 = 15
|
||||
UC_MIPS_REG_14 = 16
|
||||
UC_MIPS_REG_15 = 17
|
||||
UC_MIPS_REG_16 = 18
|
||||
UC_MIPS_REG_17 = 19
|
||||
UC_MIPS_REG_18 = 20
|
||||
UC_MIPS_REG_19 = 21
|
||||
UC_MIPS_REG_20 = 22
|
||||
UC_MIPS_REG_21 = 23
|
||||
UC_MIPS_REG_22 = 24
|
||||
UC_MIPS_REG_23 = 25
|
||||
UC_MIPS_REG_24 = 26
|
||||
UC_MIPS_REG_25 = 27
|
||||
UC_MIPS_REG_26 = 28
|
||||
UC_MIPS_REG_27 = 29
|
||||
UC_MIPS_REG_28 = 30
|
||||
UC_MIPS_REG_29 = 31
|
||||
UC_MIPS_REG_30 = 32
|
||||
UC_MIPS_REG_31 = 33
|
||||
|
||||
# DSP registers
|
||||
UC_MIPS_REG_DSPCCOND = 34
|
||||
UC_MIPS_REG_DSPCARRY = 35
|
||||
UC_MIPS_REG_DSPEFI = 36
|
||||
UC_MIPS_REG_DSPOUTFLAG = 37
|
||||
UC_MIPS_REG_DSPOUTFLAG16_19 = 38
|
||||
UC_MIPS_REG_DSPOUTFLAG20 = 39
|
||||
UC_MIPS_REG_DSPOUTFLAG21 = 40
|
||||
UC_MIPS_REG_DSPOUTFLAG22 = 41
|
||||
UC_MIPS_REG_DSPOUTFLAG23 = 42
|
||||
UC_MIPS_REG_DSPPOS = 43
|
||||
UC_MIPS_REG_DSPSCOUNT = 44
|
||||
|
||||
# ACC registers
|
||||
UC_MIPS_REG_AC0 = 45
|
||||
UC_MIPS_REG_AC1 = 46
|
||||
UC_MIPS_REG_AC2 = 47
|
||||
UC_MIPS_REG_AC3 = 48
|
||||
|
||||
# COP registers
|
||||
UC_MIPS_REG_CC0 = 49
|
||||
UC_MIPS_REG_CC1 = 50
|
||||
UC_MIPS_REG_CC2 = 51
|
||||
UC_MIPS_REG_CC3 = 52
|
||||
UC_MIPS_REG_CC4 = 53
|
||||
UC_MIPS_REG_CC5 = 54
|
||||
UC_MIPS_REG_CC6 = 55
|
||||
UC_MIPS_REG_CC7 = 56
|
||||
|
||||
# FPU registers
|
||||
UC_MIPS_REG_F0 = 57
|
||||
UC_MIPS_REG_F1 = 58
|
||||
UC_MIPS_REG_F2 = 59
|
||||
UC_MIPS_REG_F3 = 60
|
||||
UC_MIPS_REG_F4 = 61
|
||||
UC_MIPS_REG_F5 = 62
|
||||
UC_MIPS_REG_F6 = 63
|
||||
UC_MIPS_REG_F7 = 64
|
||||
UC_MIPS_REG_F8 = 65
|
||||
UC_MIPS_REG_F9 = 66
|
||||
UC_MIPS_REG_F10 = 67
|
||||
UC_MIPS_REG_F11 = 68
|
||||
UC_MIPS_REG_F12 = 69
|
||||
UC_MIPS_REG_F13 = 70
|
||||
UC_MIPS_REG_F14 = 71
|
||||
UC_MIPS_REG_F15 = 72
|
||||
UC_MIPS_REG_F16 = 73
|
||||
UC_MIPS_REG_F17 = 74
|
||||
UC_MIPS_REG_F18 = 75
|
||||
UC_MIPS_REG_F19 = 76
|
||||
UC_MIPS_REG_F20 = 77
|
||||
UC_MIPS_REG_F21 = 78
|
||||
UC_MIPS_REG_F22 = 79
|
||||
UC_MIPS_REG_F23 = 80
|
||||
UC_MIPS_REG_F24 = 81
|
||||
UC_MIPS_REG_F25 = 82
|
||||
UC_MIPS_REG_F26 = 83
|
||||
UC_MIPS_REG_F27 = 84
|
||||
UC_MIPS_REG_F28 = 85
|
||||
UC_MIPS_REG_F29 = 86
|
||||
UC_MIPS_REG_F30 = 87
|
||||
UC_MIPS_REG_F31 = 88
|
||||
UC_MIPS_REG_FCC0 = 89
|
||||
UC_MIPS_REG_FCC1 = 90
|
||||
UC_MIPS_REG_FCC2 = 91
|
||||
UC_MIPS_REG_FCC3 = 92
|
||||
UC_MIPS_REG_FCC4 = 93
|
||||
UC_MIPS_REG_FCC5 = 94
|
||||
UC_MIPS_REG_FCC6 = 95
|
||||
UC_MIPS_REG_FCC7 = 96
|
||||
|
||||
# AFPR128
|
||||
UC_MIPS_REG_W0 = 97
|
||||
UC_MIPS_REG_W1 = 98
|
||||
UC_MIPS_REG_W2 = 99
|
||||
UC_MIPS_REG_W3 = 100
|
||||
UC_MIPS_REG_W4 = 101
|
||||
UC_MIPS_REG_W5 = 102
|
||||
UC_MIPS_REG_W6 = 103
|
||||
UC_MIPS_REG_W7 = 104
|
||||
UC_MIPS_REG_W8 = 105
|
||||
UC_MIPS_REG_W9 = 106
|
||||
UC_MIPS_REG_W10 = 107
|
||||
UC_MIPS_REG_W11 = 108
|
||||
UC_MIPS_REG_W12 = 109
|
||||
UC_MIPS_REG_W13 = 110
|
||||
UC_MIPS_REG_W14 = 111
|
||||
UC_MIPS_REG_W15 = 112
|
||||
UC_MIPS_REG_W16 = 113
|
||||
UC_MIPS_REG_W17 = 114
|
||||
UC_MIPS_REG_W18 = 115
|
||||
UC_MIPS_REG_W19 = 116
|
||||
UC_MIPS_REG_W20 = 117
|
||||
UC_MIPS_REG_W21 = 118
|
||||
UC_MIPS_REG_W22 = 119
|
||||
UC_MIPS_REG_W23 = 120
|
||||
UC_MIPS_REG_W24 = 121
|
||||
UC_MIPS_REG_W25 = 122
|
||||
UC_MIPS_REG_W26 = 123
|
||||
UC_MIPS_REG_W27 = 124
|
||||
UC_MIPS_REG_W28 = 125
|
||||
UC_MIPS_REG_W29 = 126
|
||||
UC_MIPS_REG_W30 = 127
|
||||
UC_MIPS_REG_W31 = 128
|
||||
UC_MIPS_REG_HI = 129
|
||||
UC_MIPS_REG_LO = 130
|
||||
UC_MIPS_REG_P0 = 131
|
||||
UC_MIPS_REG_P1 = 132
|
||||
UC_MIPS_REG_P2 = 133
|
||||
UC_MIPS_REG_MPL0 = 134
|
||||
UC_MIPS_REG_MPL1 = 135
|
||||
UC_MIPS_REG_MPL2 = 136
|
||||
UC_MIPS_REG_ENDING = 137
|
||||
UC_MIPS_REG_ZERO = 2
|
||||
UC_MIPS_REG_AT = 3
|
||||
UC_MIPS_REG_V0 = 4
|
||||
UC_MIPS_REG_V1 = 5
|
||||
UC_MIPS_REG_A0 = 6
|
||||
UC_MIPS_REG_A1 = 7
|
||||
UC_MIPS_REG_A2 = 8
|
||||
UC_MIPS_REG_A3 = 9
|
||||
UC_MIPS_REG_T0 = 10
|
||||
UC_MIPS_REG_T1 = 11
|
||||
UC_MIPS_REG_T2 = 12
|
||||
UC_MIPS_REG_T3 = 13
|
||||
UC_MIPS_REG_T4 = 14
|
||||
UC_MIPS_REG_T5 = 15
|
||||
UC_MIPS_REG_T6 = 16
|
||||
UC_MIPS_REG_T7 = 17
|
||||
UC_MIPS_REG_S0 = 18
|
||||
UC_MIPS_REG_S1 = 19
|
||||
UC_MIPS_REG_S2 = 20
|
||||
UC_MIPS_REG_S3 = 21
|
||||
UC_MIPS_REG_S4 = 22
|
||||
UC_MIPS_REG_S5 = 23
|
||||
UC_MIPS_REG_S6 = 24
|
||||
UC_MIPS_REG_S7 = 25
|
||||
UC_MIPS_REG_T8 = 26
|
||||
UC_MIPS_REG_T9 = 27
|
||||
UC_MIPS_REG_K0 = 28
|
||||
UC_MIPS_REG_K1 = 29
|
||||
UC_MIPS_REG_GP = 30
|
||||
UC_MIPS_REG_SP = 31
|
||||
UC_MIPS_REG_FP = 32
|
||||
UC_MIPS_REG_S8 = 32
|
||||
UC_MIPS_REG_RA = 33
|
||||
UC_MIPS_REG_HI0 = 45
|
||||
UC_MIPS_REG_HI1 = 46
|
||||
UC_MIPS_REG_HI2 = 47
|
||||
UC_MIPS_REG_HI3 = 48
|
||||
UC_MIPS_REG_LO0 = 45
|
||||
UC_MIPS_REG_LO1 = 46
|
||||
UC_MIPS_REG_LO2 = 47
|
||||
UC_MIPS_REG_LO3 = 48
|
||||
end
|
99
bindings/ruby/unicorn_gem/lib/unicorn/sparc_const.rb
Normal file
99
bindings/ruby/unicorn_gem/lib/unicorn/sparc_const.rb
Normal file
@ -0,0 +1,99 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [sparc_const.rb]
|
||||
|
||||
module Unicorn
|
||||
|
||||
# SPARC registers
|
||||
|
||||
UC_SPARC_REG_INVALID = 0
|
||||
UC_SPARC_REG_F0 = 1
|
||||
UC_SPARC_REG_F1 = 2
|
||||
UC_SPARC_REG_F2 = 3
|
||||
UC_SPARC_REG_F3 = 4
|
||||
UC_SPARC_REG_F4 = 5
|
||||
UC_SPARC_REG_F5 = 6
|
||||
UC_SPARC_REG_F6 = 7
|
||||
UC_SPARC_REG_F7 = 8
|
||||
UC_SPARC_REG_F8 = 9
|
||||
UC_SPARC_REG_F9 = 10
|
||||
UC_SPARC_REG_F10 = 11
|
||||
UC_SPARC_REG_F11 = 12
|
||||
UC_SPARC_REG_F12 = 13
|
||||
UC_SPARC_REG_F13 = 14
|
||||
UC_SPARC_REG_F14 = 15
|
||||
UC_SPARC_REG_F15 = 16
|
||||
UC_SPARC_REG_F16 = 17
|
||||
UC_SPARC_REG_F17 = 18
|
||||
UC_SPARC_REG_F18 = 19
|
||||
UC_SPARC_REG_F19 = 20
|
||||
UC_SPARC_REG_F20 = 21
|
||||
UC_SPARC_REG_F21 = 22
|
||||
UC_SPARC_REG_F22 = 23
|
||||
UC_SPARC_REG_F23 = 24
|
||||
UC_SPARC_REG_F24 = 25
|
||||
UC_SPARC_REG_F25 = 26
|
||||
UC_SPARC_REG_F26 = 27
|
||||
UC_SPARC_REG_F27 = 28
|
||||
UC_SPARC_REG_F28 = 29
|
||||
UC_SPARC_REG_F29 = 30
|
||||
UC_SPARC_REG_F30 = 31
|
||||
UC_SPARC_REG_F31 = 32
|
||||
UC_SPARC_REG_F32 = 33
|
||||
UC_SPARC_REG_F34 = 34
|
||||
UC_SPARC_REG_F36 = 35
|
||||
UC_SPARC_REG_F38 = 36
|
||||
UC_SPARC_REG_F40 = 37
|
||||
UC_SPARC_REG_F42 = 38
|
||||
UC_SPARC_REG_F44 = 39
|
||||
UC_SPARC_REG_F46 = 40
|
||||
UC_SPARC_REG_F48 = 41
|
||||
UC_SPARC_REG_F50 = 42
|
||||
UC_SPARC_REG_F52 = 43
|
||||
UC_SPARC_REG_F54 = 44
|
||||
UC_SPARC_REG_F56 = 45
|
||||
UC_SPARC_REG_F58 = 46
|
||||
UC_SPARC_REG_F60 = 47
|
||||
UC_SPARC_REG_F62 = 48
|
||||
UC_SPARC_REG_FCC0 = 49
|
||||
UC_SPARC_REG_FCC1 = 50
|
||||
UC_SPARC_REG_FCC2 = 51
|
||||
UC_SPARC_REG_FCC3 = 52
|
||||
UC_SPARC_REG_G0 = 53
|
||||
UC_SPARC_REG_G1 = 54
|
||||
UC_SPARC_REG_G2 = 55
|
||||
UC_SPARC_REG_G3 = 56
|
||||
UC_SPARC_REG_G4 = 57
|
||||
UC_SPARC_REG_G5 = 58
|
||||
UC_SPARC_REG_G6 = 59
|
||||
UC_SPARC_REG_G7 = 60
|
||||
UC_SPARC_REG_I0 = 61
|
||||
UC_SPARC_REG_I1 = 62
|
||||
UC_SPARC_REG_I2 = 63
|
||||
UC_SPARC_REG_I3 = 64
|
||||
UC_SPARC_REG_I4 = 65
|
||||
UC_SPARC_REG_I5 = 66
|
||||
UC_SPARC_REG_FP = 67
|
||||
UC_SPARC_REG_I7 = 68
|
||||
UC_SPARC_REG_ICC = 69
|
||||
UC_SPARC_REG_L0 = 70
|
||||
UC_SPARC_REG_L1 = 71
|
||||
UC_SPARC_REG_L2 = 72
|
||||
UC_SPARC_REG_L3 = 73
|
||||
UC_SPARC_REG_L4 = 74
|
||||
UC_SPARC_REG_L5 = 75
|
||||
UC_SPARC_REG_L6 = 76
|
||||
UC_SPARC_REG_L7 = 77
|
||||
UC_SPARC_REG_O0 = 78
|
||||
UC_SPARC_REG_O1 = 79
|
||||
UC_SPARC_REG_O2 = 80
|
||||
UC_SPARC_REG_O3 = 81
|
||||
UC_SPARC_REG_O4 = 82
|
||||
UC_SPARC_REG_O5 = 83
|
||||
UC_SPARC_REG_SP = 84
|
||||
UC_SPARC_REG_O7 = 85
|
||||
UC_SPARC_REG_Y = 86
|
||||
UC_SPARC_REG_XCC = 87
|
||||
UC_SPARC_REG_PC = 88
|
||||
UC_SPARC_REG_ENDING = 89
|
||||
UC_SPARC_REG_O6 = 84
|
||||
UC_SPARC_REG_I6 = 67
|
||||
end
|
98
bindings/ruby/unicorn_gem/lib/unicorn/unicorn_const.rb
Normal file
98
bindings/ruby/unicorn_gem/lib/unicorn/unicorn_const.rb
Normal file
@ -0,0 +1,98 @@
|
||||
# For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT [unicorn_const.rb]
|
||||
|
||||
module Unicorn
|
||||
UC_API_MAJOR = 1
|
||||
|
||||
UC_API_MINOR = 0
|
||||
UC_SECOND_SCALE = 1000000
|
||||
UC_MILISECOND_SCALE = 1000
|
||||
UC_ARCH_ARM = 1
|
||||
UC_ARCH_ARM64 = 2
|
||||
UC_ARCH_MIPS = 3
|
||||
UC_ARCH_X86 = 4
|
||||
UC_ARCH_PPC = 5
|
||||
UC_ARCH_SPARC = 6
|
||||
UC_ARCH_M68K = 7
|
||||
UC_ARCH_MAX = 8
|
||||
|
||||
UC_MODE_LITTLE_ENDIAN = 0
|
||||
UC_MODE_BIG_ENDIAN = 1073741824
|
||||
|
||||
UC_MODE_ARM = 0
|
||||
UC_MODE_THUMB = 16
|
||||
UC_MODE_MCLASS = 32
|
||||
UC_MODE_V8 = 64
|
||||
UC_MODE_MICRO = 16
|
||||
UC_MODE_MIPS3 = 32
|
||||
UC_MODE_MIPS32R6 = 64
|
||||
UC_MODE_MIPS32 = 4
|
||||
UC_MODE_MIPS64 = 8
|
||||
UC_MODE_16 = 2
|
||||
UC_MODE_32 = 4
|
||||
UC_MODE_64 = 8
|
||||
UC_MODE_PPC32 = 4
|
||||
UC_MODE_PPC64 = 8
|
||||
UC_MODE_QPX = 16
|
||||
UC_MODE_SPARC32 = 4
|
||||
UC_MODE_SPARC64 = 8
|
||||
UC_MODE_V9 = 16
|
||||
|
||||
UC_ERR_OK = 0
|
||||
UC_ERR_NOMEM = 1
|
||||
UC_ERR_ARCH = 2
|
||||
UC_ERR_HANDLE = 3
|
||||
UC_ERR_MODE = 4
|
||||
UC_ERR_VERSION = 5
|
||||
UC_ERR_READ_UNMAPPED = 6
|
||||
UC_ERR_WRITE_UNMAPPED = 7
|
||||
UC_ERR_FETCH_UNMAPPED = 8
|
||||
UC_ERR_HOOK = 9
|
||||
UC_ERR_INSN_INVALID = 10
|
||||
UC_ERR_MAP = 11
|
||||
UC_ERR_WRITE_PROT = 12
|
||||
UC_ERR_READ_PROT = 13
|
||||
UC_ERR_FETCH_PROT = 14
|
||||
UC_ERR_ARG = 15
|
||||
UC_ERR_READ_UNALIGNED = 16
|
||||
UC_ERR_WRITE_UNALIGNED = 17
|
||||
UC_ERR_FETCH_UNALIGNED = 18
|
||||
UC_ERR_HOOK_EXIST = 19
|
||||
UC_ERR_RESOURCE = 20
|
||||
UC_MEM_READ = 16
|
||||
UC_MEM_WRITE = 17
|
||||
UC_MEM_FETCH = 18
|
||||
UC_MEM_READ_UNMAPPED = 19
|
||||
UC_MEM_WRITE_UNMAPPED = 20
|
||||
UC_MEM_FETCH_UNMAPPED = 21
|
||||
UC_MEM_WRITE_PROT = 22
|
||||
UC_MEM_READ_PROT = 23
|
||||
UC_MEM_FETCH_PROT = 24
|
||||
UC_HOOK_INTR = 1
|
||||
UC_HOOK_INSN = 2
|
||||
UC_HOOK_CODE = 4
|
||||
UC_HOOK_BLOCK = 8
|
||||
UC_HOOK_MEM_READ_UNMAPPED = 16
|
||||
UC_HOOK_MEM_WRITE_UNMAPPED = 32
|
||||
UC_HOOK_MEM_FETCH_UNMAPPED = 64
|
||||
UC_HOOK_MEM_READ_PROT = 128
|
||||
UC_HOOK_MEM_WRITE_PROT = 256
|
||||
UC_HOOK_MEM_FETCH_PROT = 512
|
||||
UC_HOOK_MEM_READ = 1024
|
||||
UC_HOOK_MEM_WRITE = 2048
|
||||
UC_HOOK_MEM_FETCH = 4096
|
||||
UC_HOOK_MEM_UNMAPPED = 112
|
||||
UC_HOOK_MEM_PROT = 896
|
||||
UC_HOOK_MEM_READ_INVALID = 144
|
||||
UC_HOOK_MEM_WRITE_INVALID = 288
|
||||
UC_HOOK_MEM_FETCH_INVALID = 576
|
||||
UC_HOOK_MEM_INVALID = 1008
|
||||
UC_HOOK_MEM_VALID = 7168
|
||||
UC_QUERY_MODE = 1
|
||||
UC_QUERY_PAGE_SIZE = 2
|
||||
|
||||
UC_PROT_NONE = 0
|
||||
UC_PROT_READ = 1
|
||||
UC_PROT_WRITE = 2
|
||||
UC_PROT_EXEC = 4
|
||||
UC_PROT_ALL = 7
|
||||
end
|
3
bindings/ruby/unicorn_gem/lib/unicorn/version.rb
Normal file
3
bindings/ruby/unicorn_gem/lib/unicorn/version.rb
Normal file
@ -0,0 +1,3 @@
|
||||
module Unicorn
|
||||
VERSION = "0.9.0"
|
||||
end
|
1598
bindings/ruby/unicorn_gem/lib/unicorn/x86_const.rb
Normal file
1598
bindings/ruby/unicorn_gem/lib/unicorn/x86_const.rb
Normal file
File diff suppressed because it is too large
Load Diff
10
bindings/ruby/unicorn_gem/pkg/.gitignore
vendored
Normal file
10
bindings/ruby/unicorn_gem/pkg/.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
/.bundle/
|
||||
/.yardoc
|
||||
/Gemfile.lock
|
||||
/_yardoc/
|
||||
/coverage/
|
||||
/doc/
|
||||
/pkg/
|
||||
/spec/reports/
|
||||
/tmp/
|
||||
.gem
|
BIN
bindings/ruby/unicorn_gem/pkg/unicorn-0.9.0.gem
Normal file
BIN
bindings/ruby/unicorn_gem/pkg/unicorn-0.9.0.gem
Normal file
Binary file not shown.
21
bindings/ruby/unicorn_gem/unicorn.gemspec
Normal file
21
bindings/ruby/unicorn_gem/unicorn.gemspec
Normal file
@ -0,0 +1,21 @@
|
||||
# coding: utf-8
|
||||
lib = File.expand_path('../lib', __FILE__)
|
||||
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
||||
require 'unicorn/version'
|
||||
|
||||
Gem::Specification.new do |spec|
|
||||
spec.name = "unicorn"
|
||||
spec.version = Unicorn::VERSION
|
||||
spec.authors = ["Sascha Schirra"]
|
||||
spec.email = ["sashs@scoding.de"]
|
||||
spec.license = GPLv2
|
||||
spec.summary = %q{Ruby binding for Unicorn-Engine}
|
||||
spec.description = %q{Ruby binding for Unicorn-Engine <unicorn-engine.org>}
|
||||
spec.homepage = "https://unicorn-engine.org"
|
||||
|
||||
spec.files = Dir["lib/unicorn/*.rb"] + Dir["ext/unicorn.c"] + Dir["ext/unicorn.h"] + Dir["ext/extconf.rb"]
|
||||
spec.require_paths = ["lib","ext"]
|
||||
spec.extensions = ["ext/extconf.rb"]
|
||||
spec.add_development_dependency "bundler", "~> 1.11"
|
||||
spec.add_development_dependency "rake", "~> 10.0"
|
||||
end
|
Loading…
Reference in New Issue
Block a user