def getAccessSmaliSet(self): """ check smalilist to build access num to name map """ for s in self.smaliList: sName = Smali.getSmaliName(s) aSmali = AccessSmali(sName) mode = 0 method = "" for line in open(os.path.join(self.path, s), 'r'): if (mode == 0): match = patternMethodBegin.match(line) if(match): method = Method(match.group("accessnum"), match.group("parameterlist"), match.group("returntype")) mode = 1 elif (mode == 1): match = patternMethodEnd.match(line) if(match): method.endMethod() mode = 0 aSmali.addMethod(method.accessNum, method.accessName) else: match = patternMethodAnnotation.match(line) if(match): continue match = patternMethodCall.match(line) if(match): method.addCallLine(match.group("operation"), match.group("operationobject"), match.group(0)) else: method.addMethodLine(line) if (aSmali.getMethodNumSetLen() > 0): aSmali.createNumMap() self.accessSmaliSet[sName] = aSmali
def doNumToName(self): allMethodCallNumMap = {} for sName in self.accessSmaliSet.keys(): callNumMap = self.accessSmaliSet[sName].methodCallNumMap for callNum in callNumMap.keys(): if callNum not in allMethodCallNumMap.keys(): allMethodCallNumMap[callNum] = callNumMap[callNum] else: raise ValueError("method call num map duplicate") for s in self.smaliList: sFile = File(os.path.join(self.path, s)) sName = Smali.getSmaliName(s) if sName in self.accessSmaliSet.keys(): sFile.replaces(self.accessSmaliSet[sName].methodDefNumMap) sFile.replaces(allMethodCallNumMap)
def doNameToNum(self): allMethodCallNameMap = {} for aSmali in self.accessSmaliSet.keys(): self.accessSmaliSet[aSmali].createNameMap() callNameMap = self.accessSmaliSet[aSmali].methodCallNameMap for callName in callNameMap.keys(): if callName not in allMethodCallNameMap.keys(): allMethodCallNameMap[callName] = callNameMap[callName] else: raise ValueError("method call name map duplicate") for s in self.smaliList: sFile = File(os.path.join(self.path, s)) sName = Smali.getSmaliName(s) if sName in self.accessSmaliSet.keys(): sFile.replaces(self.accessSmaliSet[sName].methodDefNameMap) sFile.replaces(allMethodCallNameMap)