[工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息

  跟上一篇类似,我们也需要对APK的一些诸如umengkey,ADkey,TalkingData进行验证,那么我们同样需要解压apk文件,然后提取其中的AndroidManifest.xml。然后解析xml对内容进行分析对比。

  1.解压apk文件

if (Path.GetExtension(filePath).Equals(".apk"))
{
  // 获取应用名称
  String appName = Path.GetFileNameWithoutExtension(filePath);
   // 导出目录
   String outPath = "tempandroid\\" + appName;

   // 创建解压流
   ZipInputStream s = new ZipInputStream(File.OpenRead(filePath));
   String AndroidManifestName = "AndroidManifest.xml";
   ZipEntry theEntry;
   bool found = false;
   while ((theEntry = s.GetNextEntry()) != null)
   {
     Console.WriteLine(theEntry.Name);
      // 获取解压文件名
      string fileName = Path.GetFileName(theEntry.Name);
      // 遍历查找配置文件
      if (AndroidManifestName != null)
      {
        if (fileName.Equals(AndroidManifestName))
         {
           found = true;
            if (outPath.Length > 0)
            {
              Directory.CreateDirectory(outPath);
            }
            using (FileStream streamWriter = File.Create(outPath + "\\" + AndroidManifestName))
            {
              int size = 2048;
                byte[] data = new byte[2048];
                while (true)
                {
                   size = s.Read(data, 0, data.Length);
                    if (size > 0)
                    {
                      streamWriter.Write(data, 0, size);
                    }
                    else
                    {
                       break;
                    }
                 }
                 streamWriter.Flush();
                 streamWriter.Close();
                 // 执行解密操作,由于签名的xml必须解密,不然是二进制文件
                 String execString = "java -jar " + decodeXmljar + " " + outPath + "\\" + AndroidManifestName + " > " + outPath + "\\AndroidManifest2.xml";
                 runcommand(execString);
                 // 执行文件替换操作
                 Thread.Sleep(3000);
                 File.Delete(outPath + "\\" + AndroidManifestName);
                 File.Move(outPath + "\\AndroidManifest2.xml", outPath + "\\" + AndroidManifestName);
            }
            break;
         }
      }
  }
  s.Close();
  if (found == false)
  {
   logAppend(appName + "------- 无效", false, false);
   logAppend(Environment.NewLine, false, false);
  }
}

  2.解压出来的xml文件是二进制文件,必须要解密,用的是AXMLPrinter2.jar,具体实现如下

private String decodeXmljar = "AXMLPrinter2.jar";

// 执行解密操作
String execString = "java -jar " + decodeXmljar + " " + outPath + "\\" + AndroidManifestName + " > " + outPath + "\\AndroidManifest2.xml";
runcommand(execString);
//执行文件替换操作
Thread.Sleep(3000);
File.Delete(outPath + "\\" + AndroidManifestName);
File.Move(outPath + "\\AndroidManifest2.xml", outPath + "\\" + AndroidManifestName);

/**
 * 运行命令
 * */
private void runcommand(String command)
{
  Process p = new Process();
  p.StartInfo.FileName = "cmd.exe";
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.RedirectStandardInput = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.RedirectStandardError = true;
  p.StartInfo.CreateNoWindow = true;
  p.StartInfo.WorkingDirectory = Application.StartupPath;
  
  try
  {
    p.Start();
    Console.WriteLine("command:" + command + " &exit");
    p.StandardInput.WriteLine(command);
    p.StandardOutput.Close();
    p.Close();
  }
  catch (Exception e1)
  {
    Console.WriteLine("error" + e1.Message);
  }
}

  3.解密文件后,我们就可以使用xml读取去处理,这边我们引用的包是System.Xml,C#自带

XmlDocument doc = new XmlDocument();
// 加载Xml文件
doc.Load(pathInfo);
// 获取根节点
XmlElement rootElem = doc.DocumentElement;
// 获取person子节点集合 
XmlNodeList metadatanodes = rootElem.GetElementsByTagName("meta-data");
String appKey = rootElem.GetAttribute("package");
String mangguokey  = "";
String talkingData = "";
String umengKey    = "";
String qihuKey     = "";
foreach (XmlNode metadatanode in metadatanodes)
{
  if(metadatanode.NodeType == XmlNodeType.Element)
  {
    XmlElement nodeelement = (XmlElement)metadatanode;
    String name = nodeelement.GetAttribute("android:name");
    if("UMENG_APPKEY".Equals(name))
    {
      umengKey = nodeelement.GetAttribute("android:value");
    }
    else if("TD_APP_ID".Equals(name))
    {
      talkingData = nodeelement.GetAttribute("android:value");
    }
    else if("MANGO_ID".Equals(name))
    {
      mangguokey  = nodeelement.GetAttribute("android:value");
    }
    else if ("QH_360_ID".Equals(name))
    {
      qihuKey = nodeelement.GetAttribute("android:value");
    }
  }
}

  综合以上三步,我们可以很简单的提取到xml中的信息进行比对。

结语

  • 受益,学会了提取apk中的AndroidManifest.xml中的信息

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4528708.html

时间: 2024-10-13 15:58:56

[工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息的相关文章

打开APK里的AndroidManifest.xml乱码

直接解压apk,打开AndroidManifest.xml显示乱码,因为这里面是二进制字符,和打开文件的编辑器无关.(也可以用ultraedit打开查看,有明文显示.只是看起来搜起来不是很方便而已) 打开APK里的AndroidManifest.xml不乱码:方法一反编译apk:apktool d es.apk F:\tmp\es,反编译后任意编辑工具打开都不乱码 注:apktool可搜索下载,aapt在apktool的压缩包内 直接查看apk内的AndroidManifest.xml: aap

Android Studio中的AndroidManifest.xml文件分析

一.关于AndroidManifest.xml AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Activities,Content Providers,Services,和Intent Receivers,还能指定应用的名称.使用的图标.包含的组件以及permissions和instrumentation(安全控制和测试). 二.Hello World工程中的清单文件分析 <?xml version

[翔哥高手无敌之路]0-002.如何提取apk中的信息?

面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息.但是当解压apk之后却发现AndroidManifest.xml是一堆看不懂的数字,那该怎么才能获得信息呢?我们不妨做一个款工具来轻松达到目的. 所需条件 安装java环境 拥有AXMLPrinter2.jar文件 获取原理 将apk解压之后,打开cmd,输入java -jar 然后将AXMLPrin

Androidmanifest.xml在Android项目中的作用

以下是一个项目中的AndroidManifest.xml文件: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tw.suggest"                                //指定项目中的程序文件的包

Android动态部署五:如何从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:如何从插件apk中启动Activity(一) Android动态部署四:如何从插

Android动态部署五:怎样从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:怎样从插件apk中启动Activity(一) Android动态部署四:怎样从插

AndroidManifest.xml文件安全探索

secbang.comsimeon 最近在做一些apk的安全检测,对AndroidManifest.xml文件进行了研究和探讨,介绍AndroidManifest.xml文件的作用和架构,并研究了AndroidManifest.xml配置文件存在的一些漏洞,在进行安全检测时,可以对症下药. 0X00 AndroidManifest.xml文件作用 AndroidManifest.xml文件的作用非常重要,应该说是缺一不可.在android官方介绍文档中(https://developer.and

浅谈AndroidManifest.xml与R.java及各个目录的作用

原文:浅谈AndroidManifest.xml与R.java及各个目录的作用 在开发Android项目中,AndroidManifest.xml与R.java是自动生成的.但是对于测试来说,非常重要.经过师父的点拨,我对AndroidManifest.xml与R.java有了更深一层的理解. AndroidManifest.xml会自动生成引用包的属性配置,有权限的管理作用.引用的package必须声明了权限才能使用. R.java是对资源的索引,自动标识资源索引,相当于资源字典,里面包含项目

AndroidManifest.XML文件功能、元素、标签汇总

原文地址:http://developer.android.com/guide/topics/manifest/manifest-intro.html 每一个 Android 应用都有一个 AndroidManifest.xml 文件,用于告知 Android 系统应用程序运行需要的各种资源.作为Android开发的初学者,很多时候都是不经意间跟着教程使用Manifest文件,配置程序的各种功能.但是,对于Manifest文件本身的各个属性缺乏系统的了解.本文参照官方的API文档,将系统介绍An