Class: Plugin
- Inherits:
-
Object
show all
- Defined in:
- lib/dex-oracle/plugin.rb
Defined Under Namespace
Modules: CommonRegex
Class Method Summary
collapse
-
.apply_batch(driver, method_to_target_to_contexts, modifier) ⇒ Object
method_to_target_to_context -> { method: [target_to_context] } target_to_context -> [ [target, context] ] target = Driver.make_target, has :id key context = [ [original, out_reg] ].
-
.apply_outputs(target_id_to_output, method_to_target_to_contexts, modifier) ⇒ Object
target_id_to_output -> { id: [status, output] } status = (success|failure).
-
.dumb_replace(string, find, replace) ⇒ Object
-
.init_plugins(driver, smali_files, methods) ⇒ Object
-
.plugin_classes ⇒ Object
-
.plugins ⇒ Object
Instance Method Summary
collapse
Class Method Details
.apply_batch(driver, method_to_target_to_contexts, modifier) ⇒ Object
method_to_target_to_context -> { method: [target_to_context] } target_to_context -> [ [target, context] ] target = Driver.make_target, has :id key context = [ [original, out_reg] ]
43
44
45
46
47
48
49
|
# File 'lib/dex-oracle/plugin.rb', line 43
def self.apply_batch(driver, method_to_target_to_contexts, modifier)
all_batches = method_to_target_to_contexts.values.collect(&:keys).flatten
return false if all_batches.empty?
target_id_to_output = driver.run_batch(all_batches)
apply_outputs(target_id_to_output, method_to_target_to_contexts, modifier)
end
|
.apply_outputs(target_id_to_output, method_to_target_to_contexts, modifier) ⇒ Object
target_id_to_output -> { id: [status, output] } status = (success|failure)
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
|
# File 'lib/dex-oracle/plugin.rb', line 53
def self.apply_outputs(target_id_to_output, method_to_target_to_contexts, modifier)
made_changes = false
method_to_target_to_contexts.each do |method, target_to_contexts|
target_to_contexts.each do |target, contexts|
status, output = target_id_to_output[target[:id]]
unless status == 'success'
logger.warn("Unsuccessful status: #{status} for #{output}")
next
end
contexts.each do |original, out_reg|
modification = modifier.call(original, output, out_reg)
dumb_replace(method.body, original, modification)
end
made_changes = true
method.modified = true
end
end
made_changes
end
|
.dumb_replace(string, find, replace) ⇒ Object
83
84
85
86
|
# File 'lib/dex-oracle/plugin.rb', line 83
def self.dumb_replace(string, find, replace)
string[find] = replace while string.include?(find)
string
end
|
.init_plugins(driver, smali_files, methods) ⇒ Object
27
28
29
|
# File 'lib/dex-oracle/plugin.rb', line 27
def self.init_plugins(driver, smali_files, methods)
@plugins = plugin_classes.collect { |p| p.new(driver, smali_files, methods) }
end
|
.plugin_classes ⇒ Object
15
16
17
18
19
20
21
22
23
24
25
|
# File 'lib/dex-oracle/plugin.rb', line 15
def self.plugin_classes
Dir["#{File.dirname(__FILE__)}/plugins/*.rb"].each { |f| require f }
classes = []
Object.constants.each do |klass|
const = Kernel.const_get(klass) unless klass == :TimeoutError
next unless const.respond_to?(:superclass) && const.superclass == Plugin
classes << const
end
classes
end
|
.plugins ⇒ Object
11
12
13
|
# File 'lib/dex-oracle/plugin.rb', line 11
def self.plugins
@plugins
end
|
Instance Method Details
#optimizations ⇒ Object
35
36
37
|
# File 'lib/dex-oracle/plugin.rb', line 35
def optimizations
raise 'optimizations not implemented'
end
|
#process ⇒ Object
31
32
33
|
# File 'lib/dex-oracle/plugin.rb', line 31
def process
raise 'process not implemented'
end
|