orgasm 0.0.1a2 → 0.0.1a3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/bin/{disorgasm → ejaculate} +0 -0
  2. data/bin/swallow +0 -0
  3. data/lib/orgasm.rb +8 -2
  4. data/lib/orgasm/arch/i386.rb +27 -0
  5. data/lib/orgasm/{style.rb → arch/i386/base.rb} +4 -0
  6. data/lib/orgasm/{common → arch/i386/base}/address.rb +12 -19
  7. data/lib/orgasm/{common/unknown.rb → arch/i386/base/immediate.rb} +6 -10
  8. data/lib/orgasm/arch/i386/base/instruction.rb +41 -0
  9. data/lib/orgasm/arch/i386/base/register.rb +40 -0
  10. data/lib/orgasm/arch/i386/disassembler.rb +26 -154
  11. data/lib/orgasm/arch/i386/generator.rb +44 -0
  12. data/lib/orgasm/arch/i386/instructions.rb +150 -0
  13. data/lib/orgasm/arch/i386/instructions/dsl.rb +159 -0
  14. data/lib/orgasm/arch/i386/instructions/dsl/special.rb +75 -0
  15. data/lib/orgasm/arch/i386/instructions/instructions.rb +50 -0
  16. data/lib/orgasm/arch/i386/styles.rb +70 -0
  17. data/lib/orgasm/architecture.rb +103 -0
  18. data/lib/orgasm/assembler.rb +5 -16
  19. data/lib/orgasm/base.rb +50 -0
  20. data/lib/orgasm/{common/constant.rb → base/address.rb} +7 -6
  21. data/lib/orgasm/{common/register.rb → base/constant.rb} +11 -8
  22. data/lib/orgasm/base/instruction.rb +41 -0
  23. data/lib/orgasm/{common/instruction.rb → base/register.rb} +8 -8
  24. data/lib/orgasm/base/unknown.rb +36 -0
  25. data/lib/orgasm/disassembler.rb +25 -22
  26. data/lib/orgasm/disassembler/decoder.rb +26 -20
  27. data/lib/orgasm/{common/extensions.rb → extensions.rb} +12 -0
  28. data/lib/orgasm/generator.rb +46 -0
  29. data/lib/orgasm/generator/dsl.rb +60 -0
  30. data/lib/orgasm/piece.rb +49 -0
  31. data/lib/orgasm/styles.rb +64 -0
  32. data/lib/orgasm/styles/style.rb +55 -0
  33. data/lib/orgasm/version.rb +1 -1
  34. metadata +54 -14
  35. data/lib/orgasm/common.rb +0 -36
@@ -19,25 +19,14 @@
19
19
 
20
20
  module Orgasm
21
21
 
22
- class Assembler
23
- @@archs = {}
24
-
25
- def self.for (arch, &block)
26
- if block
27
- @@archs[arch] = self.new(arch, &block)
28
- else
29
- @@archs[arch]
30
- end
22
+ class Assembler < Piece
23
+ def initialize (*)
24
+ super
31
25
  end
32
26
 
33
- attr_reader :architecture, :features
34
-
35
- alias arch architecture
27
+ def assemble (instructions)
36
28
 
37
- def initialize (architecture, features=[])
38
- @architecture = architecture
39
- @features = features
40
- end
29
+ end; alias do assemble
41
30
  end
42
31
 
43
32
  end
@@ -0,0 +1,50 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'orgasm/extensions'
21
+
22
+ module Orgasm
23
+
24
+ def self.object? (value)
25
+ value.is_a?(Base) ? value : false
26
+ end
27
+
28
+ class Base
29
+ def initialize
30
+ yield self if block_given?
31
+ end
32
+
33
+ def to_s
34
+ begin
35
+ raise LoadError unless respond_to? :arch
36
+
37
+ Architecture[arch].style.apply(self)
38
+ rescue LoadError
39
+ super
40
+ end
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ require 'orgasm/base/unknown'
47
+ require 'orgasm/base/instruction'
48
+ require 'orgasm/base/address'
49
+ require 'orgasm/base/register'
50
+ require 'orgasm/base/constant'
@@ -19,19 +19,20 @@
19
19
 
20
20
  module Orgasm
21
21
 
22
- class Constant
23
- attr_reader :size
24
-
25
- def initialize (value, size)
22
+ class Address < Base
23
+ def initialize (value=nil)
26
24
  @value = value.to_i
27
- @size = size
28
25
 
