예제 #1
0
 public void ReadManifestTest(string path)
 {
     using (Stream stream = File.OpenRead(path))
     {
         AndroidXmlReader reader = new AndroidXmlReader(stream);
         reader.MoveToContent();
         XDocument document = XDocument.Load(reader);
     }
 }
 public void ReadManifestTest()
 {
     using (Stream stream = File.OpenRead(@"ApiDemos.AndroidManifest.xml"))
     {
         AndroidXmlReader reader = new AndroidXmlReader(stream);
         reader.MoveToContent();
         XDocument document = XDocument.Load(reader);
     }
 }
        public async Task ReadManifestAsyncTest(string path)
        {
            using (Stream stream = File.OpenRead(path))
            {
                AndroidXmlReader reader = new AndroidXmlReader(stream);
                await reader.MoveToContentAsync();

                XDocument document = XDocument.Load(reader);
            }
        }
예제 #4
0
    public static APKInfo ParseAPK(string apkFilePath)
    {
        APKInfo info                = new APKInfo();
        ZipFile apkFile             = new ZipFile(apkFilePath);
        var     manifestEntry       = apkFile.GetEntry("AndroidManifest.xml");
        var     manifestInputStream = apkFile.GetInputStream(manifestEntry);
        var     bytes               = new byte[manifestEntry.Size];

        manifestInputStream.Read(bytes, 0, (int)manifestEntry.Size);
        var       ms     = new MemoryStream(bytes);
        var       reader = new AndroidXmlReader(ms);
        XDocument doc    = XDocument.Load(reader);

        // get packge info
        info.VersionCode = doc.Root.FindAttribute("versionCode").Value.ToString();
        info.VersionName = doc.Root.FindAttribute("versionName").Value.ToString();
        info.PackgeName  = doc.Root.FindAttribute("package").Value.ToString();

        var application = doc.Root.FindSingleElement("application");

        var activities = application.FindElements("activity");

        var launchActivity = activities.Single((activity) => {
            var intent_filter = activity.FindSingleElement("intent-filter");
            if (intent_filter == null)
            {
                return(false);
            }

            // 是否存在 <action p1:name="android.intent.action.MAIN"></action>

            bool hasActionMain = intent_filter.FindElements("action").Any((ele) => {
                string actionName = ele.FindAttribute("name").Value.ToString();
                return(actionName == "android.intent.action.MAIN");
            });

            // 是否存在 <category p1:name="android.intent.category.LAUNCHER"></category>
            bool hasLauncher = intent_filter.FindElements("category").Any((ele) => {
                string actionName = ele.FindAttribute("name").Value.ToString();
                return(actionName == "android.intent.category.LAUNCHER");
            });

            return(hasActionMain && hasLauncher);
        });

        info.LauncherActivity = launchActivity.FindAttribute("name").Value.ToString();

        return(info);
    }
예제 #5
0
        public async Task <UIElement> RenderXmlFile(StorageFile sf)
        {
            using (MemoryStream stream = new MemoryStream(await Disassembly.Util.ReadFile(sf)))
            {
                AndroidXmlReader reader = new AndroidXmlReader(stream);
                reader.MoveToContent();
                XDocument document = XDocument.Load(reader);
                //string p1nspace = "{http://schemas.android.com/apk/res/android}";

                foreach (XElement xe in document.Elements())
                {
                    //Should only be 1 element
                    return(await RenderObject(xe));
                }

                throw new Exception("Invalid XML File");
                //decoded = document.ToString();
            }
        }
예제 #6
0
        public static int GetAndroidSdkVersion(int?specificVersion, string binDir)
        {
            if (specificVersion.HasValue)
            {
                return(specificVersion.Value);
            }

            string tempDir = null;

            try
            {
                tempDir = ExpandApk(binDir);
                var manifest = Directory.EnumerateFiles(tempDir, "AndroidManifest.xml", SearchOption.AllDirectories).FirstOrDefault();
                if (string.IsNullOrEmpty(manifest))
                {
                    return(DefaultSdkLevel);
                }

                using var stream = File.OpenRead(manifest);
                using var reader = new AndroidXmlReader(stream);
                while (reader.Read())
                {
                    // <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
                    if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "uses-sdk")
                    {
                        if (reader.MoveToAttribute("targetSdkVersion", AndroidNamespace))
                        {
                            return(int.Parse(reader.Value));
                        }

                        throw new Exception("android:targetSdkVersion attribute not found...");
                    }
                }
            }
            finally
            {
                CleanupTempDir(tempDir);
            }

            return(DefaultSdkLevel);
        }
