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 ...
随机推荐
- Loading CSS without blocking render
The principles behind these techniques aren't new. Filament group, for example, have published great ...
- Unity3D 命令行参数
Unity3D 命令行参数 @by 广州小龙 unity ios开发群:63438968 Typically, ...
- 【 UVALive - 5095】Transportation(费用流)
Description There are N cities, and M directed roads connecting them. Now you want to transport K un ...
- Android应用连接代理服务器状况监测解决
最近项目里面有这样一个需求,由于项目涉密需要连接VPN通过网址映射去登录内部服务器,而且要通知客户vpn的连接状态.网上有许多类似的连接VPN的解决方案,我也尝试了很多种,下面先列出一种比较靠谱的方式 ...
- winphone 开发学习笔记(1)
学习了winphone task 1.首先根据自己电脑下载sdk,,,win 7和win 8的Sdk安装包不一样, http://www.microsoft.com/en-hk/download/de ...
- 在Xcode中使用Clang Format
Xcode中的Re-Indent,顾名思义,只是一个调整缩进的功能,完全依赖它来进行代码格式化显然不够用.我们使用了一个叫做ClangFormat-Xcode的插件,配合Re-Indent一起来做代码 ...
- 在Ant Build文件中使用正则表达式替换文件内容
这需要在build文件中使用<replaceregexp>标签, 这个标签的使用大概是这个样子的: <replaceregexp file="${src}/build.pr ...
- oracle 创建表空间、创建用户管理该表空间
/*分为四步 *//*第1步:创建临时表空间 */create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9 ...
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- mysql登录时,ERROR 1045 (28000): 错误解决办法
错误问题的描述: ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 10 ...