精华内容
下载资源
问答
  • 摘要:随着移动互联网的发展,智能移动设备已逐渐取代传统终端产品,在为用户带来高质量生活的同时,也为信息安全带来新的挑战。... 本文针对Android安全机制存在的缺陷,提出了一个Android文件访问控...

    摘要:

    随着移动互联网的发展,智能移动设备已逐渐取代传统终端产品,在为用户带来高质量生活的同时,也为信息安全带来新的挑战。Android作为智能移动设备的主流操作平台之一,自发布以来,市场占有率迅速增长,其安全问题也成为用户越来越关注的问题。一旦存储在Android设备中的敏感文件被窃取或破坏,将对用户造成无法估量的损失。 本文针对Android安全机制存在的缺陷,提出了一个Android文件访问控制系统,旨在为Android设备中存储的敏感文件提供访问控制安全加固。主要研究内容包括: 1.提出Android文件访问控制系统的设计方案。在对访问控制模型进行分析与比较的基础上,根据Android的特点,选择并设计一种访问控制模型。详细介绍目标系统架构中各功能模块的功能设计以及策略文件的安全存储等。 2.阐述了Android文件访问控制系统的实现分析。说明了目标系统中数据结构的构建与作用、各模块中接口的定义与功能。介绍了虚拟文件系统的功能及其中主要的数据结构。同时针对Android用户态与内核态的通信方式进行了叙述。最后介绍了主要系统调用在Android内核中的实现函数并说明了目标系统与Android内核的整合方法。

    展开

    展开全文
  • 主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的。1. MLO, u-boot.img任何操作系统的启动,...

    主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的。

    1. MLO, u-boot.img

    任何操作系统的启动,都离不开“引导程序”,比如桌面Windows系统的BIOS、桌面Linux系统常用的是Grub,而在嵌入式系统中,这个引导程序通常叫做“bootloader”,它通常由处理器的片上ROM中的引导代码和u-boot两部分组成(当然,也有其他类型的bootloader,这里以最常用的u-boot为主)。

    这些“引导程序”的功能,通常都是完成硬件系统的检测和配置,然后到指定的位置去“加载并运行”操作系统内核,这个加载过程就是把指定的内核镜像文件解压到内存DDR中去,然后运行内核代码,并交出CPU控制权。

    由此我们知道,Android系统的启动,第一个最重要的文件就是:“bootloader”。“bootloader”是与操作系统无关的,无论设备上跑的是Linux还是Android,都需要“bootloader”来启动引导。

    关于“bootloader”,需要解释的是:处理器片上ROM中的引导代码通常由处理器厂商实现,我们无法获取也无法修改,u-boot则是具体的开发板/设备厂商实现,如果我们自己设计Android硬件设备,则也需要去修改标准的u-boot代码适配我们自己的硬件模块。

    u-boot编译输出文件有2个,一个是MLO,另一个是u-boot.img,因此,对于很多Android开发板而言,一定存在一个boot分区(通常是fat32格式),该分区里存放有MLO和u-boot.img这两个重要的文件。

    2. uImage

    由于Android系统是基于Linux内核的,因此,与嵌入式Linux启动过程一样,“bootloader”完成硬件检测和初始化配置后,第一步要做的也是加载并运行Linux内核镜像,因此,在Android设备启动过程中,除了MLO和u-boot.img文件外,另一个最重要的文件就是内核镜像uImage文件了。

    注:Linux内核编译成功后,会在arch/arm/boot/目录下生成zImage文件,通过mkimage命令,给zImage文件加上了64个字节的数据头得到uImage文件,这样才能被u-boot识别并正确引导。

    3. ramdisk.img

    在Linux内核启动时,首先去创建虚拟的根文件系统,然后在指定位置寻址真正的根文件系统镜像并加载到内存中,然后执行init可执行程序完成系统启动过程。

    对于嵌入式Linux系统而言,一般需要用busybox等工具专门创建一个根文件系统镜像,而Android源码中已经实现了一个根文件系统,即ramdisk.img,Android内核系统启动时会首先加载ramdisk.img作为根文件系统,然后再执行init程序,解析init.rc脚本,挂载系统其他分区、开启各个进程和服务等。

    因此,Android系统启动第三个必不可少的文件即ramdisk.img文件,它是Android系统的根文件系统镜像。

    4. boot.img

    Android系统中,通常会把zImage和ramdisk.img打包到一起,生成一个boot.img镜像文件,放到boot分区,由bootloader来引导启动,其启动过程本质也是和分开的uImage&ramdisk.img类似,只不过把两个镜像按照一定的格式合并为一个镜像而已。

    bootloader如何知道去哪加载Linux内核(zImage)和根文件系统(ramdisk.img)呢?通常是由命令行参数传入bootloader程序,或者在bootloader代码中给出启动参数配置文件的路径,具体的原理可以去参考bootloader启动Linux内核相关的文章分析,这里就不做详细介绍了。

    5. system.img

    前面我们提到的镜像如“bootloader”,“Linux Kernel”,“文件系统”都是不包含Android系统的核心文件,那么,真正的Android操作系统核心部分在哪呢?其实就位于system.img中,它包含了Android系统的firmware、用户界面、一系列的预编译应用等等,会在内核启动后被挂载到/system分区。因此,它也是Android系统启动必不可少的镜像之一。

    6. userdata.img

    前面介绍的system.img镜像中包含的都是Android系统级别的数据,而“用户”的“出厂”数据则都被放到了userdata.img镜像中了,它会被挂载到文件系统的/data分区,用户新存储的数据、安装的程序均会被放置到这个分区中,如果擦除这个分区,本质上则等同于手机恢复了出厂设置,它也是Android系统启动必不可少的镜像之一。

    7. 其他的镜像

    前面介绍的几个都是Android系统启动涉及到的最重要的几个镜像文件,当然,编译输出还有其他的几个文件包括:用来缓存最频繁访问的数据和应用的cache.img,用来恢复系统时使用的recovery.img等,这里就不详细讲解了。

    结束语

    或关注我们的官方微博微信,还有更多惊喜哦~

    4e1ec83137cbb375dc2fa2d92208939b.png

    来源:oschina

    链接:https://my.oschina.net/u/2920551/blog/790320

    展开全文
  • Android系统的系统层面的底层是linux,中间加上了一个叫做Dalvik的Java虚拟机和ART运行环境,表面层上面是Android运行库。...Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)——该格式经过优化,以降低内存...

    Android系统的系统层面的底层是linux,中间加上了一个叫做Dalvik的Java虚拟机和ART运行环境,表面层上面是Android运行库。每个Android应用都运行在自己的进程上,享有ART和Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一个设备上高效运行,Dalvik被改写过。

    Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)——该格式经过优化,以降低内存耗用到低。底层功能——例如线程和低内存管理方面,Dalvik虚拟机是依赖Linux内核的。由此可见,可以说Android是运行在Linux之上的操作系统,但是它本身不能算是Linux的某个版本。

    Android内核和Linux内核的差别主要体现在11个方面,如下:

    1、Android Binder

    Android Binder的源代码位于 drivers/staging/android/binder.c

    Android Binder是基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通信(IPC)。

    Linux内核系统上层应用的进程间通信主要是D-bus(Desktop bus),采用消息总线的方式来进行IPC。

    2、Android电源管理(PM)

    Android电源管理是一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备做了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的功耗,以达到节能的目的。

    Android电源管理的源代码分别位于如下位置:

    kernel/power/earlysuspend.c

    kernel/power/consoleearlysuspend.c

    kerne/power/fbearlysuspend.c

    kernel/power/wakelock.c

    kernel/power/userwakelock.c

    Android 5.0版本将引用JobScheduler调度程序,好处是增加设备续航时间,以达到节省电量的目的。

    3、低内存管理器(Low Memory Killer)

    Android中的低内存管理器和Linux标准的OOM相比,其机制更加灵活,他可以根据需要杀死进程来释放需要的内存。Low Memory Killer的代码很简单,关键的一个函数是Lowmem_shrinker.作为一个模块在初始化时调用register_shrinker注册了一个lowmem_shrinker,它会被vm在内存紧张的情况下调用。Lowmem_shrinker用来完成具体操作。简单的说就是寻找一个合适的进程杀死,从而释放它占用的内存。

    低内存管理器的源代码位于drivers/staging/android/lowmenorykiller.c

    4、匿名共享内存(Ashmem)

    匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示然后重新分配内存并重载数据。

    匿名共享内存的源代码位于mm/ashmem.c

    5、Android PMEM

    PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。驱动中提供了mmap、open、release、ioctl等接口。

    Android PMEM的源代码位于drivers/misc/pmem.c

    6、Android Logger

    Android Logger是一个轻量级的日志设备,用于抓取Android系统的各种日志,是Linux所没有的。

    Android Logger的源代码位于drivers/staging/android/logger.c

    7、Android Alarm

    Android Alarm提供了一个定时器用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准。

    Android Alarm的源代码位于drivers/rtc/alarm.c 和 drivers/rtc/alarm-dev.c

    8、USB Gadget驱动

    USB Gadget驱动是一个基于标准Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架的。

    USB Gadget驱动的源代码位于如下位置。

    drivers/usb/gadget/android.c

    drivers/usb/gadget/f_adb.c

    drivers/usb/gadget/f_mass_storage.c

    9、Android Console

    为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备中,它是一个基于RAM的Buffer。

    Android Ram Console的源代码位于 drivers/staging/android/ram_console.c

    10、Android timed device

    Android timed device 提供了对设备进行定时的控制功能,目前仅支持vibrator和LED设备。

    Android timed device 的源代码位于drivers/staging/android/timed_output.c(timed_gpio.c)

    11、Yaffs2文件系统

    在Android系统中,采用Yaffs2作为MTD NAND Flash文件系统。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存它的运行状态,因此占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。

    Yaffs2文件系统位于fs/yaffs2/.

    展开全文
  • Author: GeneBlue0X01 前言内核驱动是漏洞的高发区,了解Android驱动代码的编写是分析、利用驱动漏洞的基础。本文以一个“hello”驱动为例,简单介绍内核驱动编写、编译的基本过程,包括内核模块的内建编译和动态...

    Author: GeneBlue

    0X01 前言

    内核驱动是漏洞的高发区,了解Android驱动代码的编写是分析、利用驱动漏洞的基础。本文以一个“hello”驱动为例,简单介绍内核驱动编写、编译的基本过程,包括内核模块的内建编译和动态加载方式的编译。

    0X02 编写

    在./goldsifh/drivers文件夹下新建hello目录,在hello目录中新建hello.c文件:

    #include

    #include

    #include

    #include

    MODULE_LICENSE("GPL");

    MODULE_AUTHOR("GeneBlue");

    MODULE_DESCRIPTION("Hello Kernel Device");

    MODULE_VERSION("1.0");

    #define CMD_COMMAND 0x1336

    long hello_ioctl(struct file *filp, //ioctl函数 unsigned int cmd, unsigned long arg){

    switch(cmd){

    case CMD_COMMAND:

    printk("Hello Module hello_ioctl() exced");

    break;

    default:

    printk("Hello Module unknown ioctl cmd");

    }

    return 0;

    }

    struct file_operations hello_fops = { //设备的操作函数指针表

    unlocked_ioctl: hello_ioctl

    };

    static struct miscdevice hello_device = { //注册为misc设备的基本属性

    minor: MISC_DYNAMIC_MINOR,

    name: "hello",

    fops: &hello_fops,

    mode: 777

    };

    static int __init hello_begin(void){

    int ret;

    ret = misc_register(&hello_device); //注册为misc设备

    if(ret)

    printk("Failed to register misc device");

    else

    printk("Hello Module successfully loaded");

    return ret;

    }

    static void __exit hello_exit(void){

    int ret = misc_deregister(&hello_device); //设备卸载

    if(ret)

    printk("Hello module exit");

    }

    module_init(hello_begin); //模块初始化函数

    module_exit(hello_exit); //模块卸载函数

    写驱动模块时都要包含module.h头文件,该头文件定义了一些编写模块时常用宏或函数;kernel.h提供常用的内核函数,如printk();fs.h提供文件表和文件结构,如file_operations;miscdevice.h提供注册为misc设备的常用函数。

    0X03 编译

    在编译之前,要确保下载下来的内核代码已经可以顺利地编译运行,具体可以参考这里。

    在hello目录中,要增加Makefile配置文件用于编译。在Makefile中添加:

    obj-y +=hello.o

    表示内建编译,即直接编译到内核文件zImage中。然后在goldfish/drivers/Makefile中包含新建的驱动设备

    obj-y +=hello/

    这样,再次编译内核后,驱动设备即可包含在内核中。

    有的时候,我们需要在手机中编写可动态加载的驱动模块,可动态加载模块非常便于调试,在kmsg中可直接看到调试信息,这个时候需要重新编译手机内核,开启内核的动态加载属性。在编译的内核的时候,使用

    make menuconfig

    命令,并在menuconfig中做如下配置:

    0818b9ca8b590ca3270a3433284dd417.png

    0818b9ca8b590ca3270a3433284dd417.png

    如果不开启该选项就直接insmod加载hello.ko,一般情况下都会报如下错误:

    insmod: init_module 'hello.ko' failed (Function not implemented)

    [内建编译的情况]--编译完内核之后,还需要将内核拷贝到aosp的源码中,替换掉默认的内核文件,在我的Android源码中默认的内核文件存放在如下路径中:

    /android-4.4.4_r1/device/lge/hammerhead-kernel/zImage-dtb

    编译Android源码生成新的boot.img文件,然后只要将boot.img刷入到手机即可。

    完成内核的准备工作之后,下面就要编译动态加载模块hello.ko,依然是上述的hello.c文件,在任意位置建一个目录,拷贝hello.c并编写Makefile如下:

    obj-m := hello.o

    KERNELDIR := /home/geneblue/Android/Source/kernel/msm/

    PWD :=$(shell pwd)

    ARCH=arm

    CROSS_COMPILE=/home/geneblue/Android/Source/tsinghua_aosp/android-4.4.4_r1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-

    CC=$(CROSS_COMPILE)gcc

    LD=$(CROSS_COMPILE)ld

    CFLAGS_MODULE=-fno-pic

    modules:

    make -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules

    clean:

    rm *.o *.ko *.mod.c *.order *.symvers

    注意,Makefile中要加上  CFLAGS_MODULE=-fno-pic  选项,不然insmod加载编译好的  hello.ko relocation节  会错误:

    insmod: init_module 'hello.ko' failed (Exec format error)

    kmsg:

    <3>[ 1646.589131] hello: unknown relocation: 27

    最后,使用make命令即可编译生成正确的   hello.ko   文件。

    0X04 运行

    使用模拟器来加载新编好的内核,并在adb shell中,root权限下查看新编的驱动:

    # root权限下

    # ll /dev | grep hello

    # dmesg | grep Hello

    0818b9ca8b590ca3270a3433284dd417.png

    这样,一个最简单的设备驱动已经可以正确运行了。

    将 hello.ko 文件push到手机中,root权限下用insmod来加载即可。

    # 加载内核模块

    # insmod hello.ko

    # 查看加载的内核模块

    # lsmod

    0818b9ca8b590ca3270a3433284dd417.png

    0X05 参考

    展开全文
  • Android内核编译

    2021-10-21 21:34:25
    Android内核的编译需要是Mac或者ubuntu系统,centos和windows系统是不行的,磁盘需要不低于170G,如果磁盘太小编译不过,引发异常而导致中断。如果是使用的是MacOS,必须在要重新划分磁盘分区,以区分大小写,原有的...
  • 由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚repo是什么东西,它该怎么使用?作为《Android内核开发》系列文章的第二篇,我们首先谈谈对repo工具的理解和使用。1. repo是什么?repo...
  • blog.sina.com.cn/s/blog_706845a5010129da.html终于很恶心的把流程走通了首先... .config文件———工具类———–1. 交叉编译器arm-eabi-2. fastboot,adb等android工具3. mkbootimg用于解包boot.img使用———脚本...
  • Android获取系统内核版本的方法这里主要实现获取Android Linux 内核的版本号,网上关于这类文章不是很多,这里记录下,希望能帮助到大家,实现代码:public static String getKernelVersion() {String kernelVersion...
  • 在之前博文中() 提到如何编译android 源码。... android 源码包里面含有编译好的内核文件,所以即使不包含内核源码,一样可以刷机启动。 这篇文章要做的事情就是编译内核源代码,并替换掉自带的内核。...
  • 注:此处内容总结自google官网:AOSP 编译内核。编译完成后刷机部分参考自其他大佬的文章。官网中介绍的也许没有很详细,但绝对是最权威的。 一.简介 1. 环境 手机:pixel Android 版本:8.1.0 内核版本:3.18.70-...
  • 1 、下载内核文件系统1.1 下载文件系统1) Git的安装在 Ubuntu 10.04上安装 git只要设定了正确的更新源,然后使用 apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中 curl是一个利用 URL语法在命令行下工作...
  • Android内核编译调试

    2021-06-03 02:12:34
    Author: GeneBlue禁止任何形式转载0X01 前言研究Android底层或漏洞方面的知识,编译调试内核源码是必不可少的。这篇文章介绍内核编译调试的基本步骤。0X02 环境Android开发环境:SDK,NDKPC OS:Ubuntu 14.04 LTS 64...
  • 概述如果我们仅仅对Android内核感兴趣,我们可以选择合适的Android内核下载并编译。可供选择的内核源码有很多版本:$gitclonehttps://android.googlesource.com/kernel/common.git$gitclonehttps://android....
  • 一、system 系统命令和系统应用数据目录、 1、/system/app/ 系统应用目录、 2、/system/framework/ 框架目录、 3、/system/font/ 字体目录、 二、sys Linux 系统内核文件目录、
  • android 系统文件目录

    2021-05-14 21:23:10
    开始写了一些小demo 联系下,今天练习到了通过调用系统提供的 相机 程序,拍照后存储到手机上,这里就遇到了文件往哪存这个问题,这就需要先了解一下android系统的文件结构,由于Android是基于Linux内核的操作系统,...
  • 前面一篇文章《Android反调试手段收集》在讲常用的反调试方法中有一条是检测进程的TracerPid的值正常情况下为0,在被调试时变成父进程的pid,应对这种情况我们可以通过修改手机内核中代码,将这个pid永久性改为0。...
  • Android源码、内核编译

    2020-12-18 20:15:33
    Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码、编译源码、下载内核、编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可是30G的...
  • android 目录结构说明

    2021-06-08 17:28:44
    android目录结构说明(2012-04-14 09:53:04)标签:杂谈|– Makefile (全局的Makefile文件)???? |– bionic (Bionic含义为仿生,这里面是一些基础的C库源代码)???? |– bootloader (引导加载器)???? |– build (build...
  • 背景CVE-2013-2597 是高通 msm_acdb 设备驱动的一个 ...一个.ko模块加载到内核后,如何在内核中找到其对应汇编代码,一直比较迷惑,此文解决这个问题。参考操作以下在Nexus 5设备操作。1)查看boot所有分区root@hamm...
  • 首先我们要编译的一种是可动态加载的内核驱动。去到 goldfish/drivers 文件夹创建一个文件夹。就叫helloworld吧。不过其实对于这种动态加载的内核驱动,不一定需要在这个drivers文件夹下面,因为最后只要得到那个ko...
  • android设备的启动分为三个阶段:Boot Loader,Linux Kernel,Android 系统服务。Android系统实际上是运行在Linux Kernel之上的一系列系统服务进程。 首先,给出一张图,图片来自这里,帮助大家理解和分析,里面还有...
  • Android的源码中(目标路径为:system/core/logcat/logcat.cpp),将其此logcat.cpp文件中的static void readLogLines(int logfd)函数作出如下修改:static void readLogLines(int logfd) {char buffer[256] = {0} ;...
  • 从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件。那么,如何...
  • 您可以将以下配置设置用作 Android 内核配置的基础。设置会整理到 android-base 和 android-recommended .cfg 文件android-base。这些选项可实现核心 Android 功能,所有设备都应该启用。android-recommended。...
  • Environment.getDataDirectory() = /data...= /mnt/sdcard/Android/data/com.my.app/files/test getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files getFilesDir() = /data/data/com.my.app/files
  • 最近在调试一个驱动的...这个问题可以说不算是android的问题,而应该是linux系统的问题,android本身就是个linux系统。下来一步一步分析问题的所在。内核配置内核从3.7后开始支持模块签名,这个功能使能以后,内核...
  • 从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu文件。那么,如何...
  • Android项目中集成腾讯X5内核

    千次阅读 2021-06-03 09:32:39
    而在这种情况下,腾讯tbs的x5内核webView就很适合我们的要求了。正文今天就介绍一下如何使用x5内核替代系统原生的webView,以解决系统自带webView能力不足的问题。下载tbs的jar包在腾讯tbs升级至...
  • 然而由于系统 WebView 的兼容性问题(Android 4.4 以前 webview 是基于 webkit ,4.4 及以后采用 chromium)。需要使用一款兼容性较好的内核「完美支持 webrtc」。这一篇主要讲解腾讯 X5 浏览器的集成,不得不说官方...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,906
精华内容 33,962
关键字:

安卓内核文件