Example #1
0
        public void Disassemble(ApkProcessor apkProcessor)
        {
            var process = Process.Start(new ProcessStartInfo()
            {
                FileName  = "java",
                Arguments = string.Join(" ", new string[] {
                    "-jar",
                    BaksmaliPath,
                    "d",
                    apkProcessor.ApkPath,
                    "--output",
                    Path.Combine(apkProcessor.ApkPath, "smali")
                })
            });

            process.WaitForExit();
            ConsoleWrapper.WriteInfo("DEX", true, $"disassembled from APK {apkProcessor.ApkPath}");
        }
Example #2
0
        static void Main(string[] args)
        {
            new ZipProcessor("miui_MIMIX2S_V12.0.3.0.QDGCNXM_cd55623678_10.0.zip", Settings.ChinaSourceDirectory).Extract();
            new ZipProcessor("xiaomi.eu_multi_MIMix2S_V12.0.3.0.QDGCNXM_v12-10.zip", Settings.GlobalSourceDirectory).Extract();

            ImageProcessor systemImage = new ImageProcessor(Path.Combine("c", Settings.SystemImageName), Settings.WorkingDirectory);

            Settings.Api  = systemImage.GetApi();
            Settings.Arch = systemImage.GetArch();

            Dictionary <string, string> packageToPath = new Dictionary <string, string>();

            ConfigurationExtractCollection extracts = new ConfigurationExtractCollection(Path.Combine("Configuration", "extract.txt"));

            foreach (var extract in extracts)
            {
                new ImageProcessor(Path.Combine(extract.Source, extract.Image), Settings.WorkingDirectory).Extract(extract.Path);
                packageToPath.Add(extract.Path.Split('\\').Last(), extract.Path);
            }

            ConfigurationActionsCollection actions = new ConfigurationActionsCollection(Path.Combine("Configuration", "actions.txt"));

            foreach (var packageName in actions.GetPackages())
            {
                ApkProcessor apkProcessor = new ApkProcessor(Directory.GetFiles(Path.Combine(Settings.WorkingDirectory, packageToPath[packageName]), "*.apk").First());
                apkProcessor.Disassemble();

                try
                {
                    foreach (var action in actions.GetByPackageName(packageName))
                    {
                        if (action.Action == "MoveArch")
                        {
                            apkProcessor.MoveArch(action.Parameter.Split('>')[0], action.Parameter.Split('>')[1]);
                            continue;
                        }

                        else if (action.Action == "Decompile")
                        {
                            apkProcessor.Disassemble();
                        }

                        else if (action.Path.EndsWith(".smali"))
                        {
                            bool _ = action.Action switch
                            {
                                "PatchMethod" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).PatchMethod(action.Parameter),
                                "RemoveLine" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).RemoveLine(action.Parameter),
                                "UpdateGlobalFlag" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).UpdateGlobalFlag(),
                                "UpdateInternationalFlag" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).UpdateInternationFlag(),
                                "UpdateDeviceMod" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).UpdateDeviceMod(),
                                "UpdateDeviceRegion" => apkProcessor.CreateSmaliProcessor(action.Path, action.Parameter).UpdateDeviceRegion(),
                                _ => throw new ArgumentException($"Unrecognized action {action.Action}")
                            };
                        }

                        else
                        {
                            IEnumerable <bool> _ = action.Action switch
                            {
                                "PatchMethod" => throw new ArgumentException($"Unable to patch method for directory {action.Path}"),
                                      "RemoveLine" => throw new ArgumentException($"Unable to remove line for directory {action.Path}"),
                                            "UpdateGlobalFlag" => apkProcessor.CreateSmaliProcessors(action.Path, action.Parameter).Select(x => x.UpdateGlobalFlag(true)).ToArray(),
                                            "UpdateInternationalFlag" => apkProcessor.CreateSmaliProcessors(action.Path, action.Parameter).Select(x => x.UpdateInternationFlag(true)).ToArray(),
                                            "UpdateDeviceMod" => apkProcessor.CreateSmaliProcessors(action.Path, action.Parameter).Select(x => x.UpdateDeviceMod(true)).ToArray(),
                                            "UpdateDeviceRegion" => apkProcessor.CreateSmaliProcessors(action.Path, action.Parameter).Select(x => x.UpdateDeviceRegion(true)).ToArray(),
                                            _ => throw new ArgumentException($"Unrecognized action {action.Action}")
                            };
                        }
                    }
                }
                catch (ArgumentException ex)
                {
                    ConsoleWrapper.WriteError("GENERAL", ex.Message);
                }

                apkProcessor.Assemble(Settings.Api);
                // apkProcessor.ExtractLib();
                apkProcessor.AddDexClasses();

                if (Settings.Cleanup)
                {
                    foreach (var tempSmaliDirectory in Directory.GetDirectories(apkProcessor.ApkContentPath, "*_smali"))
                    {
                        Directory.Delete(tempSmaliDirectory, true);
                    }

                    foreach (var tempDexFile in Directory.GetFiles(apkProcessor.ApkContentPath, "*_x.dex"))
                    {
                        File.Move(tempDexFile, tempDexFile.Replace("_x.dex", ".dex"), true);
                    }
                }
            }
        }