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