首页
社区
课程
招聘
[原创]实践APP安全之提取mainfest文件
发表于: 2017-8-27 03:46 3225

[原创]实践APP安全之提取mainfest文件

2017-8-27 03:46
3225

注:该文章为入门文章,现在完全可以用更好的工具更高效达到目的,发此贴以记录踩过的坑,以便其他新手可以借鉴。

1.检查APP的证书和签证

1.app证书:把开发者id和app以密码学的方式关连,确认和强制保证android app的完整性的机制。
工作原理:用一个密码学意义上的hash函数计算app的内容。
2.创建AVD
准备工具: java  JDK,  Android SDK   
window:   WinZip  
Linux:   Unzip   执行命令:sudo apt-get install unzip
   
1.window:  c:\ [安装sdk路径]\android create avd -n [avd名字] -t [系统镜像id]
   linux: [安装sdk路径]/android create avd -n [avd名字] -t [系统镜像id]
2.[sdk安装路径]/emulator -avd [avd名字] -no-boot-anim
   我的avd信息:
Name: Nexus_5_API_23
CPU/ABI: Google APIs Intel Atom (x86)
Path: C:\Users\Administrator\.android\avd\Nexus_5_API_23.avd
Target: google_apis [Google APIs] (API level 23)
Skin: nexus_5
SD Card: 100M
3.复制一个APK文件
命令:adb pull /system/app/Contacts.apk      //该APK文件为AVD自带APK文件
ls -al /system/app      //列出所有系统自带apk文件
4.解压APK文件
window: WinZip打开
 linux: 复制到一个扩展名为zip的文件中,用Unzip打开
    第一步:cp Contacts.apk Contacts.zip
    第二步:unzip Contacts.zip
    第三步:找到META-INF文件,其中含有签名文件和公钥证书CERT.RSA,用keytool查看其中内容,
keytool -printcert -file META-INF/CERT.RSA
   第四部:查看META-INF中的CERT.SF文件
在linux下使用下面命令:
cat [path-to-unzipped-apk]/META-INF/CERT.SF
里面含有app中各个资源文件的密码学意义上的hash(SHA-1算法)
META-INF文件的结构:
MANIFEST.MF:该文件声明资源
CERT.REA:公钥证书
CERT.SF:包含了app中所有的资源文件,它负责对app进行签名,其中含有JAR指定密码学上的签名。
CERT.RSA:是个X.509 v3证书。包含:
Owner(持有者)  Issuer(颁发者)  Serial number (序列号) Valid from ... until (证书有效期
 Certificate fingerPrints(数字效验和)
也可以使用OpenSLL库查看完整的公钥证书
安装OPENSLL:apt-get install opensll
在apk解压目录的根目录中查看证书:
opensll pcks7 -inform DER -in META-INF/CERT.RSA -noout -print_certs -text
3.对Android app进行签名
准备工具:
 java  JDK:含有必要的签名和验证工具
APK文件  
window:   WinZip  
Linux:   Unzip   
如果使用的APK文件已经签名,则要删除签名。
window下:解压APK文件直接删除META-INF
Linux下:在解压后执行命令  rm -r [apk路径]/META-INF
第一步:建立一个秘钥储存器(keystore),用来存放签名app要用的私钥。window和linux下执行下面语句。
keytool -genkey -v -keystore [keystore的名称] -alias [密钥别名] -keyalg RES -keysize 2048 -validity [有效天数]
我的建库命令 keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

这里我建立的的密钥库名称和密钥别名都使用android.keystore


第二步:记住密码,将密钥库放置到安全的地方
第三步:在建立证书的过程中提供信息,在其内部存放着我的新的私钥、公钥、自签名证书
第四步:用密钥储存库对一个app签名
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystore名字] [apk文件] [密钥别名]
我签名APP使用语句:jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystorandroid.keystore test.apk android.keystore

第五步:将APK文件放置在keytool路径下,jarsigner开始对指定app签名,在其中加入META-INF文件夹


签名原理:

keytool对公钥和私钥的处理方式是:把公钥放在X.509 v3证书中,该证书是用来声明公钥持有者,并把验证相关公钥是否属于声明持有者的。


4.验证APP签名
第一步:使用jarsinger工具验证签名
jarsigner -verify -verbose [apk存放路径][APK名称]
我将APK移动到jarsigner路径下执行 jarsigner -verify -verbose test.apk
第二步:查看输出验证字符串,表示签名已被验证。
5.探索AndroidManifest.xml文件
准备工具:Winzip ,Java JDK  , Android SDK
把apktool解压到SDK中的platforms-tools目录中
window路径:c:\\[sdk安装路径]\sdk\platform-tools\
linux路径:/[sdk路径]/sdk/platform-tools/
将apktool.jar和其他apktool脚本都放在\sdk\platform-tools\目录下,运行下面命令测试
window下:c:\[sdk所在目录]\apktool -help
linux下:/[apktool所在目录]/apktool -help
第一步:将apktool应用到APK文件上,将命令行打开进入apktool所在目录
linux下:/[apk所在目录]/apktool d -f -s [apk文件] decoded-data/
window下:c:\[apktool所在目录]/apktool d -f -s [apk文件] decoded-data/
在linux下,想要把提取出来的所有文件都放到名为decoded的文件里,输入以下命令:
~/adt-bundle-linux-x86_64/sdk/platform-tools/apktool d -f -s test.apk decoded
在提取资源文件的时候报如下错误,是因为apktool版本太低,应下载最新版本按解压放置在sdk路径下替换旧apktool。
新版本执行语句也发生变化,应为

D:\android\sdk\platform-tools>apktool d -f -s test.apk -o decoded-data


还要注意,在旧版本apktool提取资源文件时,会自动产生一个apk文件,如果替换apktool后还不能提取,则进入
C:\Users\Administrator\apktool\framework目录下,删去1.apk再次执行,发现成功运行。
第二步:

提取资源文件成功后,可以查看该APP的manifest了。

window下:c:\Window\System32\notepad.exe [decoded-data路径]\AndroidManifest.xml
linux下:cat [decoded-data路径]/AndroidManifest.xml
第三步:


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册