예제 #7
0
 public static void GetAPKInfo(string path, out string apk_id, out string activity)
 {
     apk_id   = "";
     activity = "";
     using (MemoryStream ms = new MemoryStream())
     {
         using (var file = System.IO.Compression.ZipFile.OpenRead(path))
         {
             var entry = file.GetEntry("AndroidManifest.xml");
             if (entry != null)
             {
                 using (var manifestStream = entry.Open())
                 {
                     manifestStream.CopyTo(ms);
                     ms.Seek(0, SeekOrigin.Begin);
                 }
             }
         }
         var reader = new AndroidXmlReader(ms);
         while (reader.Read())
         {
             if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "manifest")
             {
                 if (reader.MoveToAttribute("package"))
                 {
                     apk_id = reader.Value;
                 }
             }
             else if (reader.NodeType == System.Xml.XmlNodeType.Element && reader.Name == "activity")
             {
                 if (reader.MoveToAttribute("name", "http://schemas.android.com/apk/res/android"))
                 {
                     activity = reader.Value;
                 }
             }
         }
     }
 }
예제 #8
0
        public static string GetAppActivity(string binDir)
        {
            string tempDir = null;

            try
            {
                tempDir = ExpandApk(binDir);
                var manifest = Directory.EnumerateFiles(tempDir, "AndroidManifest.xml", SearchOption.AllDirectories).FirstOrDefault();
                using var stream = File.OpenRead(manifest);
                using var reader = new AndroidXmlReader(stream);
                var activities = new List <string>();
                while (reader.Read())
                {
                    /* <application android:label="TestApp.Android" android:theme="@style/MainTheme" android:name="android.app.Application" android:allowBackup="true" android:icon="@mipmap/icon" android:debuggable="true" android:extractNativeLibs="true">
                     *  <activity android:configChanges="orientation|smallestScreenSize|screenLayout|screenSize|uiMode" android:icon="@mipmap/icon" android:label="TestApp" android:theme="@style/MainTheme" android:name="crc64c7fff72bd74cd533.MainActivity">
                     *    <intent-filter>
                     *      <action android:name="android.intent.action.MAIN" />
                     *      <category android:name="android.intent.category.LAUNCHER" />
                     *    </intent-filter>
                     *  </activity> */

                    if (reader.NodeType == XmlNodeType.Element &&
                        reader.Name == "activity" &&
                        reader.MoveToAttribute("name", AndroidNamespace))
                    {
                        activities.Add(reader.Value);
                    }
                }

                // TODO: We may want to look at the intents
                return(activities.FirstOrDefault(x => x.EndsWith(".MainActivity")));
            }
            finally
            {
                CleanupTempDir(tempDir);
            }
        }
예제 #9
0
        public apkreader(string path)
        {
            var manifest = "AndroidManifest.xml";

            //读取apk,通过解压的方式读取
            using (var zip = ZipFile.Read(path))
            {
                using (Stream zipstream = zip[manifest].OpenReader())
                {
                    //将解压出来的文件保存到一个路径(必须这样)
                    using (var fileStream = File.Create(manifest, (int)zipstream.Length))
                    {
                        // Initialize the bytes array with the stream length and then fill it with data
                        byte[] bytesInStream = new byte[zipstream.Length];
                        zipstream.Read(bytesInStream, 0, bytesInStream.Length);
                        // Use write method to write to the file specified above
                        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
                    }
                }
            }

            //读取解压文件的字节数
            byte[] data = File.ReadAllBytes(manifest);
            if (data.Length == 0)
            {
                throw new IOException("Empty file");
            }

            #region 读取文件内容
            using (var stream = new MemoryStream(data))
            {
                var reader = new AndroidXmlReader(stream);

                while (reader.Read())
                {
                    switch (reader.NodeType)
                    {
                    case XmlNodeType.Element:
                    {
                        AndroidInfo info = new AndroidInfo();
                        androidInfos.Add(info);
                        info.Name     = reader.Name;
                        info.Settings = new List <AndroidSetting>();
                        for (int i = 0; i < reader.AttributeCount; i++)
                        {
                            reader.MoveToAttribute(i);

                            AndroidSetting setting = new AndroidSetting()
                            {
                                Name = reader.Name, Value = reader.Value
                            };
                            info.Settings.Add(setting);
                        }
                        reader.MoveToElement();
                        break;
                    }
                    }
                }
            }
            #endregion

            File.Delete(manifest);

            StringBuilder builder = new StringBuilder();
            foreach (var androidInfo in androidInfos)
            {
                builder.Append(string.Format("{0}:", androidInfo.Name));
                foreach (var setting in androidInfo.Settings)
                {
                    builder.Append("{");
                    builder.Append(string.Format("'{0}':'{1}'", setting.Name, setting.Value));
                    builder.Append("},");
                }
                builder.Append("\n\n");
            }
            Console.WriteLine(builder.ToString());
        }
