fisk 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/test/helper.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "fisk"
2
+ require "crabstone"
3
+
4
+ ENV["MT_NO_PLUGINS"] = "1"
5
+ require "minitest/autorun"
6
+
7
+ class Fisk::Test < Minitest::Test
8
+ end
data/test/test_fisk.rb ADDED
@@ -0,0 +1,153 @@
1
+ require "helper"
2
+
3
+ class FiskTest < Fisk::Test
4
+ attr_reader :fisk
5
+
6
+ def setup
7
+ super
8
+ @fisk = Fisk.new
9
+ end
10
+
11
+ def test_sub
12
+ fisk.sub fisk.rsp, fisk.imm8(16)
13
+ i = disasm(fisk.to_binary).first
14
+ assert_equal "sub", i.mnemonic.to_s
15
+ assert_equal "rsp, 0x10", i.op_str.to_s
16
+ end
17
+
18
+ def test_lol
19
+ binary = fisk.asm do
20
+ push rbp
21
+ mov rsp, rbp
22
+ int lit(3)
23
+ pop rbp
24
+ ret
25
+ end
26
+ assert_equal "UH\x89\xEC\xCC]\xC3".b, binary.string
27
+ end
28
+
29
+ def test_add_eax
30
+ fisk.add fisk.eax, fisk.imm32(0x4351ff23)
31
+ i = disasm(fisk.to_binary).first
32
+ assert_equal "add", i.mnemonic.to_s
33
+ assert_equal "eax, 0x4351ff23", i.op_str.to_s
34
+ end
35
+
36
+ def test_add_ecx_esi
37
+ fisk.add fisk.ecx, fisk.esi
38
+ i = disasm(fisk.to_binary).first
39
+ assert_equal "add", i.mnemonic.to_s
40
+ assert_equal "ecx, esi", i.op_str.to_s
41
+ end
42
+
43
+ def test_add_rcx_rsi
44
+ fisk.add fisk.rcx, fisk.rsi
45
+ i = disasm(fisk.to_binary).first
46
+ assert_equal "add", i.mnemonic.to_s
47
+ assert_equal "rcx, rsi".b, i.op_str.to_s.b
48
+ end
49
+
50
+ def test_add_rax
51
+ fisk.add fisk.rax, fisk.imm32(0x4351ff23)
52
+ i = disasm(fisk.to_binary).first
53
+ assert_equal "add", i.mnemonic.to_s
54
+ assert_equal "rax, 0x4351ff23", i.op_str.to_s
55
+ end
56
+
57
+ def test_add_rax_rcx
58
+ fisk.add fisk.rax, fisk.rcx
59
+ i = disasm(fisk.to_binary).first
60
+ assert_equal "add", i.mnemonic.to_s
61
+ assert_equal "rax, rcx", i.op_str.to_s
62
+ end
63
+
64
+ def test_add_rcx_r9
65
+ fisk.add fisk.rcx, fisk.r9
66
+ i = disasm(fisk.to_binary).first
67
+ assert_equal "add", i.mnemonic.to_s
68
+ assert_equal "rcx, r9", i.op_str.to_s
69
+ end
70
+
71
+ def test_adc_rcx_r9
72
+ fisk.adc fisk.rcx, fisk.r9
73
+ i = disasm(fisk.to_binary).first
74
+ assert_equal "adc", i.mnemonic.to_s
75
+ assert_equal "rcx, r9", i.op_str.to_s
76
+ end
77
+
78
+ def test_int3
79
+ fisk.int fisk.lit(3)
80
+ i = disasm(fisk.to_binary).first
81
+ assert_equal "int3", i.mnemonic.to_s
82
+ assert_equal "", i.op_str.to_s
83
+ end
84
+
85
+ def test_int5
86
+ fisk.int fisk.imm8(5)
87
+ i = disasm(fisk.to_binary).first
88
+ assert_equal "int", i.mnemonic.to_s
89
+ assert_equal "5", i.op_str.to_s
90
+ end
91
+
92
+ def test_push_rbp
93
+ fisk.push fisk.rbp
94
+ i = disasm(fisk.to_binary).first
95
+ assert_equal "push", i.mnemonic.to_s
96
+ assert_equal "rbp", i.op_str.to_s
97
+ end
98
+
99
+ def test_mov_rsp_rbp
100
+ fisk.mov fisk.rsp, fisk.rbp
101
+ i = disasm(fisk.to_binary).first
102
+ assert_equal "mov", i.mnemonic.to_s
103
+ assert_equal "rsp, rbp", i.op_str.to_s
104
+ end
105
+
106
+ def test_popq
107
+ fisk.pop fisk.rbp
108
+ i = disasm(fisk.to_binary).first
109
+ assert_equal "pop", i.mnemonic.to_s
110
+ assert_equal "rbp", i.op_str.to_s
111
+ end
112
+
113
+ def test_ret
114
+ fisk.ret
115
+ i = disasm(fisk.to_binary).first
116
+ assert_equal "ret", i.mnemonic.to_s
117
+ end
118
+
119
+ def test_jmp
120
+ fisk.jmp fisk.rel32(0)
121
+ binary = fisk.to_binary
122
+ i = disasm(binary).first
123
+ assert_equal "jmp", i.mnemonic.to_s
124
+ assert_equal binary.bytesize.to_s, i.op_str.to_s
125
+ end
126
+
127
+ def test_jmp_rel8
128
+ fisk.jmp fisk.rel8(-2)
129
+ binary = fisk.to_binary
130
+ assert_equal "\xEB\xFE".b, binary
131
+ end
132
+
133
+ def test_jbe_rel8
134
+ fisk.jbe fisk.rel8(2)
135
+ binary = fisk.to_binary
136
+ i = disasm(binary).first
137
+ assert_equal "jbe", i.mnemonic.to_s
138
+ assert_equal "4", i.op_str.to_s
139
+ end
140
+
141
+ def test_jbe_rel32
142
+ fisk.jbe fisk.rel32(2)
143
+ binary = fisk.to_binary
144
+ i = disasm(binary).first
145
+ assert_equal "jbe", i.mnemonic.to_s
146
+ assert_equal "8", i.op_str.to_s
147
+ end
148
+
149
+ def disasm binary
150
+ cs = Crabstone::Disassembler.new(Crabstone::ARCH_X86, Crabstone::MODE_64)
151
+ cs.disasm binary, 0
152
+ end
153
+ end
@@ -0,0 +1,128 @@
1
+ require "helper"
2
+ require "fisk/helpers"
3
+
4
+ class RunFiskTest < Fisk::Test
5
+ def disasm binary
6
+ cs = Crabstone::Disassembler.new(Crabstone::ARCH_X86, Crabstone::MODE_64)
7
+ cs.disasm(binary, 0x0000).each {|i|
8
+ printf("0x%x:\t%s\t\t%s\n",i.address, i.mnemonic, i.op_str)
9
+ }
10
+ end
11
+
12
+ def test_sum
13
+ fisk = Fisk.new
14
+ jitbuf = Fisk::Helpers.jitbuffer 4096
15
+
16
+ fisk.asm jitbuf do
17
+ push rbp
18
+ mov rbp, rsp
19
+ mov rdx, imm32(1)
20
+ xor rax, rax
21
+ make_label :loop
22
+ add rax, rdx
23
+ inc rdx
24
+ cmp rdx, imm32(10)
25
+ jbe label(:loop)
26
+ pop rbp
27
+ ret
28
+ end
29
+
30
+ func = jitbuf.to_function [], Fiddle::TYPE_INT
31
+ assert_equal 11.times.inject(:+), func.call
32
+ end
33
+
34
+ def test_jmp
35
+ fisk = Fisk.new
36
+ jitbuf = Fisk::Helpers.jitbuffer 4096
37
+
38
+ fisk.asm jitbuf do
39
+ push rbp
40
+ mov rbp, rsp
41
+ jmp label(:foo)
42
+ make_label(:bar)
43
+ mov rax, imm32(100)
44
+ pop rbp
45
+ ret
46
+ make_label(:foo)
47
+ jmp label(:bar)
48
+ mov rax, imm32(42)
49
+ pop rbp
50
+ ret
51
+ end
52
+
53
+ func = jitbuf.to_function [], Fiddle::TYPE_INT
54
+ assert_equal 100, func.call
55
+ end
56
+
57
+ def test_run_fisk
58
+ fisk = Fisk.new
59
+ mem = Fisk::Helpers.mmap_jit 4096
60
+
61
+ binary = fisk.asm do
62
+ push rbp
63
+ mov rbp, rsp
64
+ mov rax, imm32(100)
65
+ pop rbp
66
+ ret
67
+ end
68
+
69
+ Fisk::Helpers.memcpy mem, binary.string, binary.string.bytesize
70
+ func = Fiddle::Function.new mem.to_i, [], Fiddle::TYPE_INT
71
+ assert_equal 100, func.call
72
+ end
73
+
74
+ def test_jit_memory_has_size
75
+ mem = Fisk::Helpers.mmap_jit 100
76
+ assert_equal 100, mem.size
77
+ end
78
+
79
+ def test_get_address
80
+ fisk = Fisk.new
81
+ jitbuf = Fisk::Helpers.jitbuffer 4096
82
+
83
+ fisk.asm jitbuf do
84
+ push rbp
85
+ mov rbp, rsp
86
+ mov rax, rdi
87
+ pop rbp
88
+ ret
89
+ end
90
+
91
+ func = jitbuf.to_function [Fiddle::TYPE_VOIDP], Fiddle::TYPE_LONG
92
+ x = Object.new
93
+ wrapped = Fiddle.dlwrap x
94
+ assert_equal wrapped.to_i, func.call(wrapped)
95
+ end
96
+
97
+ def test_fisk_jit
98
+ fisk = Fisk.new
99
+ jitbuf = Fisk::Helpers.jitbuffer 4096
100
+
101
+ fisk.asm jitbuf do
102
+ push rbp
103
+ mov rbp, rsp
104
+ mov rax, imm32(100)
105
+ pop rbp
106
+ ret
107
+ end
108
+
109
+ func = jitbuf.to_function [], Fiddle::TYPE_INT
110
+ assert_equal 100, func.call
111
+ end
112
+
113
+ def test_fisk_get_param
114
+ fisk = Fisk.new
115
+ jitbuf = Fisk::Helpers.jitbuffer 4096
116
+
117
+ fisk.asm jitbuf do
118
+ push rbp
119
+ mov rbp, rsp
120
+ mov rax, imm32(100)
121
+ pop rbp
122
+ ret
123
+ end
124
+
125
+ func = jitbuf.to_function [], Fiddle::TYPE_INT
126
+ assert_equal 100, func.call
127
+ end
128
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fisk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Patterson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Tired of writing Ruby in Ruby? Now you can write assembly in Ruby!
14
+ email: tenderlove@ruby-lang.org
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - Gemfile
20
+ - LICENSE
21
+ - README.md
22
+ - Rakefile
23
+ - bin/build-machine.rb
24
+ - bin/machine.rb.erb
25
+ - examples/print-string.rb
26
+ - lib/fisk.rb
27
+ - lib/fisk/helpers.rb
28
+ - lib/fisk/machine.rb
29
+ - lib/fisk/machine/encoding.rb
30
+ - lib/fisk/machine/generated.rb
31
+ - test/helper.rb
32
+ - test/test_fisk.rb
33
+ - test/test_run_fisk.rb
34
+ homepage: https://github.com/tenderlove/fisk
35
+ licenses:
36
+ - Apache-2.0
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubygems_version: 3.3.0.dev
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: Write assembly in Ruby!
57
+ test_files:
58
+ - test/helper.rb
59
+ - test/test_fisk.rb
60
+ - test/test_run_fisk.rb