metasm 1.0.0 → 1.0.1
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/lib/metasm/ia32/decode.rb +1 -0
- data/lib/metasm/ia32/decompile.rb +2 -2
- data/lib/metasm/ia32/encode.rb +1 -1
- data/lib/metasm/ia32/main.rb +5 -0
- data/lib/metasm/ia32/opcodes.rb +3 -2
- data/lib/metasm/ia32/parse.rb +2 -1
- data/lib/metasm/ia32/render.rb +1 -1
- data/lib/metasm/x86_64/decode.rb +1 -0
- data/lib/metasm/x86_64/encode.rb +1 -1
- data/lib/metasm/x86_64/main.rb +4 -0
- data/lib/metasm/x86_64/parse.rb +1 -1
- metadata +4 -4
data/lib/metasm/ia32/decode.rb
CHANGED
@@ -194,6 +194,7 @@ class Ia32
|
|
194
194
|
when :reg; Reg.new field_val[a], opsz
|
195
195
|
when :eeec; CtrlReg.new field_val[a]
|
196
196
|
when :eeed; DbgReg.new field_val[a]
|
197
|
+
when :eeet; TstReg.new field_val[a]
|
197
198
|
when :seg2, :seg2A, :seg3, :seg3A; SegReg.new field_val[a]
|
198
199
|
when :regfp; FpReg.new field_val[a]
|
199
200
|
when :regmmx; SimdReg.new field_val[a], mmxsz
|
@@ -290,7 +290,7 @@ class Ia32
|
|
290
290
|
# mov cr0 etc
|
291
291
|
a1, a2 = di.instruction.args
|
292
292
|
case a1
|
293
|
-
when Ia32::CtrlReg, Ia32::DbgReg, Ia32::SegReg
|
293
|
+
when Ia32::CtrlReg, Ia32::DbgReg, Ia32::TstReg, Ia32::SegReg
|
294
294
|
sz = a1.kind_of?(Ia32::SegReg) ? 16 : 32
|
295
295
|
if not dcmp.c_parser.toplevel.symbol["intrinsic_set_#{a1}"]
|
296
296
|
dcmp.c_parser.parse("void intrinsic_set_#{a1}(__int#{sz});")
|
@@ -302,7 +302,7 @@ class Ia32
|
|
302
302
|
next
|
303
303
|
end
|
304
304
|
case a2
|
305
|
-
when Ia32::CtrlReg, Ia32::DbgReg, Ia32::SegReg
|
305
|
+
when Ia32::CtrlReg, Ia32::DbgReg, Ia32::TstReg, Ia32::SegReg
|
306
306
|
if not dcmp.c_parser.toplevel.symbol["intrinsic_get_#{a2}"]
|
307
307
|
sz = a2.kind_of?(Ia32::SegReg) ? 16 : 32
|
308
308
|
dcmp.c_parser.parse("__int#{sz} intrinsic_get_#{a2}(void);")
|
data/lib/metasm/ia32/encode.rb
CHANGED
@@ -240,7 +240,7 @@ class Ia32
|
|
240
240
|
postponed = []
|
241
241
|
oi.each { |oa, ia|
|
242
242
|
case oa
|
243
|
-
when :reg, :seg3, :seg3A, :seg2, :seg2A, :eeec, :eeed, :regfp, :regmmx, :regxmm
|
243
|
+
when :reg, :seg3, :seg3A, :seg2, :seg2A, :eeec, :eeed, :eeet, :regfp, :regmmx, :regxmm
|
244
244
|
# field arg
|
245
245
|
set_field[oa, ia.val]
|
246
246
|
pfx << 0x66 if oa == :regmmx and op.props[:xmmx] and ia.sz == 128
|
data/lib/metasm/ia32/main.rb
CHANGED
@@ -78,6 +78,11 @@ class Ia32 < CPU
|
|
78
78
|
simple_map((0..7).map { |i| [i, "cr#{i}"] })
|
79
79
|
end
|
80
80
|
|
81
|
+
# test registers (tr0..tr7) (undocumented)
|
82
|
+
class TstReg < Argument
|
83
|
+
simple_map((0..7).map { |i| [i, "tr#{i}"] })
|
84
|
+
end
|
85
|
+
|
81
86
|
# floating point registers
|
82
87
|
class FpReg < Argument
|
83
88
|
simple_map((0..7).map { |i| [i, "ST(#{i})"] } << [nil, 'ST'])
|
data/lib/metasm/ia32/opcodes.rb
CHANGED
@@ -11,14 +11,14 @@ class Ia32
|
|
11
11
|
def init_cpu_constants
|
12
12
|
@opcode_list ||= []
|
13
13
|
@fields_mask.update :w => 1, :s => 1, :d => 1, :modrm => 0xc7,
|
14
|
-
:reg => 7, :eeec => 7, :eeed => 7, :seg2 => 3, :seg3 => 7,
|
14
|
+
:reg => 7, :eeec => 7, :eeed => 7, :eeet => 7, :seg2 => 3, :seg3 => 7,
|
15
15
|
:regfp => 7, :regmmx => 7, :regxmm => 7
|
16
16
|
@fields_mask[:seg2A] = @fields_mask[:seg2]
|
17
17
|
@fields_mask[:seg3A] = @fields_mask[:seg3]
|
18
18
|
@fields_mask[:modrmA] = @fields_mask[:modrm]
|
19
19
|
|
20
20
|
@valid_args.concat [:i, :i8, :u8, :u16, :reg, :seg2, :seg2A,
|
21
|
-
:seg3, :seg3A, :eeec, :eeed, :modrm, :modrmA, :mrm_imm,
|
21
|
+
:seg3, :seg3A, :eeec, :eeed, :eeet, :modrm, :modrmA, :mrm_imm,
|
22
22
|
:farptr, :imm_val1, :imm_val3, :reg_cl, :reg_eax,
|
23
23
|
:reg_dx, :regfp, :regfp0, :modrmmmx, :regmmx,
|
24
24
|
:modrmxmm, :regxmm] - @valid_args
|
@@ -177,6 +177,7 @@ class Ia32
|
|
177
177
|
addop 'ltr', [0x0F, 0x00], 3
|
178
178
|
addop('mov', [0x0F, 0x20, 0xC0], :reg, {:d => [1, 1], :eeec => [2, 3]}, :eeec) { |op| op.args.reverse! }
|
179
179
|
addop('mov', [0x0F, 0x21, 0xC0], :reg, {:d => [1, 1], :eeed => [2, 3]}, :eeed) { |op| op.args.reverse! }
|
180
|
+
addop('mov', [0x0F, 0x24, 0xC0], :reg, {:d => [1, 1], :eeet => [2, 3]}, :eeet) { |op| op.args.reverse! }
|
180
181
|
addop('mov', [0x8C], 0, {:d => [0, 1], :seg3 => [1, 3]}, :seg3) { |op| op.args.reverse! }
|
181
182
|
addop 'out', [0xE6], nil, {:w => [0, 0]}, :u8, :reg_eax
|
182
183
|
addop 'out', [0xE6], nil, {:w => [0, 0]}, :reg_eax, :u8
|
data/lib/metasm/ia32/parse.rb
CHANGED
@@ -167,7 +167,7 @@ end
|
|
167
167
|
end
|
168
168
|
|
169
169
|
def parse_argregclasslist
|
170
|
-
[Reg, SimdReg, SegReg, DbgReg, CtrlReg, FpReg]
|
170
|
+
[Reg, SimdReg, SegReg, DbgReg, TstReg, CtrlReg, FpReg]
|
171
171
|
end
|
172
172
|
def parse_modrm(lex, tok, cpu)
|
173
173
|
ModRM.parse(lex, tok, cpu)
|
@@ -267,6 +267,7 @@ end
|
|
267
267
|
when :seg2A; arg.kind_of? SegReg and arg.val < 4 and arg.val != 1
|
268
268
|
when :eeec; arg.kind_of? CtrlReg
|
269
269
|
when :eeed; arg.kind_of? DbgReg
|
270
|
+
when :eeet; arg.kind_of? TstReg
|
270
271
|
when :modrmA; arg.kind_of? ModRM
|
271
272
|
when :mrm_imm; arg.kind_of? ModRM and not arg.s and not arg.i and not arg.b
|
272
273
|
when :farptr; arg.kind_of? Farptr
|
data/lib/metasm/ia32/render.rb
CHANGED
@@ -14,7 +14,7 @@ class Ia32
|
|
14
14
|
include Renderable
|
15
15
|
end
|
16
16
|
|
17
|
-
[SegReg, DbgReg, CtrlReg, FpReg].each { |c| c.class_eval {
|
17
|
+
[SegReg, DbgReg, TstReg, CtrlReg, FpReg].each { |c| c.class_eval {
|
18
18
|
def render ; [self.class.i_to_s[@val]] end
|
19
19
|
} }
|
20
20
|
[Reg, SimdReg].each { |c| c.class_eval {
|
data/lib/metasm/x86_64/decode.rb
CHANGED
@@ -112,6 +112,7 @@ class X86_64
|
|
112
112
|
when :reg; Reg.new field_val_r[a], opsz
|
113
113
|
when :eeec; CtrlReg.new field_val_r[a]
|
114
114
|
when :eeed; DbgReg.new field_val_r[a]
|
115
|
+
when :eeet; TstReg.new field_val_r[a]
|
115
116
|
when :seg2, :seg2A, :seg3, :seg3A; SegReg.new field_val[a]
|
116
117
|
when :regmmx; SimdReg.new field_val_r[a], mmxsz
|
117
118
|
when :regxmm; SimdReg.new field_val_r[a], 128
|
data/lib/metasm/x86_64/encode.rb
CHANGED
@@ -172,7 +172,7 @@ class X86_64
|
|
172
172
|
else
|
173
173
|
rex_b = ia.val_rex
|
174
174
|
end
|
175
|
-
when :seg3, :seg3A, :seg2, :seg2A, :eeec, :eeed, :regfp, :regxmm, :regmmx
|
175
|
+
when :seg3, :seg3A, :seg2, :seg2A, :eeec, :eeed, :eeet, :regfp, :regxmm, :regmmx
|
176
176
|
set_field[oa, ia.val & 7]
|
177
177
|
rex_r = 1 if ia.val > 7
|
178
178
|
pfx << 0x66 if oa == :regmmx and op.props[:xmmx] and ia.sz == 128
|
data/lib/metasm/x86_64/main.rb
CHANGED
@@ -94,6 +94,10 @@ class X86_64 < Ia32
|
|
94
94
|
simple_map((0..15).map { |i| [i, "cr#{i}"] })
|
95
95
|
end
|
96
96
|
|
97
|
+
class TstReg < Ia32::TstReg
|
98
|
+
simple_map((0..15).map { |i| [i, "tr#{i}"] })
|
99
|
+
end
|
100
|
+
|
97
101
|
# Create a new instance of an X86 cpu
|
98
102
|
# arguments (any order)
|
99
103
|
# - instruction set (386, 486, sse2...) [latest]
|
data/lib/metasm/x86_64/parse.rb
CHANGED
@@ -29,7 +29,7 @@ class X86_64
|
|
29
29
|
|
30
30
|
# needed due to how ruby inheritance works wrt constants
|
31
31
|
def parse_argregclasslist
|
32
|
-
[Reg, SimdReg, SegReg, DbgReg, CtrlReg, FpReg]
|
32
|
+
[Reg, SimdReg, SegReg, DbgReg, TstReg, CtrlReg, FpReg]
|
33
33
|
end
|
34
34
|
# same inheritance sh*t
|
35
35
|
def parse_modrm(lex, tok, cpu)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Yoann Guillot
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-30 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Metasm is a cross-architecture assembler, disassembler, compiler, linker and debugger in pure Ruby with no dependencies.
|