apk文件解析,学习笔记
Android 应用程序包文件 (APK) 是一种Android操作系统上的应用程序安装文件格式,其英文全称为 “application package file” 。
如果懂得使用反编译工具,可以下载apk解析工具,获得反编译代码。
需要下载:SharpZipLib.zip http://www.icsharpcode.net/opensource/sharpziplib/download.aspx
主要方法如下
using ICSharpCode.SharpZipLib.Zip;
public static Dictionary<object, object> getPackageInfo(string path){
Dictionary<object, object> returnMap = new Dictionary<object, object>();
returnMap.Add("版本编号(VersionCode)", "");
returnMap.Add("版本名称(VersionName)", "");
returnMap.Add("包名(Package)", "");
returnMap.Add("签名(Sig)", "");
returnMap.Add("启动activity", "");
returnMap["证书有效期"] = "";
returnMap["证书过期时间"] = "";
returnMap["证书Hash"] = "";
returnMap["证书MD5"] = "";
returnMap["PublicKey"] = "";
List<string> list = new List<string> { ".DSA", ".RSA" };
if (string.IsNullOrWhiteSpace(path))
{
throw new Exception("文件路径不正确:" + path);
}
string str = "";
if (path.LastIndexOf(".") >= 0)
{
str = path.Substring(path.LastIndexOf("."));
}
if (".apk".Equals(str, StringComparison.OrdinalIgnoreCase))
{
try
{
ZipInputStream zip = new ZipInputStream(File.OpenRead(path));
ZipEntry zipEntry = null;
while ((zipEntry = zip.GetNextEntry()) != null)
{
string fileName = Path.GetFileName(zipEntry.Name);
if ((fileName != null) && (fileName.LastIndexOf(".") >= 0))
{
string item = fileName.Substring(fileName.LastIndexOf("."));
if ("AndroidManifest.xml".Equals(fileName, StringComparison.OrdinalIgnoreCase))
{
getPackageDetails(zip, zipEntry, returnMap);
}
else if (list.Contains(item))
{
getSig(zip, zipEntry, returnMap);
}
}
}
zip.Close();
}
catch (Exception exception)
{
throw new Exception("解析apk包错误:" + exception.Message);
}
}
return returnMap;
}
private static void getSig(ZipInputStream zip, ZipEntry zipEntry, Dictionary<object, object> returnMap)
{
MemoryStream stream = new MemoryStream();
byte[] rawCertData = new byte[0x400];
int count = 0;
while ((count = zip.Read(rawCertData, 0, 0x400)) > 0)
{
stream.Write(rawCertData, 0, count);
}
stream.Seek(0L, SeekOrigin.Begin);
string str = "";
X509Certificate certificate = new X509Certificate(stream.GetBuffer());
returnMap["证书有效期"] = certificate.GetEffectiveDateString();
returnMap["证书过期时间"] = certificate.GetExpirationDateString();
returnMap["证书Hash"] = certificate.GetCertHashString();
returnMap["证书MD5"] = BitConverter.ToString(MD5.Create().ComputeHash(certificate.GetRawCertData())).Replace('-', ':');
returnMap["PublicKey"] = certificate.GetPublicKeyString();
rawCertData = certificate.GetRawCertData();
byte[] buffer2 = SHA1.Create().ComputeHash(certificate.GetRawCertData());
for (int i = 0; i < buffer2.Length; i++)
{
str = str + ((sbyte) buffer2[i]);
}
stream.Close();
returnMap["签名(Sig)"] = str;
}
apk文件上传大小限制,web.config文件添加如下:
<system.web>
<httpRuntime maxRequestLength="" executionTimeout="3600" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="">
</requestLimits>
</requestFiltering>
</security>
</system.webServer>
apk文件解析,学习笔记的更多相关文章
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- Android APK安装过程学习笔记
1.什么是APK APK,即Android Package,Android安装包.不同平台的安装文件格式都不同,类似于Windows的安装包是二进制的exe格式,Mac的安装包是dmg格式.APK可以 ...
- python的文件处理学习笔记
python的文件处理函数是open() 以下主要是关于这个函数的一些学习笔记 1.文件处理离不开编码 要注意的是文件打开时的编码和文件保存时的编码的统一,这样才能保证你打开的文件不会存在乱码 总结: ...
- C# IO流与文件读写学习笔记
本笔记摘抄自:https://www.cnblogs.com/liyangLife/p/4797583.html,记录一下学习过程以备后续查用. 一.文件系统 1.1文件系统类的介绍 文件操作类大都在 ...
- 干货分享:互联网运营 学习SEO从零开始 SEO深度解析学习笔记
最近在自学SEO,互联网运营,把做的笔记干货分享给大家啊! 希望能帮到大家,如有好的建议可以关注我[磨人的小妖精]或留言,大家一起探讨. 之前还写过一篇文章互联网运营+SEO:推荐必看的5本书籍,学习 ...
- react 详细解析学习笔记
React的介绍: React来自于Facebook公司的开源项目 React 可以开发单页面应用 spa(单页面应用) react 组件化模块化 开发模式 React通过对DOM的模拟 ...
- PHP文件包含学习笔记
看完下面的几篇文章,然后从第8行开始以后的内容可以忽略!此文是个笔记梳理,是对大佬文章简单的COPY记录,方便以后查看,自己只复现了其中的例子 参考文章: PHP文件包含漏洞利用思路与Bypass总结 ...
- Linux用户、用户组、文件权限学习笔记
最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...
- maclean-【性能调优】Oracle AWR报告指标全解析 学习笔记
原文链接:http://www.askmaclean.com/archives/performance-tuning-oracle-awr.html AWR小技巧 手动执行一个快照: Exec dbm ...
随机推荐
- 在ios7真机上和iOS6模拟器上运行是好的,而在iOS6真机上运行却报错
在ios7真机上和iOS6模拟器上运行是好的,而在iOS6真机上运行却报错 解决方法: 或是都设置为yes.. Build Active Architecture Only的意思是只生成适应的指令集
- nodejs发展
http://www.infoq.com/cn/news/2012/11/netease-nodejs-framework http://www.jlmonteagudo.com/2013/06/ja ...
- 定制ckeditor的菜单
修改配置文件config.js来定制cheditor的菜单,需要以下步骤: 1.找到ckeditor安装目录的config.js文件 2.记下要使用的功能名,以下的"-"代表分隔符 ...
- 大整数相乘的C实现
//之前有个测试这个题没做完,现在把它做完,通过这个程序可以对乘法了解更深刻.分析:运用整数乘法,当然进制越高越好,考虑到乘法不要越界,故考虑进制底数N应该满 //足,N^2<2^32次方.所以 ...
- group by 替代distinct
SQL> select distinct employee_id,first_name from test1; 107 rows selected. Execution Plan ------- ...
- android逐行读取文件内容以及保存为文件
用于长时间使用的apk,并且有规律性的数据 1,逐行读取文件内容 //首先定义一个数据类型,用于保存读取文件的内容 class WeightRecord { String timestamp; flo ...
- Unity Kajiya Hair Shader Mod by Normals
Shader "HairShader" { Properties { _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = &q ...
- idea安装Scala插件
最近在学习研究kafka,当我们进行debug跟踪时,就需要研究源码了.kafka的源码是Scala语言,在此就需要Scala环境来运行kafka源码了. 接下来记录的是我在IDEA中安装Scala插 ...
- spring中解析xml
解析xml有SAX,Stax,dom等方式,那么spring中是如何解析xml文件的呢? Document doc = this.documentLoader.loadDocument( inputS ...
- Little Kings - SGU 223(状态压缩)
题目大意:在一个N*N的棋盘上放置M个国王,已知国王会攻击与它相邻的8个格子,要求放置的额国王不能相互攻击,求放置的方式有多少种. 分析:用dp[row][state][nOne],表示本行状态sta ...