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
data/lib/evoasm/search.rb DELETED
@@ -1,40 +0,0 @@
1
- module Evoasm
2
- class Search
3
- module Util
4
- def flatten_examples(examples)
5
- arity = check_arity examples
6
-
7
- [examples.flatten, arity]
8
- end
9
-
10
- def check_arity(examples)
11
- arity = Array(examples.first).size
12
- examples.each do |example|
13
- example_arity = Array(example).size
14
- if arity && arity != example_arity
15
- raise ArgumentError, "invalid arity for example '#{example}'"\
16
- " (#{example_arity} for #{arity})"
17
- end
18
- end
19
- arity
20
- end
21
- end
22
-
23
- DEFAULT_SEED = (1..64).to_a
24
- def initialize(arch, examples:, instructions:, kernel_size:,
25
- program_size:, population_size:, parameters:,
26
- mutation_rate: 0.10, seed: DEFAULT_SEED, domains: {}, recur_limit: 0)
27
-
28
- input_examples, output_examples = examples.keys, examples.values
29
- input_examples, input_arity = flatten_examples input_examples
30
- output_examples, output_arity = flatten_examples output_examples
31
-
32
- __initialize__ input_examples, input_arity, output_examples, output_arity,
33
- arch, population_size, kernel_size, program_size, instructions,
34
- parameters, mutation_rate, seed, domains, recur_limit
35
- end
36
-
37
- include Util
38
-
39
- end
40
- end
@@ -1,86 +0,0 @@
1
- require 'evoasm'
2
- require 'evoasm/gen/state'
3
- require 'evoasm/gen/translator'
4
-
5
- require 'rake'
6
-
7
- module Evoasm
8
- module Tasks
9
- class GenTask < Rake::TaskLib
10
- include Evoasm::Gen
11
-
12
- HEADER_N_LINES = 15
13
- CSV_SEPARATOR = ','
14
-
15
- attr_accessor :ruby_bindings
16
- attr_reader :name, :archs
17
-
18
- ALL_ARCHS = %i(x64)
19
- X64_TABLE_FILENAME = File.join(Evoasm.data, 'tables', 'x64.csv')
20
- ARCH_TABLES = {
21
- x64: X64_TABLE_FILENAME
22
- }
23
-
24
- def initialize(name = 'evoasm:gen', &block)
25
- @ruby_bindings = true
26
- @name = name
27
- @archs = ALL_ARCHS
28
-
29
- block[self] if block
30
-
31
- define
32
- end
33
-
34
- def define
35
- namespace 'evoasm:gen' do
36
- archs.each do |arch|
37
- prereqs = [ARCH_TABLES[arch]]
38
-
39
- prereqs << Translator.template_path(arch)
40
- target_path = gen_path(Translator.target_filename(arch))
41
-
42
- file target_path => prereqs do
43
- puts "Translating"
44
- insts = load_insts arch
45
- translator = Translator.new(arch, insts, ruby: ruby_bindings)
46
- translator.translate! do |filename, content|
47
- File.write gen_path(filename), content
48
- end
49
- end
50
-
51
- task "translate:#{arch}" => target_path
52
- end
53
-
54
- task 'translate' => archs.map { |arch| "translate:#{arch}" }
55
- end
56
-
57
- task name => 'gen:translate'
58
- end
59
-
60
- def gen_path(filename)
61
- File.join Evoasm.root, 'ext', 'evoasm_ext', filename
62
- end
63
-
64
- def load_insts(arch)
65
- send :"load_#{arch}_insts"
66
- end
67
-
68
- def load_x64_insts
69
- require 'evoasm/gen/x64/inst'
70
-
71
- rows = []
72
- File.open X64_TABLE_FILENAME do |file|
73
- file.each_line.with_index do |line, line_idx|
74
- # header
75
- next if line_idx == 0
76
-
77
- row = line.split(CSV_SEPARATOR)
78
- rows << row
79
- end
80
- end
81
-
82
- Gen::X64::Inst.load(rows)
83
- end
84
- end
85
- end
86
- end
@@ -1,52 +0,0 @@
1
- require 'rake'
2
- require 'yaml'
3
-
4
- module Evoasm
5
- module Tasks
6
- class TemplateTask < Rake::TaskLib
7
- attr_accessor :source
8
- attr_accessor :target
9
- attr_accessor :subs
10
-
11
- class << self
12
- attr_reader :all
13
- end
14
- @all = []
15
-
16
- def initialize(&block)
17
- block[self] if block
18
- define
19
- end
20
-
21
- def define
22
- srcs = Array(source).map { |f| ext_path f }
23
- dsts = Array(target).map { |f| gen_path f }
24
- srcs.zip(dsts).each do |src, dst|
25
- file dst => src do
26
- data = File.read src
27
- subs.sort_by{|k, _| k.length }.reverse.each do |name, value|
28
- data.gsub! "$#{name}", value.to_s
29
- data.gsub! "$#{name.upcase}", value.to_s.upcase
30
- p "$-#{name}"
31
- data.gsub! "$-#{name}", value.to_s.gsub('_', '-')
32
- end
33
- File.write dst, data
34
- end
35
- self.class.all << dst
36
- end
37
- end
38
-
39
- def ext_dir
40
- File.join Evoasm.root, 'ext', 'evoasm_ext'
41
- end
42
-
43
- def ext_path(filename)
44
- File.join ext_dir, filename
45
- end
46
-
47
- def gen_path(filename)
48
- File.join ext_dir, 'gen', filename
49
- end
50
- end
51
- end
52
- end
data/test/test_helper.rb DELETED
@@ -1 +0,0 @@
1
- require 'minitest/autorun'
@@ -1,19 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- require 'evoasm'
4
-
5
- module MiniTest::Assertions
6
- include Evoasm
7
-
8
- def assert_disassembles_to(disasm, inst_name, **params)
9
- assert_equal disasm,
10
- Evoasm::X64.disassemble(@x64.encode(inst_name, params)).first
11
- end
12
-
13
- def assert_assembles_to(asm, inst_name, **params)
14
- assert_equal asm, @x64.encode(inst_name, params)
15
- end
16
- end
17
-
18
- Array.infect_an_assertion :assert_disassembles_to, :must_disassemble_to
19
- Array.infect_an_assertion :assert_assembles_to, :must_assemble_to
data/test/x64/x64_test.rb DELETED
@@ -1,87 +0,0 @@
1
- require_relative 'test_helper'
2
-
3
- class X64Test < Minitest::Test
4
- def setup
5
- @x64 = Evoasm::X64.new
6
- @x64.encode :add_r32_rm32, reg0: :A, reg1: :B
7
- end
8
-
9
- def test_rm_reg_reg
10
- assert_disassembles_to 'add rax, rbx', :add_r64_rm64,
11
- reg0: :A, reg1: :B
12
- assert_disassembles_to 'add r11, r12', :add_r64_rm64,
13
- reg0: :R11, reg1: :R12
14
- assert_disassembles_to 'add eax, ebx', :add_r32_rm32,
15
- reg0: :A, reg1: :B
16
- assert_disassembles_to 'add ax, bx', :add_r16_rm16,
17
- reg0: :A, reg1: :B
18
- end
19
-
20
- def test_rm_reg_base
21
- assert_disassembles_to 'add rax, qword ptr [rbx]', :add_r64_rm64,
22
- reg0: :A, reg_base: :B
23
- assert_disassembles_to 'add r11, qword ptr [r12]', :add_r64_rm64,
24
- reg0: :R11, reg_base: :R12
25
- assert_disassembles_to 'add eax, dword ptr [rbx]', :add_r32_rm32,
26
- reg0: :A, reg_base: :B
27
- assert_disassembles_to 'add ax, word ptr [rbx]', :add_r16_rm16,
28
- reg0: :A, reg_base: :B
29
-
30
- # reg1 should be ignored
31
- assert_disassembles_to 'add eax, dword ptr [rbx]', :add_r32_rm32,
32
- reg0: :A, reg1: :C, reg_base: :B
33
- end
34
-
35
- def test_rm_reg_base32
36
- assert_disassembles_to 'add rax, dword ptr [ebx]', :add_r64_rm64,
37
- reg0: :A, reg_base: :B, address_size: 32
38
-
39
- assert_disassembles_to 'add eax, dword ptr [ebx]', :add_r32_rm32,
40
- reg0: :A, reg_base: :B, address_size: 32
41
- end
42
-
43
- def test_rm_reg_sib
44
- assert_disassembles_to 'add rax, qword ptr [rbx + rcx*4]', :add_r64_rm64,
45
- reg0: :A, reg_base: :B, reg_index: :C, scale: 4
46
- assert_disassembles_to 'add rax, qword ptr [rbx + rcx]', :add_r64_rm64,
47
- reg0: :A, reg_base: :B, reg_index: :C, scale: 1
48
- assert_disassembles_to 'add rax, qword ptr [rbx + rcx*8]', :add_r64_rm64,
49
- reg0: :A, reg_base: :B, reg_index: :C, scale: 8
50
-
51
- assert_disassembles_to 'add r10, qword ptr [r11 + r12*4]', :add_r64_rm64,
52
- reg0: :R10, reg_base: :R11, reg_index: :R12, scale: 4
53
-
54
- end
55
-
56
- def test_mi
57
- assert_disassembles_to 'add rax, 0xa', :add_rm64_imm8,
58
- reg0: :A, imm0: 0xa
59
-
60
- assert_disassembles_to 'add qword ptr [rax], 0xa', :add_rm64_imm8,
61
- reg_base: :A, imm0: 0xa
62
- end
63
-
64
- def test_vex
65
- assert_assembles_to "\xC5\xF5\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
66
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: false
67
- assert_assembles_to "\xC4\xE1u\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
68
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: true
69
- assert_disassembles_to 'vpaddsb ymm0, ymm1, ymm2', :vpaddsb_ymm_ymm_ymmm256,
70
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
71
- assert_disassembles_to 'vpaddsb ymm0, ymm1, ymm2', :vpaddsb_ymm_ymm_ymmm256,
72
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2, force_long_vex?: true
73
-
74
- assert_assembles_to "\xC5\xF5\xEC\xC2", :vpaddsb_ymm_ymm_ymmm256,
75
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
76
- assert_disassembles_to 'vpaddusb xmm0, xmm1, xmm2', :vpaddusb_xmm_xmm_xmmm128,
77
- reg0: :XMM0, reg1: :XMM1, reg2: :XMM2
78
- assert_assembles_to "\xC5\xF8\x5A\xCA", :vcvtps2pd_xmm_xmmm64,
79
- reg0: :XMM1, reg1: :XMM2
80
- assert_assembles_to "\xC5\xEA\x5A\xCB", :vcvtss2sd_xmm_xmm_xmmm32,
81
- reg0: :XMM1, reg1: :XMM2, reg2: :XMM3
82
-
83
- assert_assembles_to "\xC4\xE3\x79\x1D\xD1\x00", :vcvtps2ph_xmmm64_xmm_imm8,
84
- reg0: :XMM1, reg1: :XMM2, imm0: 0x0
85
- end
86
-
87
- end