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