orgasm 0.0.1a2 → 0.0.1a3
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.
- data/bin/{disorgasm → ejaculate} +0 -0
- data/bin/swallow +0 -0
- data/lib/orgasm.rb +8 -2
- data/lib/orgasm/arch/i386.rb +27 -0
- data/lib/orgasm/{style.rb → arch/i386/base.rb} +4 -0
- data/lib/orgasm/{common → arch/i386/base}/address.rb +12 -19
- data/lib/orgasm/{common/unknown.rb → arch/i386/base/immediate.rb} +6 -10
- data/lib/orgasm/arch/i386/base/instruction.rb +41 -0
- data/lib/orgasm/arch/i386/base/register.rb +40 -0
- data/lib/orgasm/arch/i386/disassembler.rb +26 -154
- data/lib/orgasm/arch/i386/generator.rb +44 -0
- data/lib/orgasm/arch/i386/instructions.rb +150 -0
- data/lib/orgasm/arch/i386/instructions/dsl.rb +159 -0
- data/lib/orgasm/arch/i386/instructions/dsl/special.rb +75 -0
- data/lib/orgasm/arch/i386/instructions/instructions.rb +50 -0
- data/lib/orgasm/arch/i386/styles.rb +70 -0
- data/lib/orgasm/architecture.rb +103 -0
- data/lib/orgasm/assembler.rb +5 -16
- data/lib/orgasm/base.rb +50 -0
- data/lib/orgasm/{common/constant.rb → base/address.rb} +7 -6
- data/lib/orgasm/{common/register.rb → base/constant.rb} +11 -8
- data/lib/orgasm/base/instruction.rb +41 -0
- data/lib/orgasm/{common/instruction.rb → base/register.rb} +8 -8
- data/lib/orgasm/base/unknown.rb +36 -0
- data/lib/orgasm/disassembler.rb +25 -22
- data/lib/orgasm/disassembler/decoder.rb +26 -20
- data/lib/orgasm/{common/extensions.rb → extensions.rb} +12 -0
- data/lib/orgasm/generator.rb +46 -0
- data/lib/orgasm/generator/dsl.rb +60 -0
- data/lib/orgasm/piece.rb +49 -0
- data/lib/orgasm/styles.rb +64 -0
- data/lib/orgasm/styles/style.rb +55 -0
- data/lib/orgasm/version.rb +1 -1
- metadata +54 -14
- data/lib/orgasm/common.rb +0 -36
@@ -0,0 +1,159 @@
|
|
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/arch/i386/instructions/dsl/special'
|
21
|
+
|
22
|
+
module Orgasm; module I386
|
23
|
+
|
24
|
+
class DSL
|
25
|
+
def initialize (&block)
|
26
|
+
@instructions = Hash.new {|hash, key| hash[key] = []}
|
27
|
+
|
28
|
+
instance_eval &block
|
29
|
+
end
|
30
|
+
|
31
|
+
[:digit, # a digit between 0 ad 7 indicate that the ModR/M byte of the instruction
|
32
|
+
# uses only the r/m (register or memory) operand.
|
33
|
+
# The reg field contains the digit that provides an extension to the instruction's
|
34
|
+
# opcode.
|
35
|
+
|
36
|
+
:r, # indicates that the ModR/M byte of the instruction contains both a register operand
|
37
|
+
# and an r/m operand.
|
38
|
+
|
39
|
+
:cb, # 1 byte
|
40
|
+
:cw, # 2 bytes
|
41
|
+
:cd, # 4 bytes
|
42
|
+
:cp, # 6 bytes
|
43
|
+
# value following the opcode that is used to spcifya code ofset ad possibly a new
|
44
|
+
# value for the code segment register
|
45
|
+
|
46
|
+
:ib, # 1 byte
|
47
|
+
:iw, # 2 bytes
|
48
|
+
:id, # 4 bytes
|
49
|
+
# immediate operand to the instruction that follows the opcode, ModR/M bytes or
|
50
|
+
# scale-indexing bytes. The opcode determines if the operand is a signed value.
|
51
|
+
|
52
|
+
:rb, # a registercode, from 0 through 7, added to the hexadecimal byte gien at the left
|
53
|
+
:rw, # of the plus sign to form a single opcode byte.
|
54
|
+
:rd,
|
55
|
+
|
56
|
+
:i, # a number used in floating-point instructions when one of te operands is ST(i) from
|
57
|
+
# the FPU register stack. The number i (which can range from 0 to 7) is added to the
|
58
|
+
# hexadecial byte given at the left of the plus sign to form a singl opcode byte.
|
59
|
+
|
60
|
+
:rel8, # a relative address in the range from 128 byes before the end of the instruction to
|
61
|
+
# 127 bytes after the end of the instruction
|
62
|
+
|
63
|
+
:rel16, # a relative address withn the same code segment as the instruction assembled. Applies to
|
64
|
+
# instructions with an operand-size attribute of 16 bits
|
65
|
+
|
66
|
+
:rel32, # a relative address withn the same code segment as the instruction assembled. Applies to
|
67
|
+
# instructions with an operand-size attribute of 32 bits
|
68
|
+
|
69
|
+
:ptr16, # a far pointer, typically in a code segment different from that of the istuction.
|
70
|
+
# The notation of 16:16 indicates that the value of the pointer has two parts. The value
|
71
|
+
# to the left of he colon is a 16-bit selctor or value destined for the code segmet register.
|
72
|
+
# The valueto the right corresponds to the offset within the destination segmet. The ptr16:16
|
73
|
+
# symbol is used when the instruction's operand-size attribute is 16 bits; the ptr16:32 symbol
|
74
|
+
# is used wen the operand-size attribute is 32 bits.
|
75
|
+
|
76
|
+
:r8, # one of the byte gneral-purpose registers: AL, CL, DL, BL, AH, CH, DH, BH
|
77
|
+
:r16, # one of the word general-purpose registers: AX, CX, DX, BX, SP, BP, SI, DI
|
78
|
+
:r32, # one of the double-word general purpose registers: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
|
79
|
+
|
80
|
+
:imm8, # an immediate byte value. The imm8 symbol is a signed number between -128 and +127 inclusive.
|
81
|
+
# For instructins in which imm8 is combind with a word or doublewod operand, the immediate
|
82
|
+
# value is sign-extended to for a word or doubleword. The upper byte of the word is filled
|
83
|
+
# with the topmost bit of the immediate value
|
84
|
+
|
85
|
+
:imm16, # an immediate word value used forinstructions hose operand-size attribute is 16 bits.
|
86
|
+
# This is a number between -32768 and +32767 inclusive.
|
87
|
+
|
88
|
+
:imm32, # an immediate doubleword value used for instructions whose operand-size attribute is 32 bits.
|
89
|
+
# It allows the use of a number between +2147483647 and -2147483648 inclusive.
|
90
|
+
|
91
|
+
:m, # a 16 or 32 bit operand in memory.
|
92
|
+
|
93
|
+
:m8, # a byte operand in memory, usually expressed as a variable or array name, but pointed to by
|
94
|
+
# the S:(E)SI or ES:(E)DI registers. This nomeclature is used only with the string instructions
|
95
|
+
# and the XLAT instruction.
|
96
|
+
|
97
|
+
:m16, # a word operand in memory, usually exressed as a variable or array name, but pointed to by
|
98
|
+
# the DS()SI or ES(E)DI registers. This nomenclature is used only with te string instructions.
|
99
|
+
|
100
|
+
:m32, # a doubleword operand in memory, usually expressed as a variable or array name, but pointed
|
101
|
+
# to by the DS:(E)SI or ES:(E)DI registers. This nomenclature is ued only with the string
|
102
|
+
# instructions
|
103
|
+
|
104
|
+
:m64, # a memory quadword operand in memory. This nomenclaure is used only with the CMPXCHG8B instruction.
|
105
|
+
|
106
|
+
:m128, # a mmory double quadword operand in memory. This nomenclature is used only wh the Streaming
|
107
|
+
# SIMD Extensions.
|
108
|
+
|
109
|
+
:rm8, # a byte operand thtis either the contents of a byte general-purpose register (AL, BL, CL, DL,
|
110
|
+
# AH, BH, CH and DH), or a byte from memory
|
111
|
+
|
112
|
+
:rm16, # a word general-purpose register or memoy operand used for instructions whose operan-size attribute
|
113
|
+
# is 16 bits. The word gneral-purpose regsters are: AX, bx, CX, DX, SP, BP, SI and DI.
|
114
|
+
# The contents of memory are found at the address provided by the effective address computation.
|
115
|
+
|
116
|
+
:rm32, # a doubleword general-purpose register or memory operand used for instructions whose operand-size
|
117
|
+
# attribute is 32 bits. The doubleword general-purpose registers are: EAX, EBX, ECX, EDX, ESP,
|
118
|
+
# EBP ESI and EDI. The contents of memory are found at the address provided by the effective
|
119
|
+
# address computation
|
120
|
+
|
121
|
+
:mm, # an MMX™ technology register
|
122
|
+
:mm0,
|
123
|
+
:mm1,
|
124
|
+
:mm2,
|
125
|
+
:mm3,
|
126
|
+
:mm4,
|
127
|
+
:mm5,
|
128
|
+
:mm7,
|
129
|
+
|
130
|
+
:xmm, # a SIMD floating-point register.
|
131
|
+
:xmm0,
|
132
|
+
:xmm1,
|
133
|
+
:xmm2,
|
134
|
+
:xmm3,
|
135
|
+
:xmm4,
|
136
|
+
:xmm5,
|
137
|
+
:xmm7,
|
138
|
+
|
139
|
+
:al, :cl, :dl, :bl, :ah, :ch, :dh, :bh,
|
140
|
+
:ax, :cx, :dx, :bx, :sp, :bp, :si, :di,
|
141
|
+
:eax, :ecx, :edx, :ebx, :esp, :ebp, :esi, :edi
|
142
|
+
].each {|name|
|
143
|
+
value = Special.new(name)
|
144
|
+
|
145
|
+
define_method name do
|
146
|
+
value
|
147
|
+
end
|
148
|
+
}
|
149
|
+
|
150
|
+
def method_missing (id, *args)
|
151
|
+
@instructions[id.upcase].insert(-1, *args)
|
152
|
+
end
|
153
|
+
|
154
|
+
def to_hash
|
155
|
+
@instructions
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
end; end
|
@@ -0,0 +1,75 @@
|
|
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; module I386
|
21
|
+
|
22
|
+
class Special
|
23
|
+
class Operator
|
24
|
+
attr_reader :first, :second
|
25
|
+
|
26
|
+
def initialize (first, second)
|
27
|
+
@first = first
|
28
|
+
@second = second
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Or < Operator
|
33
|
+
def to_s
|
34
|
+
"#{first}|#{second}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class And < Operator
|
39
|
+
def to_s
|
40
|
+
"#{first}&#{second}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Offset < Operator
|
45
|
+
def to_s
|
46
|
+
"#{first}:#{second}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def initialize (value)
|
51
|
+
@value = value
|
52
|
+
end
|
53
|
+
|
54
|
+
def | (value)
|
55
|
+
Or.new(self, value)
|
56
|
+
end
|
57
|
+
|
58
|
+
def & (value)
|
59
|
+
And.new(self, value)
|
60
|
+
end
|
61
|
+
|
62
|
+
def ^ (value)
|
63
|
+
Offset.new(self, value)
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_sym
|
67
|
+
@value
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_s
|
71
|
+
@value.to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end; 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
|
+
module Orgasm; module I386
|
21
|
+
|
22
|
+
class Instructions < Hash
|
23
|
+
def registers
|
24
|
+
[:al, :cl, :dl, :bl, :ah, :ch, :dh, :bh,
|
25
|
+
:ax, :cx, :dx, :bx, :sp, :bp, :si, :di,
|
26
|
+
:eax, :ecx, :edx, :ebx, :esp, :ebp, :esi, :edi]
|
27
|
+
end
|
28
|
+
|
29
|
+
def register? (value)
|
30
|
+
return unless case value.to_s.downcase
|
31
|
+
when /^e[abcd]x$/,
|
32
|
+
/^e[bs]p$/,
|
33
|
+
/^e[sd]i$/,
|
34
|
+
/^[abcd]x$/,
|
35
|
+
/^[sb]p$/,
|
36
|
+
/^[sd]i$/,
|
37
|
+
/^[abcd][lh]$/ then true
|
38
|
+
|
39
|
+
else false
|
40
|
+
end
|
41
|
+
|
42
|
+
case value.to_s.downcase
|
43
|
+
when /^e/ then 32
|
44
|
+
when /[xpi]$/ then 16
|
45
|
+
when /[lh]$/ then 8
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end; end
|
@@ -0,0 +1,70 @@
|
|
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
|
+
style 'Intel' do |style|
|
21
|
+
style.for Register do
|
22
|
+
name.to_s.downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
style.for I386::Address do
|
26
|
+
offset? ? "[#{start}#{'%+d' % to_i}]" : "0x#{to_i.to_s(16)}"
|
27
|
+
end
|
28
|
+
|
29
|
+
style.for I386::Immediate do
|
30
|
+
to_i.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
style.for I386::Instruction do
|
34
|
+
"#{name.to_s.downcase}#{
|
35
|
+
case parameters.length
|
36
|
+
when 1 then " #{destination}"
|
37
|
+
when 2 then " #{destination}, #{source}"
|
38
|
+
end
|
39
|
+
}"
|
40
|
+
end
|
41
|
+
|
42
|
+
style.for Unknown do
|
43
|
+
"???(#{to_i})"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
style 'AT&T' do |style|
|
48
|
+
style.for Register do
|
49
|
+
"%#{name.to_s.downcase}"
|
50
|
+
end
|
51
|
+
|
52
|
+
style.for Address do
|
53
|
+
offset? ? "#{to_i}(#{start})" : "0x#{to_i.to_s(16)}"
|
54
|
+
end
|
55
|
+
|
56
|
+
style.for I386::Immediate do
|
57
|
+
"$#{to_i.to_s}"
|
58
|
+
end
|
59
|
+
|
60
|
+
style.for I386::Instruction do
|
61
|
+
"#{name.to_s.downcase}#{
|
62
|
+
{ b: 8, w: 16, l: 32 }.key((parameters.last.size rescue parameters.first.size rescue nil))
|
63
|
+
} #{parameters.reverse.join(', ')}"
|
64
|
+
end
|
65
|
+
|
66
|
+
style.for Unknown do
|
67
|
+
"???(#{to_i})"
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,103 @@
|
|
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 Architecture
|
23
|
+
@@archs = {}
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def for (name, &block)
|
27
|
+
(@@archs[name.downcase.to_sym] ||= Architecture.new(name)).do(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
alias is for
|
31
|
+
alias in for
|
32
|
+
|
33
|
+
def [] (name)
|
34
|
+
@@archs[name.downcase.to_sym]
|
35
|
+
end
|
36
|
+
|
37
|
+
def method_missing (id, *)
|
38
|
+
return self[id] if self[id]
|
39
|
+
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :name
|
45
|
+
|
46
|
+
def initialize (name, &block)
|
47
|
+
@name = name
|
48
|
+
|
49
|
+
self.do(&block)
|
50
|
+
end
|
51
|
+
|
52
|
+
def instructions (path=nil, &block)
|
53
|
+
return @instructions unless path or block
|
54
|
+
|
55
|
+
@instructions = if path
|
56
|
+
path = $:.each {|dir|
|
57
|
+
dir = File.join(dir, "#{path}.rb")
|
58
|
+
|
59
|
+
break dir if File.readable?(dir)
|
60
|
+
}.tap {|o|
|
61
|
+
raise LoadError, "no such file to load -- #{path}" unless o.is_a?(String)
|
62
|
+
}
|
63
|
+
|
64
|
+
instance_eval File.read(path), path, 1
|
65
|
+
else
|
66
|
+
instance_eval &block
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
[:disassembler, :assembler, :generator, :styles].each {|name|
|
71
|
+
define_method name do |path=nil, &block|
|
72
|
+
return instance_variable_get("@#{name}") unless path or block
|
73
|
+
|
74
|
+
instance_variable_set("@#{name}", if path
|
75
|
+
io = File.open($:.each {|dir|
|
76
|
+
dir = File.join(dir, "#{path}.rb")
|
77
|
+
|
78
|
+
break dir if File.readable?(dir)
|
79
|
+
}.tap {|o|
|
80
|
+
raise LoadError, "no such file to load -- #{path}" unless o.is_a?(String)
|
81
|
+
}, 'r')
|
82
|
+
|
83
|
+
Orgasm.const_get(name.capitalize).new(self, io)
|
84
|
+
else
|
85
|
+
Orgasm.const_get(name.capitalize).new(self, &block)
|
86
|
+
end)
|
87
|
+
end
|
88
|
+
}
|
89
|
+
|
90
|
+
def do (string=nil, &block)
|
91
|
+
if block
|
92
|
+
instance_eval &block
|
93
|
+
elsif string
|
94
|
+
instance_eval string
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_s
|
99
|
+
@name
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|