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);
 }
Example #3
0
        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);
            }
        }
Example #5
0
        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);
                }
            });
        }
Example #6
0
 public AssemblyModifiedDetector(Func <AssemblyDefinition, string> filenameFromAssembly, MapFileLookup map)
 {
     _filenameFromAssembly = filenameFromAssembly;
     _map = map;
 }