evoasm 0.0.2.pre7 → 0.1.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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