metasm 1.0.3 → 1.0.4
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +3 -0
- data.tar.gz.sig +0 -0
- data/Gemfile +3 -2
- data/metasm.gemspec +3 -2
- data/metasm.rb +4 -1
- data/metasm/compile_c.rb +2 -2
- data/metasm/cpu/arc/decode.rb +0 -21
- data/metasm/cpu/arc/main.rb +4 -4
- data/metasm/cpu/arm/decode.rb +1 -5
- data/metasm/cpu/arm/main.rb +3 -3
- data/metasm/cpu/arm64/decode.rb +2 -6
- data/metasm/cpu/arm64/main.rb +5 -5
- data/metasm/cpu/bpf/decode.rb +3 -35
- data/metasm/cpu/bpf/main.rb +5 -5
- data/metasm/cpu/bpf/render.rb +1 -12
- data/metasm/cpu/cy16/decode.rb +0 -6
- data/metasm/cpu/cy16/main.rb +3 -3
- data/metasm/cpu/cy16/render.rb +0 -11
- data/metasm/cpu/dalvik/decode.rb +4 -26
- data/metasm/cpu/dalvik/main.rb +20 -2
- data/metasm/cpu/dalvik/opcodes.rb +3 -2
- data/metasm/cpu/{mips/compile_c.rb → ebpf.rb} +5 -2
- data/metasm/cpu/ebpf/debug.rb +61 -0
- data/metasm/cpu/ebpf/decode.rb +142 -0
- data/metasm/cpu/ebpf/main.rb +58 -0
- data/metasm/cpu/ebpf/opcodes.rb +97 -0
- data/metasm/cpu/ebpf/render.rb +36 -0
- data/metasm/cpu/ia32/debug.rb +39 -1
- data/metasm/cpu/ia32/decode.rb +111 -90
- data/metasm/cpu/ia32/decompile.rb +45 -37
- data/metasm/cpu/ia32/main.rb +10 -0
- data/metasm/cpu/ia32/parse.rb +6 -0
- data/metasm/cpu/mcs51/decode.rb +1 -1
- data/metasm/cpu/mcs51/main.rb +11 -0
- data/metasm/cpu/mips/decode.rb +8 -18
- data/metasm/cpu/mips/main.rb +3 -3
- data/metasm/cpu/mips/opcodes.rb +1 -1
- data/metasm/cpu/msp430/decode.rb +2 -6
- data/metasm/cpu/msp430/main.rb +3 -3
- data/metasm/cpu/openrisc.rb +11 -0
- data/metasm/cpu/openrisc/debug.rb +106 -0
- data/metasm/cpu/openrisc/decode.rb +182 -0
- data/metasm/cpu/openrisc/decompile.rb +350 -0
- data/metasm/cpu/openrisc/main.rb +70 -0
- data/metasm/cpu/openrisc/opcodes.rb +109 -0
- data/metasm/cpu/openrisc/render.rb +37 -0
- data/metasm/cpu/ppc/decode.rb +0 -25
- data/metasm/cpu/ppc/main.rb +6 -6
- data/metasm/cpu/ppc/opcodes.rb +3 -4
- data/metasm/cpu/python/decode.rb +0 -20
- data/metasm/cpu/python/main.rb +1 -1
- data/metasm/cpu/sh4/decode.rb +2 -6
- data/metasm/cpu/sh4/main.rb +25 -23
- data/metasm/cpu/st20/decode.rb +0 -7
- data/metasm/cpu/webasm.rb +11 -0
- data/metasm/cpu/webasm/debug.rb +31 -0
- data/metasm/cpu/webasm/decode.rb +321 -0
- data/metasm/cpu/webasm/decompile.rb +386 -0
- data/metasm/cpu/webasm/encode.rb +104 -0
- data/metasm/cpu/webasm/main.rb +81 -0
- data/metasm/cpu/webasm/opcodes.rb +214 -0
- data/metasm/cpu/x86_64/compile_c.rb +13 -9
- data/metasm/cpu/x86_64/parse.rb +1 -1
- data/metasm/cpu/z80/decode.rb +0 -27
- data/metasm/cpu/z80/main.rb +3 -3
- data/metasm/cpu/z80/render.rb +0 -11
- data/metasm/debug.rb +43 -8
- data/metasm/decode.rb +62 -14
- data/metasm/decompile.rb +793 -466
- data/metasm/disassemble.rb +188 -131
- data/metasm/disassemble_api.rb +30 -17
- data/metasm/dynldr.rb +2 -2
- data/metasm/encode.rb +8 -2
- data/metasm/exe_format/autoexe.rb +2 -0
- data/metasm/exe_format/coff.rb +21 -3
- data/metasm/exe_format/coff_decode.rb +12 -0
- data/metasm/exe_format/coff_encode.rb +6 -3
- data/metasm/exe_format/dex.rb +13 -3
- data/metasm/exe_format/elf.rb +12 -2
- data/metasm/exe_format/elf_decode.rb +59 -1
- data/metasm/exe_format/main.rb +2 -0
- data/metasm/exe_format/mz.rb +1 -0
- data/metasm/exe_format/pe.rb +25 -3
- data/metasm/exe_format/wasm.rb +402 -0
- data/metasm/gui/dasm_decomp.rb +171 -95
- data/metasm/gui/dasm_graph.rb +61 -2
- data/metasm/gui/dasm_hex.rb +2 -2
- data/metasm/gui/dasm_main.rb +45 -19
- data/metasm/gui/debug.rb +13 -4
- data/metasm/gui/gtk.rb +12 -4
- data/metasm/main.rb +108 -103
- data/metasm/os/emulator.rb +175 -0
- data/metasm/os/main.rb +11 -6
- data/metasm/parse.rb +23 -12
- data/metasm/parse_c.rb +189 -135
- data/metasm/preprocessor.rb +16 -1
- data/misc/openrisc-parser.rb +79 -0
- data/samples/dasm-plugins/scanxrefs.rb +6 -4
- data/samples/dasm-plugins/selfmodify.rb +8 -8
- data/samples/dbg-plugins/trace_func.rb +1 -1
- data/samples/disassemble-gui.rb +14 -3
- data/samples/emubios.rb +251 -0
- data/samples/emudbg.rb +127 -0
- data/samples/lindebug.rb +79 -78
- data/samples/metasm-shell.rb +8 -8
- data/tests/all.rb +1 -1
- data/tests/expression.rb +2 -0
- data/tests/graph_layout.rb +1 -1
- data/tests/ia32.rb +1 -0
- data/tests/mips.rb +1 -1
- data/tests/preprocessor.rb +18 -0
- metadata +124 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 474c2cb9b50af29f462619d47eb2c5ed062770ad
|
|
4
|
+
data.tar.gz: 9c82c356ea5d83f49c46a124289dd6d8c48a775e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 13d4f03ef8be7f1b793fb5e8fcc9e555894c6341042e996dd4bf11caaf1c9da4984a019d7244ea6df4137f7a790f5894b73a5e5d8b26915a6e027664debda1ce
|
|
7
|
+
data.tar.gz: ffc8f18dd425e81eff43f08a03d89590c4705fd27db3fd43f3b5ea956063436003aa423bf7ae92c400dbf068509173cf8ce3068f83a971bf2934a2c28a4a35ff
|
checksums.yaml.gz.sig
ADDED
data.tar.gz.sig
ADDED
|
Binary file
|
data/Gemfile
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
gemspec
|
|
1
|
+
source 'https://rubygems.org' do
|
|
2
|
+
gemspec
|
|
3
|
+
end
|
data/metasm.gemspec
CHANGED
|
@@ -4,7 +4,7 @@ require 'metasm'
|
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
6
|
s.name = 'metasm'
|
|
7
|
-
s.version = '1.0.
|
|
7
|
+
s.version = '1.0.4'
|
|
8
8
|
s.summary =
|
|
9
9
|
"Metasm is a cross-architecture assembler, disassembler, linker, and debugger."
|
|
10
10
|
s.description = ""
|
|
@@ -14,9 +14,10 @@ Gem::Specification.new do |s|
|
|
|
14
14
|
s.test_files = s.files.grep(%r{^tests/})
|
|
15
15
|
s.require_paths = ["."]
|
|
16
16
|
s.homepage = 'http://metasm.cr0.org'
|
|
17
|
-
s.license = 'LGPL'
|
|
17
|
+
s.license = 'LGPL-2.1'
|
|
18
18
|
|
|
19
19
|
s.add_development_dependency "bundler", "~> 1.7"
|
|
20
20
|
s.add_development_dependency "rake"
|
|
21
|
+
s.add_development_dependency "test-unit"
|
|
21
22
|
end
|
|
22
23
|
|
data/metasm.rb
CHANGED
|
@@ -36,8 +36,9 @@ module Metasm
|
|
|
36
36
|
Const_autorequire = {
|
|
37
37
|
'Ia32' => 'cpu/ia32', 'MIPS' => 'cpu/mips', 'PowerPC' => 'cpu/ppc', 'ARM' => 'cpu/arm',
|
|
38
38
|
'X86_64' => 'cpu/x86_64', 'Sh4' => 'cpu/sh4', 'Dalvik' => 'cpu/dalvik', 'ARC' => 'cpu/arc',
|
|
39
|
-
'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf',
|
|
39
|
+
'Python' => 'cpu/python', 'Z80' => 'cpu/z80', 'CY16' => 'cpu/cy16', 'BPF' => 'cpu/bpf', 'EBPF' => 'cpu/ebpf',
|
|
40
40
|
'MSP430' => 'cpu/msp430', 'ARM64' => 'cpu/arm64', 'ST20' => 'cpu/st20', 'MCS51' => 'cpu/mcs51',
|
|
41
|
+
'OpenRisc' => 'cpu/openrisc', 'WebAsm' => 'cpu/webasm',
|
|
41
42
|
'C' => 'compile_c',
|
|
42
43
|
'MZ' => 'exe_format/mz', 'PE' => 'exe_format/pe',
|
|
43
44
|
'ELF' => 'exe_format/elf', 'COFF' => 'exe_format/coff',
|
|
@@ -49,6 +50,7 @@ module Metasm
|
|
|
49
50
|
'Bflt' => 'exe_format/bflt', 'Dol' => 'exe_format/dol',
|
|
50
51
|
'PYC' => 'exe_format/pyc', 'JavaClass' => 'exe_format/javaclass',
|
|
51
52
|
'SWF' => 'exe_format/swf', 'ZIP' => 'exe_format/zip',
|
|
53
|
+
'WasmFile' => 'exe_format/wasm',
|
|
52
54
|
'Shellcode_RWX' => 'exe_format/shellcode_rwx',
|
|
53
55
|
'Gui' => 'gui',
|
|
54
56
|
'WindowsExports' => 'os/windows_exports',
|
|
@@ -56,6 +58,7 @@ module Metasm
|
|
|
56
58
|
'Debugger' => 'debug',
|
|
57
59
|
'LinOS' => 'os/linux', 'WinOS' => 'os/windows',
|
|
58
60
|
'GdbClient' => 'os/gdbremote',
|
|
61
|
+
'EmuDebugger' => 'os/emulator',
|
|
59
62
|
'Disassembler' => 'disassemble',
|
|
60
63
|
'Decompiler' => 'decompile',
|
|
61
64
|
'DynLdr' => 'dynldr',
|
data/metasm/compile_c.rb
CHANGED
|
@@ -864,7 +864,7 @@ module C
|
|
|
864
864
|
blk.statements.each_with_index { |s, i|
|
|
865
865
|
case s
|
|
866
866
|
when Case
|
|
867
|
-
label = compiler.new_label(
|
|
867
|
+
label = compiler.new_label("case_#{s.expr}")
|
|
868
868
|
if s.expr == 'default'
|
|
869
869
|
default = label
|
|
870
870
|
elsif s.exprup
|
|
@@ -1063,7 +1063,7 @@ module C
|
|
|
1063
1063
|
@lexpr = nil
|
|
1064
1064
|
precompile_inner(compiler, scope)
|
|
1065
1065
|
when :'?:'
|
|
1066
|
-
# cannot precompile in place, a
|
|
1066
|
+
# cannot precompile in place, a conditional expression may have a coma: must turn into If
|
|
1067
1067
|
if @lexpr.kind_of? CExpression
|
|
1068
1068
|
@lexpr = @lexpr.precompile_inner(compiler, scope)
|
|
1069
1069
|
if not @lexpr.lexpr and not @lexpr.op and @lexpr.rexpr.kind_of? ::Numeric
|
data/metasm/cpu/arc/decode.rb
CHANGED
|
@@ -313,10 +313,6 @@ class ARC
|
|
|
313
313
|
REG_SYMS
|
|
314
314
|
end
|
|
315
315
|
|
|
316
|
-
def backtrace_binding
|
|
317
|
-
@backtrace_binding ||= init_backtrace_binding
|
|
318
|
-
end
|
|
319
|
-
|
|
320
316
|
def opshift(op)
|
|
321
317
|
op[/\d/].to_i
|
|
322
318
|
end
|
|
@@ -382,23 +378,6 @@ class ARC
|
|
|
382
378
|
@backtrace_binding
|
|
383
379
|
end
|
|
384
380
|
|
|
385
|
-
def get_backtrace_binding(di)
|
|
386
|
-
a = di.instruction.args.map { |arg|
|
|
387
|
-
case arg
|
|
388
|
-
when GPR; arg.symbolic
|
|
389
|
-
when Memref; arg.symbolic(di.address)
|
|
390
|
-
else arg
|
|
391
|
-
end
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
if binding = backtrace_binding[di.opcode.basename]
|
|
395
|
-
binding[di, *a]
|
|
396
|
-
else
|
|
397
|
-
puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
|
|
398
|
-
{ :incomplete_binding => Expression[1] }
|
|
399
|
-
end
|
|
400
|
-
end
|
|
401
|
-
|
|
402
381
|
def get_xrefs_x(dasm, di)
|
|
403
382
|
return [] if not di.opcode.props[:setip]
|
|
404
383
|
|
data/metasm/cpu/arc/main.rb
CHANGED
|
@@ -40,7 +40,7 @@ class ARC < CPU
|
|
|
40
40
|
# Branch Link Register R31 (BLINK)
|
|
41
41
|
class GPR < Reg
|
|
42
42
|
Sym = (0..64).map { |i| "r#{i}".to_sym }
|
|
43
|
-
def symbolic; Sym[@i] end
|
|
43
|
+
def symbolic(di=nil); Sym[@i] end
|
|
44
44
|
|
|
45
45
|
Render = {
|
|
46
46
|
26 => 'gp', # global pointer, used to point to small sets of shared data throughout execution of a program
|
|
@@ -69,7 +69,7 @@ class ARC < CPU
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
class AUX < Reg
|
|
72
|
-
def symbolic; "aux#{i}".to_sym end
|
|
72
|
+
def symbolic(di=nil); "aux#{i}".to_sym end
|
|
73
73
|
|
|
74
74
|
Render = {
|
|
75
75
|
0x00 => 'status', # Status register (Original ARCtangent-A4 processor format)
|
|
@@ -162,7 +162,7 @@ class ARC < CPU
|
|
|
162
162
|
@base, @disp, @size = base, disp, sz
|
|
163
163
|
end
|
|
164
164
|
|
|
165
|
-
def symbolic(
|
|
165
|
+
def symbolic(di=nil)
|
|
166
166
|
b = @base
|
|
167
167
|
b = b.symbolic if b.kind_of? Reg
|
|
168
168
|
|
|
@@ -174,7 +174,7 @@ class ARC < CPU
|
|
|
174
174
|
e = Expression[b].reduce
|
|
175
175
|
end
|
|
176
176
|
|
|
177
|
-
Indirection[e, @size,
|
|
177
|
+
Indirection[e, @size, (di.address if di)]
|
|
178
178
|
end
|
|
179
179
|
|
|
180
180
|
include Renderable
|
data/metasm/cpu/arm/decode.rb
CHANGED
|
@@ -125,10 +125,6 @@ class ARM
|
|
|
125
125
|
di
|
|
126
126
|
end
|
|
127
127
|
|
|
128
|
-
def backtrace_binding
|
|
129
|
-
@backtrace_binding ||= init_backtrace_binding
|
|
130
|
-
end
|
|
131
|
-
|
|
132
128
|
def init_backtrace_binding
|
|
133
129
|
@backtrace_binding ||= {}
|
|
134
130
|
end
|
|
@@ -137,7 +133,7 @@ class ARM
|
|
|
137
133
|
a = di.instruction.args.map { |arg|
|
|
138
134
|
case arg
|
|
139
135
|
when Reg; arg.symbolic
|
|
140
|
-
when Memref; arg.symbolic(di
|
|
136
|
+
when Memref; arg.symbolic(di)
|
|
141
137
|
else arg
|
|
142
138
|
end
|
|
143
139
|
}
|
data/metasm/cpu/arm/main.rb
CHANGED
|
@@ -25,7 +25,7 @@ class ARM < CPU
|
|
|
25
25
|
@shift = shift
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def symbolic
|
|
28
|
+
def symbolic(di=nil)
|
|
29
29
|
r = self.class.i_to_s[@i].to_sym
|
|
30
30
|
if @stype == :lsl and @shift == 0
|
|
31
31
|
r
|
|
@@ -41,11 +41,11 @@ class ARM < CPU
|
|
|
41
41
|
@base, @offset, @sign, @incr = base, offset, sign, incr
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
def symbolic(
|
|
44
|
+
def symbolic(di=nil)
|
|
45
45
|
o = @offset
|
|
46
46
|
o = o.symbolic if o.kind_of? Reg
|
|
47
47
|
p = Expression[@base.symbolic, @sign, o].reduce
|
|
48
|
-
Indirection[p,
|
|
48
|
+
Indirection[p, 4, (di.address if di)]
|
|
49
49
|
end
|
|
50
50
|
end
|
|
51
51
|
|
data/metasm/cpu/arm64/decode.rb
CHANGED
|
@@ -165,10 +165,6 @@ class ARM64
|
|
|
165
165
|
di
|
|
166
166
|
end
|
|
167
167
|
|
|
168
|
-
def backtrace_binding
|
|
169
|
-
@backtrace_binding ||= init_backtrace_binding
|
|
170
|
-
end
|
|
171
|
-
|
|
172
168
|
def init_backtrace_binding
|
|
173
169
|
@backtrace_binding ||= {}
|
|
174
170
|
|
|
@@ -211,7 +207,7 @@ class ARM64
|
|
|
211
207
|
a = di.instruction.args.map { |arg|
|
|
212
208
|
case arg
|
|
213
209
|
when Reg, RegShift, RegCC; arg.symbolic
|
|
214
|
-
when Memref; arg.symbolic(di
|
|
210
|
+
when Memref; arg.symbolic(di)
|
|
215
211
|
else arg
|
|
216
212
|
end
|
|
217
213
|
}
|
|
@@ -269,7 +265,7 @@ class ARM64
|
|
|
269
265
|
raise 'internal error: no jmp target' if di.opcode.name != 'ret'
|
|
270
266
|
tg = :x30
|
|
271
267
|
when Expression
|
|
272
|
-
else tg = tg.symbolic
|
|
268
|
+
else tg = tg.symbolic(di)
|
|
273
269
|
end
|
|
274
270
|
[tg]
|
|
275
271
|
else
|
data/metasm/cpu/arm64/main.rb
CHANGED
|
@@ -24,7 +24,7 @@ class ARM64 < CPU
|
|
|
24
24
|
|
|
25
25
|
Sym = @i_to_s[64].inject({}) { |h, (k, v)| h.update k => v.to_sym }
|
|
26
26
|
|
|
27
|
-
def symbolic
|
|
27
|
+
def symbolic(di=nil)
|
|
28
28
|
if @sz == 64
|
|
29
29
|
Sym[@i]
|
|
30
30
|
else
|
|
@@ -41,7 +41,7 @@ class ARM64 < CPU
|
|
|
41
41
|
@shift = shift
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
def symbolic
|
|
44
|
+
def symbolic(di=nil)
|
|
45
45
|
sym = @reg.symbolic
|
|
46
46
|
if shift != 0
|
|
47
47
|
case @mode
|
|
@@ -59,7 +59,7 @@ class ARM64 < CPU
|
|
|
59
59
|
def initialize(cc)
|
|
60
60
|
@cc = cc
|
|
61
61
|
end
|
|
62
|
-
def symbolic
|
|
62
|
+
def symbolic(di=nil)
|
|
63
63
|
0
|
|
64
64
|
end
|
|
65
65
|
end
|
|
@@ -70,7 +70,7 @@ class ARM64 < CPU
|
|
|
70
70
|
@base, @index, @scale, @offset, @sz, @incr = base, index, scale, offset, sz, incr
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def symbolic(
|
|
73
|
+
def symbolic(di=nil)
|
|
74
74
|
o = Expression[@base.symbolic]
|
|
75
75
|
if @index
|
|
76
76
|
si = @index.symbolic
|
|
@@ -78,7 +78,7 @@ class ARM64 < CPU
|
|
|
78
78
|
o = Expression[o, :+, si]
|
|
79
79
|
end
|
|
80
80
|
o = Expression[o, :+, @offset] if @offset and @incr != :post
|
|
81
|
-
Indirection[o.reduce, @sz,
|
|
81
|
+
Indirection[o.reduce, @sz, (di.address if di)]
|
|
82
82
|
end
|
|
83
83
|
end
|
|
84
84
|
|
data/metasm/cpu/bpf/decode.rb
CHANGED
|
@@ -33,9 +33,9 @@ class BPF
|
|
|
33
33
|
when :x; Reg.new(:x)
|
|
34
34
|
when :a; Reg.new(:a)
|
|
35
35
|
when :len; Reg.new(:len)
|
|
36
|
-
when :p_k;
|
|
37
|
-
when :p_xk;
|
|
38
|
-
when :m_k;
|
|
36
|
+
when :p_k; Pktref.new(nil, Expression[k], op.props[:msz])
|
|
37
|
+
when :p_xk; Pktref.new(Reg.new(:x), Expression[k], op.props[:msz])
|
|
38
|
+
when :m_k; Memref.new(nil, Expression[4*k], 4)
|
|
39
39
|
when :jt; Expression[jt]
|
|
40
40
|
when :jf; Expression[jf]
|
|
41
41
|
else raise "unhandled arg #{a}"
|
|
@@ -74,12 +74,6 @@ class BPF
|
|
|
74
74
|
di
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
# hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
|
|
78
|
-
def backtrace_binding
|
|
79
|
-
@backtrace_binding ||= init_backtrace_binding
|
|
80
|
-
end
|
|
81
|
-
def backtrace_binding=(b) @backtrace_binding = b end
|
|
82
|
-
|
|
83
77
|
# populate the @backtrace_binding hash with default values
|
|
84
78
|
def init_backtrace_binding
|
|
85
79
|
@backtrace_binding ||= {}
|
|
@@ -103,22 +97,6 @@ class BPF
|
|
|
103
97
|
@backtrace_binding
|
|
104
98
|
end
|
|
105
99
|
|
|
106
|
-
def get_backtrace_binding(di)
|
|
107
|
-
a = di.instruction.args.map { |arg|
|
|
108
|
-
case arg
|
|
109
|
-
when PktRef, MemRef, Reg; arg.symbolic(di)
|
|
110
|
-
else arg
|
|
111
|
-
end
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if binding = backtrace_binding[di.opcode.name]
|
|
115
|
-
binding[di, *a]
|
|
116
|
-
else
|
|
117
|
-
puts "unhandled instruction to backtrace: #{di}" if $VERBOSE
|
|
118
|
-
{:incomplete_binding => Expression[1]}
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
100
|
def get_xrefs_x(dasm, di)
|
|
123
101
|
return [] if not di.opcode.props[:setip]
|
|
124
102
|
|
|
@@ -128,15 +106,5 @@ class BPF
|
|
|
128
106
|
di.instruction.args[-1, 1]
|
|
129
107
|
end
|
|
130
108
|
end
|
|
131
|
-
|
|
132
|
-
# updates an instruction's argument replacing an expression with another (eg label renamed)
|
|
133
|
-
def replace_instr_arg_immediate(i, old, new)
|
|
134
|
-
i.args.map! { |a|
|
|
135
|
-
case a
|
|
136
|
-
when Expression; a == old ? new : Expression[a.bind(old => new).reduce]
|
|
137
|
-
else a
|
|
138
|
-
end
|
|
139
|
-
}
|
|
140
|
-
end
|
|
141
109
|
end
|
|
142
110
|
end
|
data/metasm/cpu/bpf/main.rb
CHANGED
|
@@ -14,10 +14,10 @@ class BPF < CPU
|
|
|
14
14
|
@v = v
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def symbolic(
|
|
17
|
+
def symbolic(di=nil) ; @v ; end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
class
|
|
20
|
+
class Memref
|
|
21
21
|
attr_accessor :base, :offset, :msz
|
|
22
22
|
|
|
23
23
|
def memtype
|
|
@@ -30,15 +30,15 @@ class BPF < CPU
|
|
|
30
30
|
@msz = msz
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def symbolic(
|
|
33
|
+
def symbolic(di=nil)
|
|
34
34
|
p = Expression[memtype]
|
|
35
35
|
p = Expression[p, :+, @base.symbolic] if base
|
|
36
36
|
p = Expression[p, :+, @offset] if offset
|
|
37
|
-
Indirection[p, @msz,
|
|
37
|
+
Indirection[p, @msz, (di.address if di)]
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
class
|
|
41
|
+
class Pktref < Memref
|
|
42
42
|
def memtype
|
|
43
43
|
:pkt
|
|
44
44
|
end
|
data/metasm/cpu/bpf/render.rb
CHANGED
|
@@ -13,7 +13,7 @@ class BPF
|
|
|
13
13
|
include Renderable
|
|
14
14
|
def render ; [@v.to_s] end
|
|
15
15
|
end
|
|
16
|
-
class
|
|
16
|
+
class Memref
|
|
17
17
|
include Renderable
|
|
18
18
|
def render
|
|
19
19
|
r = []
|
|
@@ -26,16 +26,5 @@ class BPF
|
|
|
26
26
|
r << ']'
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
|
-
|
|
30
|
-
def render_instruction(i)
|
|
31
|
-
r = []
|
|
32
|
-
r << i.opname
|
|
33
|
-
if not i.args.empty?
|
|
34
|
-
r << ' '
|
|
35
|
-
i.args.each { |a_| r << a_ << ', ' }
|
|
36
|
-
r.pop
|
|
37
|
-
end
|
|
38
|
-
r
|
|
39
|
-
end
|
|
40
29
|
end
|
|
41
30
|
end
|
data/metasm/cpu/cy16/decode.rb
CHANGED
|
@@ -107,12 +107,6 @@ class CY16
|
|
|
107
107
|
di
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
# hash opcode_name => lambda { |dasm, di, *symbolic_args| instr_binding }
|
|
111
|
-
def backtrace_binding
|
|
112
|
-
@backtrace_binding ||= init_backtrace_binding
|
|
113
|
-
end
|
|
114
|
-
def backtrace_binding=(b) @backtrace_binding = b end
|
|
115
|
-
|
|
116
110
|
# populate the @backtrace_binding hash with default values
|
|
117
111
|
def init_backtrace_binding
|
|
118
112
|
@backtrace_binding ||= {}
|
data/metasm/cpu/cy16/main.rb
CHANGED
|
@@ -21,7 +21,7 @@ class CY16 < CPU
|
|
|
21
21
|
@i = i
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def symbolic(
|
|
24
|
+
def symbolic(di=nil) ; to_s.to_sym ; end
|
|
25
25
|
|
|
26
26
|
def self.from_str(s)
|
|
27
27
|
raise "Bad name #{s.inspect}" if not x = @s_to_i[s]
|
|
@@ -39,11 +39,11 @@ class CY16 < CPU
|
|
|
39
39
|
@autoincr = autoincr
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def symbolic(
|
|
42
|
+
def symbolic(di=nil)
|
|
43
43
|
p = nil
|
|
44
44
|
p = Expression[p, :+, @base.symbolic] if base
|
|
45
45
|
p = Expression[p, :+, @offset] if offset
|
|
46
|
-
Indirection[p.reduce, @sz,
|
|
46
|
+
Indirection[p.reduce, @sz, (di.address if di)]
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
data/metasm/cpu/cy16/render.rb
CHANGED