安卓逆向学习之认识apk文件
安卓逆向学习之认识apk
前言
作者介绍的安卓逆向基本是和apk相关的,所以逆向针对于apk,我们首先得了解它得结构和工作原理才能更好得学习安卓逆向,后期会针对于apk内的文件和内部代码做介绍的
一、apk是什么?
其实apk就是安卓平台可以运行的应用程序,它是基于java和安卓编写的,其实真正的安卓还是比较复杂的,我们想要深入学习还是需要比较多的时间去研究的,apk和压缩包是一样的,它也是由开发工具和签名工具一起打包成的应用程序,我们可以将apk的后缀改为rar/gz等压缩包格式,然后解压到本地
我们直接将后缀名修改成压缩包格式,使用压缩包工具或者点击查看就可以看到内部的一些文件
二、apk内部文件介绍
1.assets文件夹
这个文件夹下存放的是静态资源文件,他是不需要appt编译的静态资源,我们可以看到一些基本的图片资源等等
我们还可以看到一些静态的js文件和页面
内部的代码会先分析你是ios系统还是android系统或者是其他平台
后面作者会继续分析此app的内部代码的,这里作者提一点,安卓开发虽然是基于java和安卓,但是基本的前端还是会涉及到的,针对于这一点,作者建议了解下前端还是比较好的,这里作者将代码放在下面,方便各位学习
// An highlighted block
UKNative.getApiInterface = function(){
var UKNativeAPI = null;
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.UKNativeIOS) {
//IOS
UKNativeAPI = window.webkit.messageHandlers.UKNativeIOS;
}
else if (window.UKNativeAndroid && window.UKNativeAndroid.postMessage) {
//ANDROID
UKNativeAPI = window.UKNativeAndroid;
}
else{
//其它平台
}
return UKNativeAPI;
}
2.lib文件夹
此文件夹和assets完全相反,它是存放动态资源的,windows的动态资源很常见的比如dll,安卓底层是unix,所以它的动态资源都是so,so需要动态调试的方法来查看
这里作者就先不动态调试so文件了,后面会继续写文章讲解的,这里并不是作者偷懒,只是为了方便大家学习,基础肯定要一步步来
3.META-INF文件夹
这个文件夹是专门拿来存放签名文件夹的,一般apk编译打包成apk的时候并不是完整的,需要签名工具签名标识才算是完整的apk,.MF即为签名文件,比较显眼,一打开文件夹就可以看到
4.res文件夹
这里面存放的是xml布局文件,图片,字符串信息,需要使用appt编译的资源文件,它会在resource.arsc(资源索引表)中生成索引id
这里作者要简单介绍下res内部每个文件夹
文件夹 | 作用 |
---|---|
anim | 这个文件夹下存放的是预置动画 |
color | 这是安卓view发生变化时用的颜色值,通常绑定到界面元素上的,比如button按下,弹起,diable的时候会怎么怎么变化 |
res/drawable/ res/drawable-hdpi res/drawable-land-hdpi res/drawable/mdpi res/drawable/ldpi res/drawable/port | 这些文件都是定义位图资源的,可以是bitmap,也可以是xml描述的bitmap,Drawable 的其他目录形势, land 是横屏的, port 是竖屏的; hdpi 是高分辨率的, ldpi 是低分辨率的, hdpi 是高分辨率的 |
res/layout | 定义的是ui的layout,被appt parser之后,可由安卓直接render成view,这里也是竖屏和dpi之分的 |
res/values/ | 这个文件夹下是可以被编译成很多类型的xml文件的,array.xml 定义数组, styles.xml 定义 样式 (style) 对象 |
res/xml/ | 任意的xml文件,可以使用Resource.getXML()获取 |
res/raw/ | 可以直接由外部存放的资源文件,使用Resource.openRawResource(),填写资源的id即可使用,例如R.raw.someoffiles |
可以简单看一下raw文件夹下的一些资源文件
内部还有一些js文件可以看看
这里的代码大致看了一下,应该是收集wifi,设备的状态信息,作者其实拿来当案列的app其实是bc的app,是作者之前无意间在第三方平台上整到的,此apk没有加壳
这个app会收集很多用户的隐私和环境信息,作者提醒大家远离bc,这玩意儿一碰很容易会让你上瘾,好了,我们继续讲apk
5.AndroidManifest.xml主程序文件
这个文件其实就相当于一个配置清单,大致介绍了主程序入口,apk使用的权限,四大基本组件的信息
可以简单的看到请求的有网络权限,读取电话的权限,以及文件权限,下面还会记录主程序的入口点,这个比较重要,方便我们逆向分析
这里说一下找主程序入口的方法,我们首先可以搜索android:name="“的属性里面查找action.Main和intent.category.LAUNCHER属性,这两个一般都是在一起的,如果对应的activity标签下拥有这两个属性,那么毫无疑问对应的activity中的android:name=”"属性里面就是主程序的入口点
这里作者提示大家不要安装来历不明的apk文件,许多木马是可以直接插入到apk中去的,而且apk木马制作比较简便,网上也有许多教程
6.classes.dex文件
这个文件有没有感觉很熟悉呢,这就是源代码文件,我们拿到这个文件基本就相当于拿到源码了,不过这个文件大于65535好像会分包处理这里作者也没去仔细研究
这里的dex我们可以使用dex2jar工具将dex反编译为java文件,这样我们就可以直接使用java开发工具或者编译工具打开查看源代码了,这里作者就不放工具了,网上其实都有,作者建议没有的可以去吾爱搜索下逆向工具包,或者去看雪论坛搜素下工具包,论坛的各位大佬都有放出工具包
这里我们已经可以看到源代码了,之后就可以在代码层进行各种审计和调试了
7.resources.arsc文件
这就是之前说的索引文件,里面记录了要使用的资源id
这里作者使用的是hex的编辑器,可以看到一些内容,不过大多是乱码,需要专门的工具查看索引表,这里作者就不去整了
结尾
作者大致介绍了一下apk的构成,怎么查看apk,如何查找主程序入口点,每个文件是干什么用的,下一篇作者将介绍apk的打包流程和java基础,作者写文章的初衷只是为了更好的交流学习,文章存为手写,如有相同纯属巧合,文章都是作者的学习笔记,写的不好还望大家见谅,有兴趣的也可以留言交流和学习,互相学习一起进步
本文地址:https://blog.csdn.net/qq_42815324/article/details/110202347