예제 #10
0
        /// <summary>
        /// 获取主配置文件信息
        /// </summary>
        /// <param name="apkStream">apk流</param>
        /// <returns>安卓信息列表</returns>
        public static IList <AndroidInfo> GetManifestInfo(Stream apkStream)
        {
            if (apkStream == null)
            {
                throw new ArgumentNullException("apk流不能为null");
            }

            var androidInfos = new List <AndroidInfo>();

            byte[] manifestData = null;

            using (var zipfile = new ICSharpCode.SharpZipLib.Zip.ZipFile(apkStream))
            {
                foreach (ICSharpCode.SharpZipLib.Zip.ZipEntry item in zipfile)
                {
                    if (item.Name.ToLower() == "androidmanifest.xml")
                    {
                        using (Stream strm = zipfile.GetInputStream(item))
                        {
                            using (BinaryReader s = new BinaryReader(strm))
                            {
                                manifestData = s.ReadBytes((int)item.Size);
                            }
                        }

                        break;
                    }
                }

                zipfile.Close();
            }

            if (manifestData.IsNullOrLength0())
            {
                return(null);
            }

            #region 读取文件内容

            using (var stream = new MemoryStream(manifestData))
            {
                using (var reader = new AndroidXmlReader(stream))
                {
                    while (reader.Read())
                    {
                        switch (reader.NodeType)
                        {
                        case XmlNodeType.Element:
                            AndroidInfo info = new AndroidInfo();
                            androidInfos.Add(info);
                            info.Name     = reader.Name;
                            info.Settings = new List <KeyValueInfo <string, string> >();
                            for (int i = 0; i < reader.AttributeCount; i++)
                            {
                                reader.MoveToAttribute(i);

                                var setting = new KeyValueInfo <string, string>()
                                {
                                    Key = reader.Name, Value = reader.Value
                                };
                                info.Settings.Add(setting);
                            }
                            reader.MoveToElement();

                            break;
                        }
                    }

                    reader.Close();
                }
            }

            #endregion

            return(androidInfos);
        }
예제 #11
0
        public async Task Install()
        {
            StorageFile dexFile = await localAppRoot.GetFileAsync("classes.dex");

            byte[] dexBytes = await Disassembly.Util.ReadFile(dexFile);

            MemoryStream dexStream = new MemoryStream(dexBytes);

            dex = new Dex(dexStream);

            AstoriaR res = new AstoriaR(this);

            //StaticApkParser parser = new StaticApkParser(localAppRoot);
            //Find every binary .xml and convert it to human-readable xml so it can be parsed easily
            //crashes on Win10Mobile
            //foreach (StorageFile sf in await localAppRoot.GetFilesAsync(Windows.Storage.Search.CommonFileQuery.OrderByName))

            string[]           filePaths = Directory.GetFiles(localAppRoot.Path, "*.xml", SearchOption.AllDirectories);
            List <StorageFile> files     = await GetFilesFromPaths(filePaths);

            foreach (StorageFile sf in files)
            {
                if (sf.FileType.Equals(".xml"))
                {
                    //byte[] sfBytes = await Disassembly.Util.ReadFile(sf);
                    try //TODO: IF manifest, create mainfest.OLD
                    {
                        if (sf.Name.Equals("AndroidManifest.xml"))
                        {
                            //Create binary copy of old manifest with .old extension
                            await sf.CopyAsync(localAppRoot, "AndroidManifest.old", NameCollisionOption.ReplaceExisting);

                            //Continue decoding it.
                        }
                        //AXMLPrinter printer = new AXMLPrinter();
                        //printer.main(sf);
                        //APKManifest man = new APKManifest();
                        //string decoded = man.ReadManifestFileIntoXml(sfBytes);
                        //string decoded = await parser.transBinaryXml(sf);
                        string decoded;
                        //using (Stream stream = File.OpenRead(sf.Path))
                        using (MemoryStream stream = new MemoryStream(await Disassembly.Util.ReadFile(sf)))
                        {
                            AndroidXmlReader reader = new AndroidXmlReader(stream);
                            reader.MoveToContent();

                            XDocument document = XDocument.Load(reader);
                            decoded = document.ToString();

                            //hack for android xml
                            if (decoded.Contains("@layout/content_main"))
                            {
                                decoded.Replace("@layout/content_main", res.layout.get("content_main").ToString());
                            }
                        }


                        //Debug.WriteLine(decoded);
                        //string decoded = Disassembly.Manifest.ManifestDecompressor.DecompressAXML(sfBytes);
                        //Inflated XML *should* always be larger than the binary one, so we shouldn't have to clear the file first (could be a future bug though.)
                        await Windows.Storage.FileIO.WriteTextAsync(sf, decoded);

                        Debug.WriteLine($"Converted file: {sf.Name}");
                    }
                    catch
                    {
                        //Non-binary xml file found.
                        Debug.WriteLine("Exception: Non-binary xml file found.");
                    }
                }
            }

            //Remove copied APK to save on disk space
            await apkFile.DeleteAsync();
        }