evoasm 0.0.2.pre7 → 0.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/.gdbinit +41 -0
  3. data/.gitignore +1 -2
  4. data/.gitmodules +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.md +660 -0
  8. data/Makefile +1 -1
  9. data/README.md +17 -9
  10. data/Rakefile +39 -107
  11. data/bin/gdb +1 -1
  12. data/bin/gdb_loop +4 -0
  13. data/docs/FindingInstructions.md +17 -0
  14. data/docs/JIT.md +14 -0
  15. data/docs/SymbolicRegression.md +102 -0
  16. data/docs/Visualization.md +29 -0
  17. data/docs/examples/bit_insts.rb +44 -0
  18. data/docs/examples/jit.rb +26 -0
  19. data/docs/examples/loss.gif +0 -0
  20. data/docs/examples/program.png +0 -0
  21. data/docs/examples/sym_reg.rb +64 -0
  22. data/docs/examples/vis.rb +38 -0
  23. data/evoasm.gemspec +21 -15
  24. data/ext/evoasm_ext/Rakefile +3 -0
  25. data/ext/evoasm_ext/compile.rake +35 -0
  26. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
  27. data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
  28. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
  29. data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
  30. data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
  31. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
  32. data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
  33. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
  34. data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
  35. data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
  36. data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
  37. data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
  38. data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
  39. data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
  40. data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
  41. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
  42. data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
  43. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
  44. data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
  45. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
  46. data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
  47. data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
  48. data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
  49. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
  50. data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
  51. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
  52. data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
  53. data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
  54. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
  55. data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
  56. data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
  57. data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
  58. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
  59. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
  60. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
  61. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
  62. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
  63. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
  64. data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
  65. data/lib/evoasm.rb +28 -11
  66. data/lib/evoasm/buffer.rb +105 -0
  67. data/lib/evoasm/capstone.rb +100 -0
  68. data/lib/evoasm/domain.rb +116 -0
  69. data/lib/evoasm/error.rb +37 -16
  70. data/lib/evoasm/exception_error.rb +19 -0
  71. data/lib/evoasm/ffi_ext.rb +53 -0
  72. data/lib/evoasm/libevoasm.rb +286 -0
  73. data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
  74. data/lib/evoasm/parameter.rb +20 -0
  75. data/lib/evoasm/population.rb +145 -0
  76. data/lib/evoasm/population/parameters.rb +227 -0
  77. data/lib/evoasm/population/plotter.rb +89 -0
  78. data/lib/evoasm/prng.rb +64 -0
  79. data/lib/evoasm/program.rb +195 -12
  80. data/lib/evoasm/program/io.rb +144 -0
  81. data/lib/evoasm/test.rb +8 -0
  82. data/lib/evoasm/version.rb +1 -1
  83. data/lib/evoasm/x64.rb +115 -0
  84. data/lib/evoasm/x64/cpu_state.rb +95 -0
  85. data/lib/evoasm/x64/instruction.rb +109 -0
  86. data/lib/evoasm/x64/operand.rb +156 -0
  87. data/lib/evoasm/x64/parameters.rb +211 -0
  88. data/test/helpers/population_helper.rb +128 -0
  89. data/test/helpers/test_helper.rb +1 -0
  90. data/test/helpers/x64_helper.rb +24 -0
  91. data/test/integration/bitwise_reverse_test.rb +41 -0
  92. data/test/integration/gcd_test.rb +52 -0
  93. data/test/integration/popcnt_test.rb +46 -0
  94. data/test/integration/sym_reg_test.rb +68 -0
  95. data/test/unit/evoasm/buffer_test.rb +48 -0
  96. data/test/unit/evoasm/capstone_test.rb +18 -0
  97. data/test/unit/evoasm/domain_test.rb +55 -0
  98. data/test/unit/evoasm/population/parameters_test.rb +106 -0
  99. data/test/unit/evoasm/population_test.rb +96 -0
  100. data/test/unit/evoasm/prng_test.rb +47 -0
  101. data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
  102. data/test/unit/evoasm/x64/encoding_test.rb +320 -0
  103. data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
  104. data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
  105. data/test/unit/evoasm/x64/instruction_test.rb +62 -0
  106. data/test/unit/evoasm/x64/parameters_test.rb +65 -0
  107. data/test/unit/evoasm/x64_test.rb +52 -0
  108. metadata +195 -89
  109. data/Gemfile.rake +0 -8
  110. data/Gemfile.rake.lock +0 -51
  111. data/LICENSE.txt +0 -373
  112. data/data/tables/README.md +0 -19
  113. data/data/tables/x64.csv +0 -1684
  114. data/data/templates/evoasm-x64.c.erb +0 -319
  115. data/data/templates/evoasm-x64.h.erb +0 -126
  116. data/examples/abs.yml +0 -20
  117. data/examples/popcnt.yml +0 -17
  118. data/examples/sym_reg.yml +0 -26
  119. data/exe/evoasm-search +0 -13
  120. data/ext/evoasm_ext/evoasm-alloc.c +0 -145
  121. data/ext/evoasm_ext/evoasm-alloc.h +0 -59
  122. data/ext/evoasm_ext/evoasm-arch.c +0 -44
  123. data/ext/evoasm_ext/evoasm-arch.h +0 -161
  124. data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
  125. data/ext/evoasm_ext/evoasm-buf.c +0 -130
  126. data/ext/evoasm_ext/evoasm-buf.h +0 -47
  127. data/ext/evoasm_ext/evoasm-error.c +0 -31
  128. data/ext/evoasm_ext/evoasm-error.h +0 -75
  129. data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
  130. data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
  131. data/ext/evoasm_ext/evoasm-log.h +0 -69
  132. data/ext/evoasm_ext/evoasm-misc.c +0 -23
  133. data/ext/evoasm_ext/evoasm-misc.h +0 -282
  134. data/ext/evoasm_ext/evoasm-param.h +0 -37
  135. data/ext/evoasm_ext/evoasm-search.c +0 -2145
  136. data/ext/evoasm_ext/evoasm-search.h +0 -214
  137. data/ext/evoasm_ext/evoasm-util.h +0 -40
  138. data/ext/evoasm_ext/evoasm-x64.c +0 -275624
  139. data/ext/evoasm_ext/evoasm-x64.h +0 -5436
  140. data/ext/evoasm_ext/evoasm.c +0 -7
  141. data/ext/evoasm_ext/evoasm.h +0 -23
  142. data/ext/evoasm_ext/evoasm_ext.c +0 -1757
  143. data/ext/evoasm_ext/extconf.rb +0 -31
  144. data/lib/evoasm/cli.rb +0 -6
  145. data/lib/evoasm/cli/search.rb +0 -127
  146. data/lib/evoasm/core_ext.rb +0 -1
  147. data/lib/evoasm/core_ext/array.rb +0 -9
  148. data/lib/evoasm/core_ext/integer.rb +0 -10
  149. data/lib/evoasm/core_ext/kwstruct.rb +0 -13
  150. data/lib/evoasm/core_ext/range.rb +0 -5
  151. data/lib/evoasm/examples.rb +0 -27
  152. data/lib/evoasm/gen.rb +0 -8
  153. data/lib/evoasm/gen/enum.rb +0 -169
  154. data/lib/evoasm/gen/name_util.rb +0 -80
  155. data/lib/evoasm/gen/state.rb +0 -176
  156. data/lib/evoasm/gen/state_dsl.rb +0 -152
  157. data/lib/evoasm/gen/strio.rb +0 -27
  158. data/lib/evoasm/gen/translator.rb +0 -1102
  159. data/lib/evoasm/gen/version.rb +0 -5
  160. data/lib/evoasm/gen/x64.rb +0 -237
  161. data/lib/evoasm/gen/x64/funcs.rb +0 -495
  162. data/lib/evoasm/gen/x64/inst.rb +0 -781
  163. data/lib/evoasm/search.rb +0 -40
  164. data/lib/evoasm/tasks/gen_task.rb +0 -86
  165. data/lib/evoasm/tasks/template_task.rb +0 -52
  166. data/test/test_helper.rb +0 -1
  167. data/test/x64/test_helper.rb +0 -19
  168. data/test/x64/x64_test.rb +0 -87