29
- yield self if block_given?
26
+ super()
30
27
  end
31
28
 
32
29
  def to_i
33
30
  @value
34
31
  end
32
+
33
+ def inspect
34
+ "#<Address: #{to_i}>"
35
+ end
35
36
  end
36
37
 
37
38
  end
@@ -19,18 +19,21 @@
19
19
 
20
20
  module Orgasm
21
21
 
22
- class Register
23
- attr_reader :name, :size
22
+ class Constant < Base
23
+ attr_accessor :value
24
24
 
25
- def initialize (name, size)
26
- @name = name.to_sym
27
- @size = size.to_i
25
+ def initialize (value=nil)
26
+ @value = value.to_i if value
28
27
 
29
- yield self if block_given?
28
+ super()
30
29
  end
31
30
 
32
- def to_s
33
- name.to_s.upcase
31
+ def to_i
32
+ @value
33
+ end
34
+
35
+ def inspect
36
+ "#<Constant: #{to_i}>"
34
37
  end
35
38
  end
36
39
 
@@ -0,0 +1,41 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Orgasm
21
+
22
+ class Instruction < Base
23
+ attr_reader :name, :parameters
24
+
25
+ def initialize (name=nil, *parameters)
26
+ self.name = name if name
27
+ @parameters = parameters.to_a.flatten.compact
28
+
29
+ super()
30
+ end
31
+
32
+ def name= (value)
33
+ @name = value.downcase.to_sym
34
+ end
35
+
36
+ def inspect
37
+ "#<Instruction(#{name})#{": #{parameters.map {|p| p.inspect}.join(', ')}" unless parameters.empty?}>"
38
+ end
39
+ end
40
+
41
+ end
@@ -19,18 +19,18 @@
19
19
 
20
20
  module Orgasm
21
21
 
22
- class Instruction
23
- attr_reader :name, :parameters
22
+ class Register < Base
23
+ attr_accessor :name, :size
24
24
 
25
- def initialize (name, *parameters)
26
- @name = name.to_sym
27
- @parameters = parameters.to_a
25
+ def initialize (name=nil, size=nil)
26
+ @name = name.to_s.downcase.to_sym if name
27
+ @size = size.to_i if size
28
28
 
29
- yield self if block_given?
29
+ super()
30
30
  end
31
31
 
32
- def to_s
33
- "#{name.to_s.upcase} #{parameters.join(', ')}"
32
+ def inspect
33
+ "#<Register: #{@name}, #{@size} bits>"
34
34
  end
35
35
  end
36
36
 
@@ -0,0 +1,36 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Orgasm
21
+
22
+ class Unknown < Base
23
+ attr_accessor :data
24
+
25
+ def initialize (data=nil)
26
+ @data = data
27
+
28
+ super()
29
+ end
30
+
31
+ def inspect
32
+ "#<Unknown(#{data.length}): #{data.to_s.bytes.map {|x| '%02X' % x}.join(' ')}>"
33
+ end
34
+ end
35
+
36
+ end
@@ -17,31 +17,15 @@
17
17
  # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
- require 'orgasm/common'
21
20
  require 'orgasm/disassembler/decoder'
22
21
 
23
22
  module Orgasm
24
23
 
25
- class Disassembler
26
- @@archs = {}
24
+ class Disassembler < Piece
25
+ def initialize (*)
26
+ @decoders = []
27
27
 
28
- def self.for (arch, &block)
29
- if block
30
- @@archs[arch] = self.new(arch, &block)
31
- else
32
- @@archs[arch]
33
- end
34
- end
35
-
36
- attr_reader :architecture
37
-
38
- alias arch architecture
39
-
40
- def initialize (architecture, &block)
41
- @architecture = architecture
42
- @decoders = []
43
-
44
- instance_eval(&block)
28
+ super
45
29
  end
46
30
 
47
31
  def disassemble (io)
@@ -52,28 +36,47 @@ class Disassembler
52
36
  end
53
37
 
54
38
  result = []
39
+ junk = nil
55
40
 
56
41
  until io.eof?
57
42
  where = io.tell
58
43
 
59
44
  @decoders.each {|decoder|
60
45
  if tmp = Orgasm.object?(decoder.with(io).decode)
46
+ result << unknown(junk) and junk = nil if junk
61
47
  result << tmp
48
+
62
49
  break
63
50
  end
64
51
  }
65
52
 
66
53
  if where == io.tell
67
- raise RuntimeError, 'No input was read, something is wrong with the decoders'
54
+ (junk ||= '') << io.read(1)
68
55
  end
