[工具-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
[工具-004]如何从apk中提取AndroidManifest.xml并提取相应信息的更多相关文章
- 打开APK里的AndroidManifest.xml乱码
直接解压apk,打开AndroidManifest.xml显示乱码,因为这里面是二进制字符,和打开文件的编辑器无关.(也可以用ultraedit打开查看,有明文显示.只是看起来搜起来不是很方便而已) ...
- Android Studio中的AndroidManifest.xml文件分析
一.关于AndroidManifest.xml AndroidManifest.xml清单文件是每个Android程序中必须的文件,它是整个Android程序的全局描述文件,除了能声明程序中的Acti ...
- [翔哥高手无敌之路]0-002.如何提取apk中的信息?
面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息.但 ...
- Androidmanifest.xml在Android项目中的作用
以下是一个项目中的AndroidManifest.xml文件: <?xml version="1.0" encoding="utf-8"?> < ...
- Android动态部署五:怎样从插件apk中启动Service
转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...
- AndroidManifest.xml文件安全探索
本文作者:i春秋签约作家——icq8756c1a2 最近在做一些apk的安全检测,对AndroidManifest.xml文件进行了研究和探讨,介绍AndroidManifest.xml文件的作用和架 ...
- AndroidManifest.xml文件详解
本文为安全专家李洋的最新一篇专栏文章<AndroidManifest.xml文件详解>.AndroidManifest.xml是一个跟安全相关的配置文件,该配置文件是Android安全保障 ...
- androidmanifest.xml 反编译
androidmanifest.xml 反编译 去除更新只修改androidmanifest.xml内容 解压apk文件后得到这个文件androidmanifest.xml windwos安装java ...
- 浅谈AndroidManifest.xml与R.java及各个目录的作用
在开发Android项目中,AndroidManifest.xml与R.java是自动生成的.但是对于测试来说,非常重要.经过师父的点拨,我对AndroidManifest.xml与R.java有了更 ...
随机推荐
- 第K短路+严格第K短路
所谓K短路,就是从s到t的第K短的路,第1短就是最短路. 如何求第K短呢?有一种简单的方法是广度优先搜索,记录t出队列的次数,当t第k次出队列时,就是第k短路了.但点数过大时,入队列的节点过多,时间和 ...
- Java——理解面向对象
1.程序设计的三种基本结构 顺序结构 顺序结构表示程序中的各操作是按照它们在源代码中的排列顺序依次执行的 选择结构 选择结构表示程序的处理需要根据某个特定的条件选择其中的一个分支执行.选择结构有单选择 ...
- HTML data-* 属性的含义和使用
data-*自定义数据属性 首先讲一下语法格式: data-* =“值” data-* 属性包括两部分: 属性名不应该包含任何大写字母,并且在前缀 "data-" 之后必须有至 ...
- 网络流最小割 H - Internship I - Friendship
我觉得这两个最小割都还比较难. 第一个题目大意是给你一个网络,这个网络是由城市和中转站组成,终点是0,给你每一条边的流量, 问,从城市到终点最大流流完之后,是否可以增加一条路上的一条边的容量,使得最大 ...
- C:单链表的简单实现
前言 今天整理资料的时候翻出来的文件,发现是以前学习数据结构的时候写的代码,当初是看郝凯老师的视频学习的C语言的数据结构,下面是对于一个单链表的简单的实现. /** ***************** ...
- 动手实现--AC自动机
Trie树: 把若干个单词按前缀合并就得到一棵树,这棵树称为Trie树.Trie树是有根树,每条边表示一个字符,每个节点表示一个从根到当前节点的唯一路径上的字符依次连接得到的字符串.由于空串是任何串的 ...
- [hdu4763]next数组的应用
http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意:给一个字符串,判断是否可以写成ABACA,B.C表示长度大于等于0的字符串. 方法:ans = ...
- 第六次java上机作业
.编写一个简单程序,要求数组长度为5,静态赋值10,,,,,在控制台输出该数组的值. package mm; public class Test { public static void main(S ...
- 详解 Spark 中的 Bucketing
什么是 Bucketing Bucketing 就是利用 buckets(按列进行分桶)来决定数据分区(partition)的一种优化技术,它可以帮助在计算中避免数据交换(avoid data shu ...
- 聊聊ESP8266的SDK(ESP8266_RTOS_SDK v3.3 环境搭建)
ESP8266_RTOS_SDK发行版本v3.3-rc1环境搭建 在大学期间玩8266所接触的都无操作系统版本的SDK,但后来接触了ESP32后发现ESP8266也推出了RTOS版本,一直都没来得及去 ...