@@ -0,0 +1,128 @@
1
+ require 'evoasm'
2
+ require 'evoasm/x64'
3
+ require 'tmpdir'
4
+ require 'pp'
5
+ require 'json'
6
+
7
+ module PopulationHelper
8
+
9
+ def set_default_parameters
10
+ @examples = {
11
+ 1 => 2,
12
+ 2 => 3,
13
+ 3 => 4
14
+ }
15
+ @instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
16
+ @deme_size = 1200
17
+ @parameters = %i(reg0 reg1 reg2 reg3)
18
+ @recur_limit = 0
19
+ @deme_count = 1
20
+ @mutation_rate = 0.02
21
+ end
22
+
23
+ def new_population(architecture = :x64)
24
+ parameters = Evoasm::Population::Parameters.new architecture do |p|
25
+ p.instructions = @instruction_names
26
+ p.kernel_size = @kernel_size
27
+ p.program_size = @program_size
28
+ p.deme_size = @deme_size
29
+ p.deme_count = @deme_count
30
+ p.examples = @examples
31
+ p.parameters = @parameters
32
+ p.domains = @domains if @domains
33
+ p.seed = @seed if @seed
34
+ p.recur_limit = @recur_limit
35
+ p.mutation_rate = @mutation_rate
36
+ end
37
+
38
+ Evoasm::Population.new parameters
39
+ end
40
+
41
+ def start(loss = 0.0, min_generations: 0, max_generations: 1024, &block)
42
+ @population = new_population
43
+ @found_program = nil
44
+
45
+ @found_program, loss = @population.run(loss: loss, min_generations: min_generations, max_generations: max_generations) do
46
+ best_loss = @population.best_loss
47
+ if best_loss == Float::INFINITY
48
+ @population.seed
49
+ end
50
+
51
+ if block
52
+ block[@population.summary]
53
+ end
54
+
55
+ @population.plot
56
+ end
57
+ end
58
+
59
+ module Tests
60
+ def found_program
61
+ @found_program
62
+ end
63
+
64
+ def examples
65
+ @examples
66
+ end
67
+
68
+ def test_program_found
69
+ refute_nil found_program, "no solution found"
70
+ assert_kind_of Evoasm::Program, found_program
71
+ end
72
+
73
+ def assert_runs_examples(program)
74
+ assert_equal examples.values, program.run_all(*examples.keys)
75
+ p examples.keys
76
+ p program.run_all(*examples.keys)
77
+ end
78
+
79
+ def test_program_to_gv
80
+ filename = Dir::Tmpname.create(['evoasm_gv_test', '.png']) {}
81
+ found_program.to_gv.save(filename)
82
+ assert File.exist?(filename)
83
+ end
84
+
85
+ def test_program_run_all
86
+ assert_runs_examples found_program
87
+ end
88
+
89
+ def random_code
90
+ # Fill registers with random values
91
+
92
+ ary = Array.new(10) { rand }
93
+ ary.sort! if rand < 0.5
94
+ ary.map! { |e| (e * rand(10_000)).to_i } if rand < 0.5
95
+ end
96
+
97
+ def test_consistent_progress
98
+
99
+ 5.times do
100
+ @seed = Array.new(Evoasm::PRNG::SEED_SIZE) { rand(10000) }
101
+
102
+ run_summaries = []
103
+
104
+ run_count = 3
105
+ run_count.times do
106
+ random_code
107
+ summaries = []
108
+
109
+ start(0.5, min_generations: 10, max_generations: 20) do |summary|
110
+ summaries << summary
111
+ end
112
+
113
+ run_summaries << summaries
114
+ end
115
+
116
+ assert_equal run_count, run_summaries.size
117
+
118
+ #run_summaries.each_with_index do |s, i|
119
+ # File.write("/tmp/t#{i}.txt", s.pretty_inspect)
120
+ #end
121
+
122
+ run_summaries.uniq.tap do |uniq|
123
+ assert_equal [run_summaries.first], uniq
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1 @@
1
+ require 'evoasm'
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+ require 'evoasm/x64'
3
+
4
+ module X64Helper
5
+ def assert_disassembles_to(exp_disasm, instruction_name, **parameters)
6
+ exp_disasm.force_encoding('ASCII-8BIT')
7
+ act_disasm = disassemble(Evoasm::X64.encode(instruction_name, parameters))
8
+ assert_equal exp_disasm, act_disasm
9
+ end
10
+
11
+ def assert_assembles_to(exp_asm, inst_name, **params)
12
+ exp_asm.force_encoding('ASCII-8BIT')
13
+ act_asm = assemble(inst_name, **params)
14
+ assert_equal exp_asm, act_asm
15
+ end
16
+
17
+ def disassemble(asm)
18
+ Evoasm::X64.disassemble(asm).first.join(' ')
19
+ end
20
+
21
+ def assemble(instruction_name, **parameters)
22
+ Evoasm::X64.encode(instruction_name, parameters)
23
+ end
24
+ end
@@ -0,0 +1,41 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/population'
3
+ require 'population_helper'
4
+
5
+
6
+ module Evoasm
7
+ class BitwiseReverseTest < Minitest::Test
8
+ include PopulationHelper
9
+ include PopulationHelper::Tests
10
+
11
+ def setup
12
+ set_default_parameters
13
+
14
+ @instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
15
+ @examples = {
16
+ 0b00000000 => 0b00000000,
17
+ 0b10000000 => 0b00000001,
18
+ 0b01000000 => 0b00000010,
19
+ 0b01100000 => 0b00000110,
20
+ 0b00010000 => 0b00001000,
21
+ 0b00001000 => 0b00010000,
22
+ 0b00000110 => 0b01100000,
23
+ }
24
+ @kernel_size = 30
25
+ @program_size = 2
26
+ @deme_count = 2
27
+ @parameters = %i(reg0 reg1 reg2 reg3)
28
+ @mutation_rate = 0.5
29
+
30
+ start
31
+ end
32
+
33
+
34
+ def test_program_size
35
+ assert_equal 1, found_program.size
36
+ end
37
+
38
+ def test_program_run
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/population'
3
+ require 'evoasm/prng'
4
+ require 'population_helper'
5
+
6
+ Evoasm.log_level = :warn
7
+ require 'pp'
8
+ module Search
9
+ class GCDTest < Minitest::Test
10
+ include PopulationHelper
11
+ include PopulationHelper::Tests
12
+
13
+ SEED = Array.new(Evoasm::PRNG::SEED_SIZE) { rand(10000) }
14
+
15
+ def setup
16
+ set_default_parameters
17
+
18
+ @instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
19
+
20
+ @examples = {
21
+ [5, 1] => 1,
22
+ [15, 5] => 5,
23
+ [8, 2] => 2,
24
+ [8, 4] => 4,
25
+ [8, 6] => 2,
26
+ [16, 8] => 8
27
+ }
28
+
29
+ @seed = SEED
30
+ @kernel_size = 20
31
+ @program_size = 5
32
+ @mutation_rate = 0.0
33
+ @deme_count = 5
34
+ @recur_limit = 100
35
+ #@deme_size = 5000
36
+ #@mutation_rate = 0.2
37
+ @parameters = %i(reg0 reg1 reg2 reg3)
38
+
39
+ unless self.name == 'test_consistent_progress'
40
+ start
41
+ end
42
+ end
43
+
44
+ make_my_diffs_pretty!
45
+
46
+ def test_program_run
47
+ # should generalize (i.e. give correct answer for non-training data)
48
+ #assert_equal 2, found_program.run(16, 6)
49
+ #assert_equal 1, found_program.run(15, 2)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,46 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/population'
3
+ require 'population_helper'
4
+
5
+ module Evoasm
6
+ class PopcntTest < Minitest::Test
7
+ include PopulationHelper
8
+ include PopulationHelper::Tests
9
+
10
+ def setup
11
+ set_default_parameters
12
+
13
+ @instruction_names = Evoasm::X64.instruction_names(:gp, :rflags)
14
+ @examples = {
15
+ 0b0 => 0,
16
+ 0b1 => 1,
17
+ 0b110 => 2,
18
+ 0b101 => 2,
19
+ 0b111 => 3,
20
+ 0b100 => 1,
21
+ 0b101010 => 3,
22
+ 0b1010 => 2,
23
+ 0b10000 => 1,
24
+ 0b100001 => 2,
25
+ 0b101011 => 4
26
+ }
27
+ @kernel_size = 1
28
+ @program_size = 1
29
+ @parameters = %i(reg0 reg1 reg2 reg3)
30
+
31
+ start
32
+ end
33
+
34
+
35
+ def test_program_size
36
+ assert_equal 1, found_program.size
37
+ end
38
+
39
+ def test_program_run
40
+ # should generalize (i.e. give correct answer for non-training data)
41
+ assert_equal 2, found_program.run(0b1001)
42
+ assert_equal 1, found_program.run(0b1000)
43
+ assert_equal 3, found_program.run(0b1101)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,68 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/population'
3
+ require 'population_helper'
4
+
5
+ #Evoasm.min_log_level = :info
6
+
7
+ module Evoasm
8
+ class SymRegTest < Minitest::Test
9
+ include PopulationHelper
10
+ include PopulationHelper::Tests
11
+
12
+ def setup
13
+ set_default_parameters
14
+
15
+ @instruction_names = Evoasm::X64.instruction_names(:xmm).grep /(add|mul|sqrt).*?sd/
16
+ @examples = {
17
+ 0.0 => 0.0,
18
+ 0.5 => 1.0606601717798212,
19
+ 1.0 => 1.7320508075688772,
20
+ 1.5 => 2.5248762345905194,
21
+ 2.0 => 3.4641016151377544,
22
+ 2.5 => 4.541475531146237,
23
+ 3.0 => 5.744562646538029,
24
+ 3.5 => 7.0622234459127675,
25
+ 4.0 => 8.48528137423857,
26
+ 4.5 => 10.00624804809475,
27
+ 5.0 => 11.61895003862225
28
+ }
29
+
30
+ @kernel_size = 10
31
+ @program_size = 1
32
+ @parameters = %i(reg0 reg1 reg2 reg3)
33
+ regs = %i(xmm0 xmm1 xmm2 xmm3)
34
+ @domains = {
35
+ reg0: regs,
36
+ reg1: regs,
37
+ reg2: regs,
38
+ reg3: regs
39
+ }
40
+
41
+ start
42
+ end
43
+
44
+ def test_program_size
45
+ assert_equal 1, found_program.size
46
+ end
47
+
48
+ def test_intron_elimination
49
+ disasms = found_program.disassemble
50
+
51
+ program = found_program.eliminate_introns
52
+ assert_runs_examples program
53
+ refute_equal program, found_program
54
+
55
+ program.disassemble.each_with_index do |disasm, index|
56
+ assert_operator disasm.size, :<=, disasms[index].size
57
+ end
58
+ end
59
+
60
+ def test_program_run
61
+ # should generalize (i.e. give correct answer for non-training data)
62
+ p found_program.run_all(*@examples.keys)
63
+ assert_equal 31.937438845342623, found_program.run(10.0)
64
+ assert_equal 36.78314831549904, found_program.run(11.0)
65
+ assert_equal 41.8568990729127, found_program.run(12.0)
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,48 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/x64'
3
+ require 'evoasm/buffer'
4
+
5
+ module Evoasm
6
+ class BufferTest < Minitest::Test
7
+ def setup
8
+ @mmap_buffer = Buffer.new(1024, :mmap)
9
+ @malloc_buffer = Buffer.new(1024, :malloc)
10
+ end
11
+
12
+ def test_type
13
+ assert_equal :mmap, @mmap_buffer.type
14
+ assert_equal :malloc, @malloc_buffer.type
15
+ end
16
+
17
+ def test_capacity
18
+ assert_equal 1024, @mmap_buffer.capacity
19
+ assert_equal 1024, @malloc_buffer.capacity
20
+ end
21
+
22
+ def test_position
23
+ assert_equal 0, @mmap_buffer.position
24
+ assert_equal 0, @malloc_buffer.position
25
+ end
26
+
27
+ def test_to_s
28
+ assert_equal "\0" * @mmap_buffer.capacity, @mmap_buffer.to_s
29
+ assert_equal @malloc_buffer.capacity, @malloc_buffer.to_s.size
30
+ end
31
+
32
+ def test_write
33
+ data = "\xA\xB\xC"
34
+ @mmap_buffer.write data
35
+ assert_equal data, @mmap_buffer.to_s[0...data.size]
36
+ end
37
+
38
+ def test_execute
39
+ Evoasm::X64.encode(:mov_rm32_imm32, {reg0: :a, imm0: 7}, @mmap_buffer)
40
+ Evoasm::X64.encode(:ret, {}, @mmap_buffer)
41
+
42
+ #@mmap_buffer.__log__ :warn
43
+
44
+ assert_equal 7, @mmap_buffer.execute!
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,18 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/capstone'
3
+
4
+ class CapstoneTest < Minitest::Test
5
+ def test_disassemble_x64
6
+
7
+ asm = "\x55\x48\x8b\x05\xb8\x13\x00\x00"
8
+ inst1 = ['push', 'rbp']
9
+ inst2 = ['mov', 'rax, qword ptr [rip + 0x13b8]']
10
+
11
+ assert_equal [inst1, inst2],
12
+ Evoasm::Capstone.disassemble_x64(asm)
13
+
14
+ assert_equal [[0x80, *inst1], [0x81, *inst2]],
15
+ Evoasm::Capstone.disassemble_x64(asm, 0x80)
16
+
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ require 'evoasm/test'
2
+ require 'evoasm/domain'
3
+ require 'evoasm/prng'
4
+
5
+ module Evoasm
6
+ class DomainTest < Minitest::Test
7
+
8
+ def setup
9
+ @prng = PRNG.new
10
+ end
11
+
12
+ def test_enumeration_domain
13
+ enumeration_domain = Evoasm::EnumerationDomain.new 1, 2, 3, 4
14
+ assert_equal [1, 2, 3, 4], enumeration_domain.values
15
+ assert_equal 4, enumeration_domain.length
16
+ end
17
+
18
+ def test_range_domain
19
+ range_domain = Evoasm::RangeDomain.new -10, 100
20
+ assert_equal -10, range_domain.min
21
+ assert_equal 100, range_domain.max
22
+
23
+ 100.times do
24
+ assert_operator range_domain.rand(@prng), :>=, -10
25
+ assert_operator range_domain.rand(@prng), :<=, 100
26
+ end
27
+
28
+ range_domain = Evoasm::RangeDomain.new 10, 100_000
29
+ assert_equal 10, range_domain.min
30
+ assert_equal 100_000, range_domain.max
31
+ end
32
+
33
+ def test_type_domain
34
+ type_domain = Evoasm::TypeDomain.new :int8
35
+ assert_equal :int8, type_domain.type
36
+ assert_equal -2**7, type_domain.min
37
+ assert_equal 2**7 - 1, type_domain.max
38
+
39
+ type_domain = Evoasm::TypeDomain.new :int16
40
+ assert_equal :int16, type_domain.type
41
+ assert_equal -2**15, type_domain.min
42
+ assert_equal 2**15 - 1, type_domain.max
43
+
44
+ type_domain = Evoasm::TypeDomain.new :int32
45
+ assert_equal :int32, type_domain.type
46
+ assert_equal -2**31, type_domain.min
47
+ assert_equal 2**31 - 1, type_domain.max
48
+
49
+ type_domain = Evoasm::TypeDomain.new :int64
50
+ assert_equal :int64, type_domain.type
51
+ assert_equal -2**63, type_domain.min
52
+ assert_equal 2**63 - 1, type_domain.max
53
+ end
54
+ end
55
+ end