module Codeobscure

Constants

VERSION

Public Class Methods

obscure() click to toggle source

waiting for add optionparse and add class obscure

# File lib/codeobscure.rb, line 21
def self.obscure 

  options = {}
  #默认是随机替换的方式
  options[:type] = "r"
  OptionParser.new do |opts|
    opts.banner = "Usage: obscure code for object-c project"

    opts.on("-o", "--obscure XcodeprojPath", "obscure code") do |v|
      options[:obscure] = v
    end

    opts.on("-l", "--load path1,path2,path3",Array,"load filt symbols from path") do |v|
      options[:load] = v 
    end

    opts.on("-r", "--reset", "reset loaded symbols") do |v|
      options[:reset] = true
    end

    opts.on("-f", "--fetch type1,type2,type3", "fetch and replace type,default type is [c,p,f,i]. c for class, p for property, f for function") do |v|
      options[:fetch] = v
    end

    opts.on("-i", "--ignore XcodeprojPath", "create a ignore file, you can write your filt symbols in it.eg:name,age ...") do |v|
      options[:ignore] = v 
    end

    opts.on("-t", "--type replaceType", "obscure type = [r,w,c] ,r: random w: random words c: custom replace rule") do |v|
      options[:type] = v 
    end

    opts.on("-s", "--strict", "strict mode. It will filter all string. If there are many kvo in code, please add -s.") do |v|
      options[:strict] = true
    end

  end.parse!

  if options[:reset] 
    `rm -f '#{root}/filtSymbols'`
    `cp '#{root}/filtSymbols_standard' '#{root}/filtSymbols'`
    puts "重置完毕!".colorize(:green)
  end

  if options[:ignore] 
    xpj_path = options[:ignore]
    if File.exist? xpj_path
      root_dir = xpj_path.split("/")[0...-1].join "/"
      ignore_path = "#{root_dir}/#{@@ignore_symbols_path}"
      if !File.exist? ignore_path
        `touch #{ignore_path}`
      end
    end
  end

  #only load, execute load only
  #only obscure, execute obscure only
  #load and obscure at same time,load firt,then obscure.That's mean you can get rid of some directoies.
  load_pathes = options[:load]
  if load_pathes 
    load_pathes.each do |load_path|
      if File.exist? load_path 
        FiltSymbols.loadFiltSymbols load_path 
        puts "加载完毕!".colorize(:green)
      else 
        puts "指定的目录不存在:#{load_path}".colorize(:red)
      end
    end
  end

  fetch_types = ["p","c","f"]
  if !options[:fetch].nil? && options[:fetch].length > 0
    fetch_types = options[:fetch] 
  end


  if options[:obscure]  

    xpj_path = options[:obscure]
    if File.exist? xpj_path
      root_dir = xpj_path.split("/")[0...-1].join "/"
      ImageMix.mix root_dir
      if options[:strict] 
        FiltSymbols.loadStrictMode root_dir
        puts "准备严格模式完成!".colorize(:green)
      end
      FuncList.genFuncList root_dir , "h", true, fetch_types
      header_file = Obscure.run root_dir , options[:type]
      project = Xcodeproj::Project.open xpj_path
      project_name = xpj_path.split("/").last
      main_group = project.main_group
      if !main_group.find_file_by_path("codeObfuscation.h")
        main_group.new_reference header_file 
      end
      project.targets.each do |target|
        if "#{target.name}.xcodeproj" == project_name  
          build_configs = target.build_configurations
          build_configs.each do |build_config| 
            build_settings = build_config.build_settings
            prefix_key = "GCC_PREFIX_HEADER"
            prefix_header = build_settings[prefix_key]
            if prefix_header.nil? || prefix_header.empty? 
              build_config.build_settings[prefix_key] = "./codeObfuscation.h"
            elsif prefix_header.include? "codeObfuscation.h"
              puts "#{target.name}:#{build_config}配置文件已配置完成".colorize(:green)
            else 
              puts "请在#{prefix_header}中#import \"codeObfuscation.h\"".colorize(:green)
            end
          end
        end
      end
      project.save
      #Fix bug for SIP
      system "chmod 755 '#{xpj_path}/project.pbxproj'"
      puts "配置完成!".colorize(:green)
      puts "请直接运行项目,如果项目中出现类似: `+[LoremIpsum PyTJvHwWNmeaaVzp:]: unrecognized selector sent to class`。在codeObfuscation.h中查询PyTJvHwWNmeaaVzp并删除它!".colorize(:yellow)
    else 
      puts "指定的目录不存在:#{path}".colorize(:red)
    end 

  end

end
root() click to toggle source
# File lib/codeobscure.rb, line 16
def self.root
  File.dirname __dir__
end