class Plugin
Public Class Methods
apply_batch(driver, method_to_target_to_contexts, modifier)
click to toggle source
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] ]
# 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)
click to toggle source
target_id_to_output -> { id: [status, output] } status = (success|failure)
# 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) #puts "modification #{original.inspect} = #{modification.inspect}" # Go home Ruby. You're drunk. # (gsub actually _modifies_ the replacement string) #modification.gsub!('\\') { '\\\\' } #method.body.gsub!(original) { modification } dumb_replace(method.body, original, modification) end made_changes = true method.modified = true end end made_changes end
dumb_replace(string, find, replace)
click to toggle source
# 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)
click to toggle source
# 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()
click to toggle source
# 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()
click to toggle source
# File lib/dex-oracle/plugin.rb, line 11 def self.plugins @plugins end
Public Instance Methods
optimizations()
click to toggle source
# File lib/dex-oracle/plugin.rb, line 35 def optimizations raise 'optimizations not implemented' end
process()
click to toggle source
# File lib/dex-oracle/plugin.rb, line 31 def process raise 'process not implemented' end