零基础安卓逆向学习之旅(二)
零基础安卓逆向学习之旅(二)0x00 前言
上期小狼跟大伙儿分享了如何检测安卓逆向环境,大伙儿是否有遇到问题呢?其实,小狼在上期中没有特别指出来哦,今天就跟大伙儿说说困扰小狼些时日的问题。
今天跟大家分享的是安卓逆向之初步检查APP安全,准备好了吗?要开始啦~~~
0x01 正文
上期文章没有特别指出不能更新SDK的问题哦,聪明的小伙伴们是否自己找到解决方法了呢?其实可以挂代理咧,操作步骤如下:
Tools—>options
mirrors.neusoft.edu.cn
80
解决了上次的问题,接下就开始我们今天的正文啦~
1、检查APP证书及其签名
APP证书是开发者用来确保用户对他们在APP市场上发布的应用程序的信任,证书中通常包括开发者的认证信息及对APP的相关加密算法。每个APP在被安装之前都必须是通过证书签名过的,通过签名可以确保APP的完整性及有效防止“盗版”。
① 创建并启动AVD
创建 /androidcreate avd –n –t -b
启动 /emulator –avd –no-boot-anim
② 从设备中拷贝apk到本地
shell设备,查看apk的相应路径
将apk拷贝到本地
③ 查看APP证书及签名
apk文件实际上是zip格式的压缩包,只是被更改了文件名而已,先将apk转变为zip格式压缩包,再进行解压 。
解压后会新增相应文件及目录。
查看META-INF下文件的内容 ,CERT.RSA是包含有公钥证书的文件,使用keytool进行查看:keytool –printcert –file META-INF/CERT.RSA
关联app内容的签名的文件是META-INF,可以通过cat/vim查看其内容
其中SHA1-Digest-manifest是app每个资源文件所对应的摘要信息,所显示的是通过base64编码过的。
④ 解剖包含有公钥证书和签名的目录META-INF
CERT.RSA:是app证书,需要通过keytool查看其信息,其中包含有公钥持有者、发行人的基本信息,证书的有效期限,证书指纹等。
CERT.SF:这是包含有app每个资源文件摘要信息的文件,这些摘要信息是通过私钥进行加密签名的,需要使用公钥才能解密;在app安装过程中,每个资源文件都会生成摘要信息与这里解密后的摘要进行对比,从而确保app的完整性。
MANIFEST.MF:与CERT.SF保存着相似的资源摘要信息,但未用私钥进行加密签名。
⑤ 可以使用OpenSSL查看完整的公钥证书
openssl pcks7 –inform DER –in META-INF/CERT.RSA–noout –print_certs –text
2、Android app签名
① 移除META-INF目录
rm -r /META-INF
②创建一个密钥库(keystore),从而持有私钥用于签名app
keytool –genkey –v -keystore –alias
–keyalg RSA –keysize 2048 –validity
–genkey:用于告知keytool生成key
-v:信息输出,可选择
-keystore:密钥库名
-alias:别名
–keyalg:加密算法
过程需要设定密码及确认基本信息 。
③ app签名
jarsigner –verbose –sigalg MD5withRSA –digestalgSHA1 –
keystore
–sigalg:提供签名过程的算法;
–digestalg:提供在计算apk文件中每个资源签名的算法;
用于添加包含有证书及签名的META-INF目录。
④ 检查app签名
jarsigner –verify –verbose
3、检查AndroidManifest.xml文件
AndroidManifest.xml文件包含了app中的所以许可信息及app中包含的各个组成成分。
① 安装apktool
访问http://ibotpeaches.github.io/Apktool/install/
② 下载apktool.jar文件及其script,将两个文件放置在/sdk/platform-tools/目录下尝试执行./apktool -help,确定是否安装成功
③利用apktool生成AndroidManifest.xml文件
//apktool d -f –s -odecode/
④ 通过cat/vim查看AndroidManifest.xml文件内容,包含app安装信息
Android app清单是以XML语言的格式保存在.xml文件中的,其中各个标签及标签中的属性都代表着app的各个配置信息。
第一行则是表明该.xml文件的语言版本及编码格式:
<manifest>:是XML文件的根标签,也是app清单的开始标签;
package:是该app包内java主程序包的包名,它也是一个应用进程的默认名称;
<uses-permission>:为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能,例如我们需要让应用能够访问网络就需要配置“android.permission.INTERNET”,而如果要使用设备的相机功能,则需要设置 “android.permission.CAMERA”;
<permission>:权限声明标签,定义了供给<uses-permission>使用的具体权限,当需要给其他应用程序提供可调用的代码或者数据,则需要使用<permission>标签;
android:description:权限描述;
android:icon:权限图标;
android:name:权限名;
android:protectionLevel:代表着不同级别的权限;
dangerous:允许获取敏感用户数据及操作系统配置信息;
normal:获取正常数据及服务;
signature/signatureOrSystem:用于同一证书签名的应用间自动获取信息
通常可以通过查看该标签确定其权限是否适当,同时涉及到dangerous/normal权限在安装时会询问用户是否允许,而后两个则不会显示相关用户确认的信息;
<application>:声明一个应用的开始;
debuggable:当设置为true时,表明该APP在手机上可以被调试,默认为false;
enabled:是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled;
allowClearUserData:是否能选择自行清除数据,默认为true;
android:exported:Activity是否可以被另一个Application的组件启动,true允许被启动;false不允许被启动,如果被设置为了false,那么这个Activity将只会被当前Application或者拥有同样user ID的Application的组件调用。在没确定exported 的默认值时,还需要根据Activity中是否有intent filter(过滤器) 来定。没有任何的filter意味着这个Activity只有在详细的描述了他的class name后才能被唤醒。这意味着这个Activity只能在应用内部使用,因为其它application并不知道这个class的存在。所以在这种情况下,它的默认值是 false。从另一方面讲,如果Activity里面至少有一个filter的话,意味着这个Activity可以被其它应用从外部唤起,这个时候它的默认值是true;
android:name:明确包含有java代码的class file;
android:permission:是否允许请求与该组件交互;
android:enabled:是否允许系统启动、实例化该组件;
<service>:服务组件,程序运行在后台中;
android:isolateProcess:在没有许可下,服务是否可以在分离的进程运行;
<receiver>:广播接受器组件;
<provider>:内容提供者组件;
android:writePermission:对相应组件授予可写权限;
android:readPermission:对相应组件授予可读权限。
4、通过ADB与app活动管理者交互
① 通过shell连接设备并运行pm list packages查看设备程序包列表
ADB启动app活动组件(am start <package name>/<activityname>)
启动小米Email欢迎界面
③ 启动服务组件(am startservice <package name>/<servicename>)
更多:可通过am查看其功能的使用
5、利用ADB获取app的资源
① 前提:实体设备应将其rooted,取得root权限
② 在/data/data目录,保存着各个程序包的资源
③ ls –alR */databases/ 查看数据库资源
ls –alR*/files/ 查看文件资源
④ 利用sqlist3工具查看.db数据库文件的信息
从设备中拷贝.db文件
利用目录下的sqlite3工具查看数据库信息
结语:今天跟大伙分享的是如何检查APP的证书与签名、查看Mainfest及本地数据库等文件
祝资源共享吧越来越火!
页:
[1]