Class: Plugin

Inherits:
Object
  • Object
show all
Defined in:
lib/dex-oracle/plugin.rb

Defined Under Namespace

Modules: CommonRegex

Class Method Summary collapse

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)
        #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) ⇒ 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_classesObject



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

.pluginsObject



11
12
13
# File 'lib/dex-oracle/plugin.rb', line 11

def self.plugins
  @plugins
end

Instance Method Details

#optimizationsObject



35
36
37
# File 'lib/dex-oracle/plugin.rb', line 35

def optimizations
  raise 'optimizations not implemented'
end

#processObject



31
32
33
# File 'lib/dex-oracle/plugin.rb', line 31

def process
  raise 'process not implemented'
end