跟上一篇类似,我们也需要对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

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

  1. 打开APK里的AndroidManifest.xml乱码

    直接解压apk,打开AndroidManifest.xml显示乱码,因为这里面是二进制字符,和打开文件的编辑器无关.(也可以用ultraedit打开查看,有明文显示.只是看起来搜起来不是很方便而已) ...

  2. Android Studio中的AndroidManifest.xml文件分析

    一.关于AndroidManifest.xml AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Acti ...

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

    面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息.但 ...

  4. Androidmanifest.xml在Android项目中的作用

    以下是一个项目中的AndroidManifest.xml文件: <?xml version="1.0" encoding="utf-8"?> < ...

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

    转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...

  6. AndroidManifest.xml文件安全探索

    本文作者:i春秋签约作家——icq8756c1a2 最近在做一些apk的安全检测,对AndroidManifest.xml文件进行了研究和探讨,介绍AndroidManifest.xml文件的作用和架 ...

  7. AndroidManifest.xml文件详解

    本文为安全专家李洋的最新一篇专栏文章<AndroidManifest.xml文件详解>.AndroidManifest.xml是一个跟安全相关的配置文件,该配置文件是Android安全保障 ...

  8. androidmanifest.xml 反编译

    androidmanifest.xml 反编译 去除更新只修改androidmanifest.xml内容 解压apk文件后得到这个文件androidmanifest.xml windwos安装java ...

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

    在开发Android项目中,AndroidManifest.xml与R.java是自动生成的.但是对于测试来说,非常重要.经过师父的点拨,我对AndroidManifest.xml与R.java有了更 ...

随机推荐

  1. UVA-2【NOI2014】起床困难综合症

    #2. [NOI2014]起床困难综合症 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过 ...

  2. [bzoj5329] P4606 [SDOI2018]战略游戏

    P4606 [SDOI2018]战略游戏:广义圆方树 其实会了圆方树就不难,达不到黑,最多算个紫 那个转换到圆方树上以后的处理方法,画画图就能看出来,所以做图论题一定要多画图,并把图画清楚点啊!! 但 ...

  3. Jenkins 部署(基于 Linux)

    1.安装 JDK  我不列出来了,自行百度 java -version 2.安装 tomcat (1)创建目录 tomcat8 (2)导入 tomcat 文件到 tomcat8 录中并解压 (3)启动 ...

  4. Keepalived搭建LVS高可用性集群系统

    ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover ...

  5. python的unittest框架中的assert断言

    unittest框架自带断言,如果想用assert断言,一定要引入unittest.TestCase框架才行,不然不会自动识别assert断言

  6. 如何找到Hive提交的SQL相对应的Yarn程序的applicationId

    最近的工作是利用Hive做数据仓库的ETL转换,大致方式是将ETL转换逻辑写在一个hsql文件中,脚本当中都是简单的SQL语句,不包含判断.循环等存储过程中才有的写法,仅仅支持一些简单的变量替换,比如 ...

  7. React Native超简单完整示例-tabs、页面导航、热更新、用户行为分析

    初学React Native,如果没有人指引,会发现好多东西无从下手,但当有人指引后,会发现其实很简单.这也是本人写这篇博客的主要原因,希望能帮到初学者. 本文不会介绍如何搭建开发环境,如果你还没有搭 ...

  8. python学习之循环语句的使用

    循环语句主要有while和for循环两大类,接下来先看下while循环 1.while循环(python里没有do while循环语句) while 条件: 代码块 执行程序 2.for循环(可以取二 ...

  9. .net core grpc单元测试 - 服务器端

    前言 gRPC凭借其严谨的接口定义.高效的传输效率.多样的调用方式等优点,在微服务开发方面占据了一席之地.dotnet core正式支持gRPC也有一段时间了,官方文档也对如何使用gRPC进行了比较详 ...

  10. 使用Optional,不再头疼NPE

    前言 在 Java 语言开发中,可能大多数程序员遇到最多的异常就是 NullPointException 空指针异常了.这个当初语言的开发者"仅仅因为这样实现起来更容易"而允许空引 ...