module FuncList

Public Class Methods

capture(content_str,type = "m",fetch_types=["p","f","c"],file_path=nil,is_need_filt=false) click to toggle source
# File lib/codeobscure/funclist.rb, line 35
def self.capture(content_str,type = "m",fetch_types=["p","f","c"],file_path=nil,is_need_filt=false) 
  str = to_utf8 content_str

  #filter file
  if file_path.include?(".storyboard") || file_path.include?(".xib")  
    str.scan @@storyboard_filt_regex do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      captures.each do |capture|
        FiltSymbols.insertValue capture
        p "过滤的#{File.basename(file_path)}数据:#{capture}"
      end
    end
    return []
  end

  # begin capture
  results = []
  if fetch_types.include? "f"
    str.scan @@func_regex do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      if validate? whole_match , 'f' 
        captures.each do |capture|
          results << "f:#{capture}"
          #p [whole_match, capture]
          p "f:[#{capture}]"
        end
      end
    end
    #no arguments function
    str.scan @@func_simple_regex do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      if validate? whole_match , 'f' 
        captures.each do |capture|
          results << "f:#{capture}"
          #p [whole_match, capture]
          p "f:[#{capture}]"
        end
      end
    end
  end
  cls_regexs = ""
  if type == "all"
    cls_regexs = [@@hcls_regex,@@mcls_regex]
  elsif type == "h" 
    cls_regexs = [@@hcls_regex]
  else
    cls_regexs = [@@mcls_regex]
  end
  cls_regexs.each do |cls_regex|
    if fetch_types.include? "c"
      str.scan cls_regex do |curr_match|
        md = Regexp.last_match
        whole_match = md[0]
        captures = md.captures

        captures.each do |capture|
          if is_need_filt 
            if @@cls_filt_keys.include? capture 
              puts "过滤类#{capture}..."
              if file_path 
                FiltSymbols.loadFiltSymbols file_path
              end
            end 
          end
          results << "c:#{capture}"
          #p [whole_match, capture]
          p "c:[#{capture}]"
        end
      end
    end
  end
  if fetch_types.include? "p"
    str.scan @@property_regex do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      captures.each do |capture|
        results << "p:#{capture}"
        #p [whole_match, capture]
        p "p:[#{capture}]"
      end
    end
    str.scan @@property_regex2 do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      captures.each do |capture|
        results << "p:#{capture}"
        #p [whole_match, capture]
        p "p:[#{capture}]"
      end
    end
    str.scan @@property_regex3 do |curr_match|
      md = Regexp.last_match
      whole_match = md[0]
      captures = md.captures

      captures.each do |capture|
        results << "p:#{capture}"
        #p [whole_match, capture]
        p "p:[#{capture}]"
      end
    end
  end
  #---------------记录可能引起崩溃的字段----------------
  str.scan @@value_for_key_filte_regex do |curr_match|
    md = Regexp.last_match
    whole_match = md[0]
    captures = md.captures

    captures.each do |capture|
      FiltSymbols.insertValue capture
      p "过滤的[setValue forkey]数据:#{capture}"
    end
  end

  str.scan @@class_from_str_regex do |curr_match|
    md = Regexp.last_match
    whole_match = md[0]
    captures = md.captures

    captures.each do |capture|
      FiltSymbols.insertValue capture
      p "过滤的[NSClassFromString]数据:#{capture}"
    end
  end
  results
end
genFuncList(path,type = "m",need_filt=true,fetch_types=["p","f","c"]) click to toggle source
# File lib/codeobscure/funclist.rb, line 175
def self.genFuncList(path,type = "m",need_filt=true,fetch_types=["p","f","c"])
  capture_methods = []
  p_methods = []
  funclist_path = "#{path}/func.list"  
  if File.file?(path) 
    funclist_path = "#{File.dirname(path)}/func.list"
  end
  file = File.open(funclist_path, "w")
  file_pathes = []
  if type == "h" || type == "m"
    file_pathes = `find '#{path}' -name "*.#{type}" -d`.split "\n"
  elsif type == "all"
    file_pathes += `find '#{path}' -name "*.h" -d`.split "\n"
    file_pathes += `find '#{path}' -name "*.m" -d`.split "\n"
  end
  file_pathes += `find '#{path}' -name "*.storyboard" -d`.split "\n"
  file_pathes += `find '#{path}' -name "*.xib" -d`.split "\n"

  file_pathes.each do |file_path|
    content = File.read file_path
    captures = capture content , type , fetch_types, file_path, need_filt
    captures.each do |capture_method| 
      method_type = capture_method.split(":").first
      method_content = capture_method.split(":").last
      if !(method_content.start_with?("init") || method_content.start_with?("set") || method_content.start_with?("_") || method_content.length < 4) || !need_filt
        if method_type == "c" || method_type == "f"
          if !capture_methods.include? capture_method 
            capture_methods << capture_method 
          end
        elsif method_type == "p"
          if !p_methods.include? capture_method 
            p_methods << capture_method 
          end
        end
      end
    end
  end
  
  p_methods.each do |capture_method|
    method_type = capture_method.split(":").first
    method_content = capture_method.split(":").last
    c_method = "c:#{method_content}"
    f_method = "f:#{method_content}"
    if capture_methods.include? c_method
      capture_methods.delete c_method
    end
    if capture_methods.include? f_method
      capture_methods.delete f_method
    end
  end

  capture_methods += p_methods

  if capture_methods.length > 0 
    file.write(capture_methods.join "\n") 
  end
  file.close
  funclist_path
end
loadStrictSymbols(content_str) click to toggle source
# File lib/codeobscure/funclist.rb, line 236
def self.loadStrictSymbols(content_str) 
  str = to_utf8 content_str
  str.scan @@strict_filt_regex do |curr_match|
    md = Regexp.last_match
    whole_match = md[0]
    captures = md.captures

    captures.each do |capture|
      FiltSymbols.insertValue capture
      p "执行严格模式过滤:#{capture}"
    end
  end
end
to_utf8(str) click to toggle source
# File lib/codeobscure/funclist.rb, line 29
def self.to_utf8(str)
  str = str.force_encoding('UTF-8')
  return str if str.valid_encoding?
  str.encode("UTF-8", 'binary', invalid: :replace, undef: :replace, replace: '')
end
validate?(str, type) click to toggle source
# File lib/codeobscure/funclist.rb, line 22
def self.validate?(str, type) 
  for filt_key  in @@func_filt_keys
     return false if str.include? filt_key 
  end
  return true
end