public MethodDisassembly(MethodDefinition methodDef, MapFileLookup mapFile = null, TypeEntry typeEntry = null, MethodEntry methodEntry = null) { _typeEntry = typeEntry; _methodEntry = methodEntry; _methodDef = methodDef; _mapFile = mapFile; JumpTargetOffsets = new HashSet <int>(); ExceptionHandlerOffsets = new HashSet <int>(); if (methodDef.Body != null) { foreach (var i in methodDef.Body.Instructions) { var op = i.Operand as Instruction; if (op != null) { JumpTargetOffsets.Add(op.Offset); } } foreach (var e in methodDef.Body.Exceptions) { foreach (var c in e.Catches) { ExceptionHandlerOffsets.Add(c.Instruction.Offset); } if (e.CatchAll != null) { ExceptionHandlerOffsets.Add(e.CatchAll.Offset); } } } Format = FormatOptions.Default; }
public DalvikDisassemblyProvider(DalvikProcess process, string apkPath, MapFileLookup mapFile) { _process = process; _apkPath = apkPath; _mapFile = mapFile; _dex = new Lazy <DexLookup>(LoadDex); }
private SourceFile(IApkFile apk, JarFile jar, ISpySettings settings, MapFileLookup mapFile, string singleFilePath = null) { this.apk = apk; this.jar = jar; this.settings = settings; this.mapFile = mapFile; this.singleFilePath = singleFilePath; #if DEBUG || ENABLE_SHOW_AST classLoader = new AssemblyClassLoader(module.OnClassLoaded); var modParams = new ModuleParameters { AssemblyResolver = new AssemblyResolver(new[] { Frameworks.Instance.FirstOrDefault().Folder }, classLoader, module.OnAssemblyLoaded), Kind = ModuleKind.Dll }; assembly = AssemblyDefinition.CreateAssembly(new AssemblyNameDefinition("spy", Version.Parse("1.0.0.0")), "main", modParams); classLoader.LoadAssembly(assembly); // TODO: what did this code do? //var dot42Assembly = modParams.AssemblyResolver.Resolve("dot42"); // Force loading of classes if (jar != null) { foreach (var fileName in jar.ClassFileNames) { OpenClass(fileName); } } #endif }
private void Initialize(string dexFilename, string mapfile, Func <AssemblyDefinition, string> filenameFromAssembly) { try { var readDex = Task.Factory.StartNew(() => DexLib.Dex.Read(dexFilename)); var readMap = Task.Factory.StartNew(() => new MapFileLookup(new MapFile(mapfile))); Task.WaitAll(readMap, readDex); var dex = readDex.Result; var map = readMap.Result; _modifiedDetector = new AssemblyModifiedDetector(filenameFromAssembly, map); foreach (var type in map.TypeEntries) { if (type.ScopeId == null) { continue; } var typeScopeId = GetTypeScopeId(type); // redirect the generated class if neccessary. var dexType = type.Id == 0 ? map.GeneratedType : type; foreach (var method in type.Methods) { if (type.ScopeId == null) { continue; } var scopeKey = Tuple.Create(typeScopeId, method.ScopeId); _methodsByScopeId[scopeKey] = Tuple.Create(dexType, method); } } _dexLookup = new DexLookup(dex); _dex = dex; _map = map; } catch (Exception ex) { IsEnabled = false; DLog.Warning(DContext.CompilerCodeGenerator, "Unable to initialize compiler cache: {0}", ex.Message); } }
public MethodBodyDisassemblyFormatter(MethodDefinition methodDef, MapFileLookup mapFile) { _methodDef = methodDef; _mapFile = mapFile; TypeEntry typeEntry = null; MethodEntry methodEntry = null; if (mapFile != null) { typeEntry = mapFile.GetTypeByNewName(methodDef.Owner.Fullname); if (typeEntry != null) { methodEntry = typeEntry.FindDexMethod(methodDef.Name, methodDef.Prototype.ToSignature()); } } _dissassembly = new MethodDisassembly(methodDef, mapFile, typeEntry, methodEntry); _sourceDocument = new Lazy <string[]>(() => { if (_dissassembly.MethodEntry == null) { return(null); } var pos = _mapFile.GetSourceCodePositions(_dissassembly.MethodEntry).FirstOrDefault(); if (pos == null) { return(null); } try { return(File.ReadAllLines(pos.Document.Path)); } catch (Exception) { return(null); } }); }
public AssemblyModifiedDetector(Func <AssemblyDefinition, string> filenameFromAssembly, MapFileLookup map) { _filenameFromAssembly = filenameFromAssembly; _map = map; }