69
56
  end
70
57
 
58
+ result << unknown(junk) if junk
59
+
71
60
  result.flatten.compact
72
- end
61
+ end; alias do disassemble
73
62
 
74
63
  def on (*args, &block)
75
64
  @decoders << Decoder.new(*args, &block)
76
65
  end
66
+
67
+ def unknown (data=nil, &block)
68
+ if block
69
+ @unknown = block
70
+ elsif data
71
+ if @unknown
72
+ instance_exec data, &@unknown
73
+ else
74
+ instance_exec data do |data|
75
+ Unknown.new(data)
76
+ end
77
+ end
78
+ end
79
+ end
77
80
  end
78
81
 
79
82
  end
@@ -17,7 +17,7 @@
17
17
  # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
- module Orgasm; class Disassembler
20
+ module Orgasm; class Disassembler < Piece
21
21
 
22
22
  class Decoder
23
23
  def initialize (*args, &block)
@@ -33,12 +33,17 @@ class Decoder
33
33
  def decode
34
34
  return unless @io
35
35
 
36
- return unless @args.any? {|arg|
36
+ return unless match = @args.find {|arg|
37
37
  matches(arg)
38
38
  }
39
39
 
40
40
  catch(:result) {
41
- instance_eval &@block
41
+ start = @io.tell
42
+
43
+ @io.seek start if catch(:skip) {
44
+ _result(instance_exec @args, match, &@block)
45
+ false
46
+ }
42
47
  }
43
48
  end
44
49
 
@@ -60,15 +65,11 @@ class Decoder
60
65
  def on (*args, &block)
61
66
  return unless @io
62
67
 
63
- return unless args.any? {|arg|
68
+ return unless match = args.find {|arg|
64
69
  matches(arg)
65
70
  }
66
71
 
67
- result = instance_eval &block
68
-
69
- if Orgasm.object?(result)
70
- throw :result, result
71
- end
72
+ result = _result(instance_exec args, match, &block)
72
73
 
73
74
  result
74
75
  end
@@ -79,11 +80,7 @@ class Decoder
79
80
  if block
80
81
  where, = @io.tell, @io.seek(amount, whence)
81
82
 
82
- result = instance_eval &block
83
-
84
- if Orgasm.object?(result)
85
- throw :result, result
86
- end
83
+ result = _result(instance_eval &block)
87
84
 
88
85
  @io.seek(where)
89
86
 
@@ -103,11 +100,7 @@ class Decoder
103
100
  raise RuntimeError, 'The stream has not enough data :('
104
101
  end
105
102
 
106
- result = instance_exec data, &block
107
-
108
- if Orgasm.object?(result)
109
- throw :result, result
110
- end
103
+ result = _result(instance_exec data, &block)
111
104
 
112
105
  seek -amount
113
106
 
@@ -120,8 +113,21 @@ class Decoder
120
113
  def lookahead (amount)
121
114
  read(amount) do |data|
122
115
  data
123
- end
116
+ end rescue nil
117
+ end
118
+
119
+ def skip
120
+ throw :skip, true
124
121
  end
122
+
123
+ private
124
+ def _result (value)
125
+ if Orgasm.object?(value)
126
+ throw :result, value
127
+ end
128
+
129
+ value
130
+ end
125
131
  end
126
132
 
127
133
  end; end
@@ -17,6 +17,18 @@
17
17
  # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
18
  #++
19
19
 
20
+ require 'forwardable'
21
+ require 'refining'
22
+ require 'memoized'
23
+
20
24
  class String
21
25
  alias to_byte ord
22
26
  end
27
+
28
+ class Array
29
+ def to_syms
30
+ map {|x|
31
+ x.to_sym
32
+ }
33
+ end
34
+ end
@@ -0,0 +1,46 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'orgasm/generator/dsl'
21
+
22
+ module Orgasm
23
+
24
+ class Generator < Piece
25
+ def initialize (*)
26
+ @for = {}
27
+
28
+ super
29
+ end
30
+
31
+ def generate (&block)
32
+ DSL.new(&block).execute(self)
33
+ end; alias do generate
34
+
35
+ def for (klass, &block)
36
+ if block
37
+ @for[klass] = block
38
+ else
39
+ @for[klass] or @for.find {|(what, block)|
40
+ what.ancestors.member?(klass)
41
+ }.last
42
+ end
43
+ end
44
+ end
45
+
46
+ end