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.
- checksums.yaml +4 -4
- data/.gdbinit +41 -0
- data/.gitignore +1 -2
- data/.gitmodules +3 -0
- data/.rubocop.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE.md +660 -0
- data/Makefile +1 -1
- data/README.md +17 -9
- data/Rakefile +39 -107
- data/bin/gdb +1 -1
- data/bin/gdb_loop +4 -0
- data/docs/FindingInstructions.md +17 -0
- data/docs/JIT.md +14 -0
- data/docs/SymbolicRegression.md +102 -0
- data/docs/Visualization.md +29 -0
- data/docs/examples/bit_insts.rb +44 -0
- data/docs/examples/jit.rb +26 -0
- data/docs/examples/loss.gif +0 -0
- data/docs/examples/program.png +0 -0
- data/docs/examples/sym_reg.rb +64 -0
- data/docs/examples/vis.rb +38 -0
- data/evoasm.gemspec +21 -15
- data/ext/evoasm_ext/Rakefile +3 -0
- data/ext/evoasm_ext/compile.rake +35 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.c +226 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-alloc.h +84 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.c +52 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-arch.h +101 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-bitmap.h +158 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.c +204 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-buf.h +109 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.c +124 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-domain.h +279 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-error.h +108 -0
- data/ext/evoasm_ext/{evoasm-log.c → libevoasm/src/evoasm-log.c} +36 -18
- data/ext/evoasm_ext/libevoasm/src/evoasm-log.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.c +22 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-param.h +33 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.c +192 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop-params.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.c +1323 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-pop.h +107 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.c +116 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program-io.h +60 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.c +1827 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-program.h +167 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.c +65 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-rand.h +76 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.c +106 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-signal.h +58 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-util.h +112 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.c +925 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm-x64.h +277 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.c +28 -0
- data/ext/evoasm_ext/libevoasm/src/evoasm.h +35 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-enums.h +2077 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.c +191203 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-insts.h +1713 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.c +348 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-misc.h +93 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.c +51 -0
- data/ext/evoasm_ext/libevoasm/src/gen/evoasm-x64-params.h +509 -0
- data/lib/evoasm.rb +28 -11
- data/lib/evoasm/buffer.rb +105 -0
- data/lib/evoasm/capstone.rb +100 -0
- data/lib/evoasm/domain.rb +116 -0
- data/lib/evoasm/error.rb +37 -16
- data/lib/evoasm/exception_error.rb +19 -0
- data/lib/evoasm/ffi_ext.rb +53 -0
- data/lib/evoasm/libevoasm.rb +286 -0
- data/lib/evoasm/libevoasm/x64_enums.rb +1967 -0
- data/lib/evoasm/parameter.rb +20 -0
- data/lib/evoasm/population.rb +145 -0
- data/lib/evoasm/population/parameters.rb +227 -0
- data/lib/evoasm/population/plotter.rb +89 -0
- data/lib/evoasm/prng.rb +64 -0
- data/lib/evoasm/program.rb +195 -12
- data/lib/evoasm/program/io.rb +144 -0
- data/lib/evoasm/test.rb +8 -0
- data/lib/evoasm/version.rb +1 -1
- data/lib/evoasm/x64.rb +115 -0
- data/lib/evoasm/x64/cpu_state.rb +95 -0
- data/lib/evoasm/x64/instruction.rb +109 -0
- data/lib/evoasm/x64/operand.rb +156 -0
- data/lib/evoasm/x64/parameters.rb +211 -0
- data/test/helpers/population_helper.rb +128 -0
- data/test/helpers/test_helper.rb +1 -0
- data/test/helpers/x64_helper.rb +24 -0
- data/test/integration/bitwise_reverse_test.rb +41 -0
- data/test/integration/gcd_test.rb +52 -0
- data/test/integration/popcnt_test.rb +46 -0
- data/test/integration/sym_reg_test.rb +68 -0
- data/test/unit/evoasm/buffer_test.rb +48 -0
- data/test/unit/evoasm/capstone_test.rb +18 -0
- data/test/unit/evoasm/domain_test.rb +55 -0
- data/test/unit/evoasm/population/parameters_test.rb +106 -0
- data/test/unit/evoasm/population_test.rb +96 -0
- data/test/unit/evoasm/prng_test.rb +47 -0
- data/test/unit/evoasm/x64/cpu_state_test.rb +73 -0
- data/test/unit/evoasm/x64/encoding_test.rb +320 -0
- data/test/unit/evoasm/x64/instruction_access_test.rb +177 -0
- data/test/unit/evoasm/x64/instruction_encoding_test.rb +780 -0
- data/test/unit/evoasm/x64/instruction_test.rb +62 -0
- data/test/unit/evoasm/x64/parameters_test.rb +65 -0
- data/test/unit/evoasm/x64_test.rb +52 -0
- metadata +195 -89
- data/Gemfile.rake +0 -8
- data/Gemfile.rake.lock +0 -51
- data/LICENSE.txt +0 -373
- data/data/tables/README.md +0 -19
- data/data/tables/x64.csv +0 -1684
- data/data/templates/evoasm-x64.c.erb +0 -319
- data/data/templates/evoasm-x64.h.erb +0 -126
- data/examples/abs.yml +0 -20
- data/examples/popcnt.yml +0 -17
- data/examples/sym_reg.yml +0 -26
- data/exe/evoasm-search +0 -13
- data/ext/evoasm_ext/evoasm-alloc.c +0 -145
- data/ext/evoasm_ext/evoasm-alloc.h +0 -59
- data/ext/evoasm_ext/evoasm-arch.c +0 -44
- data/ext/evoasm_ext/evoasm-arch.h +0 -161
- data/ext/evoasm_ext/evoasm-bitmap.h +0 -114
- data/ext/evoasm_ext/evoasm-buf.c +0 -130
- data/ext/evoasm_ext/evoasm-buf.h +0 -47
- data/ext/evoasm_ext/evoasm-error.c +0 -31
- data/ext/evoasm_ext/evoasm-error.h +0 -75
- data/ext/evoasm_ext/evoasm-free-list.c.tmpl +0 -121
- data/ext/evoasm_ext/evoasm-free-list.h.tmpl +0 -86
- data/ext/evoasm_ext/evoasm-log.h +0 -69
- data/ext/evoasm_ext/evoasm-misc.c +0 -23
- data/ext/evoasm_ext/evoasm-misc.h +0 -282
- data/ext/evoasm_ext/evoasm-param.h +0 -37
- data/ext/evoasm_ext/evoasm-search.c +0 -2145
- data/ext/evoasm_ext/evoasm-search.h +0 -214
- data/ext/evoasm_ext/evoasm-util.h +0 -40
- data/ext/evoasm_ext/evoasm-x64.c +0 -275624
- data/ext/evoasm_ext/evoasm-x64.h +0 -5436
- data/ext/evoasm_ext/evoasm.c +0 -7
- data/ext/evoasm_ext/evoasm.h +0 -23
- data/ext/evoasm_ext/evoasm_ext.c +0 -1757
- data/ext/evoasm_ext/extconf.rb +0 -31
- data/lib/evoasm/cli.rb +0 -6
- data/lib/evoasm/cli/search.rb +0 -127
- data/lib/evoasm/core_ext.rb +0 -1
- data/lib/evoasm/core_ext/array.rb +0 -9
- data/lib/evoasm/core_ext/integer.rb +0 -10
- data/lib/evoasm/core_ext/kwstruct.rb +0 -13
- data/lib/evoasm/core_ext/range.rb +0 -5
- data/lib/evoasm/examples.rb +0 -27
- data/lib/evoasm/gen.rb +0 -8
- data/lib/evoasm/gen/enum.rb +0 -169
- data/lib/evoasm/gen/name_util.rb +0 -80
- data/lib/evoasm/gen/state.rb +0 -176
- data/lib/evoasm/gen/state_dsl.rb +0 -152
- data/lib/evoasm/gen/strio.rb +0 -27
- data/lib/evoasm/gen/translator.rb +0 -1102
- data/lib/evoasm/gen/version.rb +0 -5
- data/lib/evoasm/gen/x64.rb +0 -237
- data/lib/evoasm/gen/x64/funcs.rb +0 -495
- data/lib/evoasm/gen/x64/inst.rb +0 -781
- data/lib/evoasm/search.rb +0 -40
- data/lib/evoasm/tasks/gen_task.rb +0 -86
- data/lib/evoasm/tasks/template_task.rb +0 -52
- data/test/test_helper.rb +0 -1
- data/test/x64/test_helper.rb +0 -19
- 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
|