-
Notifications
You must be signed in to change notification settings - Fork 3
/
parse_config_file.rb
149 lines (119 loc) · 4.35 KB
/
parse_config_file.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
class Nerve
def parse_exec_proc(file)
return if file.nil?
fd = File.open(file)
proc_control = %w[ target args env ]
lines = fd.readlines
lines.map { |x| x.chomp }
exec_proc.args = Array.new
exec_proc.env = Hash.new
lines.each do |tl|
if tl[0].chr == ';' or tl.nil? then next end
k,v,l = tl.split(':')
if k.match(/target/)
## Dirty little hack if a : is used
## in the target path (C:\Windows...)
if !l.nil?
v = "#{v}:#{l}"
end
v.gsub!(/[\n]+/, "")
v.gsub!(/[\s]+/, "")
exec_proc.target = v
end
if k.match(/args/)
v.gsub!(/[\n]+/, "")
exec_proc.args = v
end
if k.match(/env/)
v.gsub!(/[\n]+/, "")
k,v = v.split(/=/)
k.gsub!(/[\s]+/, "")
exec_proc.env.store(k,v)
end
end
end
def parse_config_file(file)
return if file.nil?
fd = File.open(file)
## All the handlers a user can script
## There is no specific order to this
hdlrs = %w[ on_access_violation on_alignment on_attach on_bounds on_breakpoint on_continue
on_create_process on_create_thread on_detach on_divide_by_zero on_exit on_exit_process
on_exit_thread on_fork_child on_illegalinst on_int_overflow on_invalid_disposition
on_invalid_handle on_load_dll on_output_debug_string on_priv_instruction on_rip on_segv
on_signal on_sigstop on_sigchild on_sigterm on_sigtrap on_single_step on_stack_overflow
on_stop on_unload_dll on_iot_trap on_guard_page ]
lines = fd.readlines
lines.map { |x| x.chomp }
lines.each do |tl|
if tl[0].chr == ';' or tl.nil? then next end
hdlrs.each do |l|
if tl.match(/#{l}/)
i,p = tl.split("=")
i.gsub!(/[\s\n]+/, "")
p.gsub!(/[\s\n]+/, "")
p = File.read(p)
event_handlers.store(i,p)
next
end
end
bp = OpenStruct.new
bp.base = 0
bp.flag = true
bp.hits = 0
bp.hook = false
bp.bpc = nil
bp.nargs = 0
r = tl.split(",")
if r.size < 2 then next end
r.each do |e|
if e.match(/bp=/)
addr = e.split("bp=").last
bp.addr = addr.gsub(/[\s\n]+/, "")
end
if e.match(/name=/)
name = e.split("name=").last
bp.name = name.gsub(/[\s\n]+/, "")
end
## Win32 only until ragweed supports it
if e.match(/hook=/)
hook = e.split("hook=").last
bp.hook = true if hook.gsub(/[\s\n]+/, "") =~ /true/
end
if e.match(/bpc=/)
bpc = e.split("bpc=").last
bp.bpc = bpc.to_i
end
if e.match(/nargs=/)
nargs = e.split("nargs=").last
bp.nargs = nargs.to_i
end
if e.match(/code=/)
code = e.split("code=").last
c = code.gsub(/[\s\n]+/, "")
r = File.read(c)
bp.code = r
end
if e.match(/lib=/)
lib = e.split("lib=").last
bp.lib = lib.gsub(/[\s\n]+/, "")
## TODO - addr must already be parsed
## for this to work correctly
if RUBY_PLATFORM =~ LINUX_OS
so.each_pair do |k,v|
if v =~ /#{bp.lib}/
bp.base = k
end
end
end
end
end
if bp.base != 0
bp.addr = bp.base.to_i(16)+bp.addr.to_i(16)
bp.addr = sprintf("0x0%x", bp.addr)
end
bp.hits = 0
breakpoints.push(bp)
end
end
end