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
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