qemuuser模式运行linux,在Android上使用qemu-user运行可执行文件
作者:寻禹@阿里聚安全
前言
QEMU简要介绍:
QEMU可以解释执行可执行程序。既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行了哪些指令,从而可以跟踪指令的执行。QEMU编译出来的结果分为系统模式和用户模式,QEMU用户模式编译出来的可执行文件名为:qemu-user。关于QEMU更多的介绍请浏览官方网站:QEMU。
qemu-user的main函数源码在文件”linux-user/main.c”中。
设置前提
本文研究的QEMU用户模式的可执行文件运行在(Android & arm cpu)上,下文中说的“设备”一词指的就是Android arm设备,设备的系统是CyanogenMod12.1 ROM,该ROM基于Android5.1.1。
运行qemu-user
将qemu-user拷贝到设备中,运行该可执行程序时会提示无法找到libglib-2.0.so.0和libgthread-2.0.so.0这两个库,如果读者按照上文中引用的文章《编译可在Android上运行的qemu user mode》编译成功qemu-user,那么这两个库就会存在于Android NDK目录下,将这两个目录拷贝到设备的”/system/lib/”目录下,然后就可以成功运行qemu-user程序。
运行错误解决:FATAL: kernel did not supply AT_SECURE
我在设备上运行qemu-user的时候出现了标题上显示的错误”FATAL: kernel did not supply AT_SECURE”。
解决办法一
(解决办法来源:https://gist.github.com/jserv...
找到”bionic/linker/linker_environ.cpp”文件,按照下面的代码修改该文件:
如果读者用过git再看上面的代码就可以很清楚的知道,上面的代码是运行”git diff”后所显示内容,代码做了哪些修改清楚的显示了出来。如果读者没有见过”git diff”命令所显示的内容,那么这么做:找到”-static void __init_AT_SECURE(KernelArgumentBlock& args) {“这一行,从这行开始(包括这一行)每一行以减号开头的表示删除该行。
文件修改完成后在Android源码根目录运行下面的命令:
. build/envsetup.sh
breakfast hammerhead
mmm /bionic/linker/
mmm命令用于编译”/bionic/linker/”目录下的源码,这个目录下的源码编译完成后会生成一个名为”linker”的可执行文件,这个可执行文件的生成目录会在终端上显示出来,将这个linker覆盖设备上的”/system/bin/linker”文件。
覆盖设备上的”/system/bin/linker”文件的实际操作中,覆盖需要需要ROOT权限。”/system/bin/linker”文件覆盖完成以后,它的文件权限是这样的:
-rwxr-xr-x root root 91902 2016-05-01 21:50 linker
即linker属于root用户,并属于root用户组。但是linker原本的权限是下面这样的:
-rwxr-xr-x root shell 91902 2016-05-01 21:50 linker
即linker属于root用户,并属于shell用户组。
所以linker覆盖完成后需要执行”chgrp shell /system/bin/linker”命令设置linker的用户组。
__init_AT_SECURE函数的被调路径:__linker_init -> __linker_init_post_relocation -> linker_env_init -> __init_AT_SECURE
解决办法二
在qemu源码目录下找到”linux-user/elfload.c”文件,文件中有create_elf_tables函数,在该函数中找到这一行代码:
NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes);
在这行代码下添加一行代码:
NEW_AUX_ENT(AT_SECURE, 0);
在该文件中找到这一行:
#define DLINFO_ITEMS 14
将这一行改为:
#define DLINFO_ITEMS 15
解决办法思路说明:
[翻译] getauxval() and the auxiliary vector这篇文章中说了,fs/binfmt_elf.c文件中有内核的ELF二进制加载器源码,在该文件中也有一个create_elf_tables函数,fs/binfmt_elf.c文件create_elf_tables函数有下面一行代码:
NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm));
即在标准的create_elf_tables函数中会添加AT_SECURE这一项。通过阅读“解决办法一”可以推断出,产生”FATAL: kernel did not supply AT_SECURE”错误是因为找不到AT_SECURE这一项,那么“解决办法二”的思路就是在qemu的create_elf_tables函数中添加这一项。
为什么在qemu的create_elf_tables函数中添加的AT_SECURE项对应的值是0呢?这是因为我图方便,标准代码中AT_SECURE项对应的值是函数security_bprm_secureexec(bprm)的返回值,我发现理解security_bprm_secureexec函数比较麻烦。那么为什么是0而不是其他常量值?这是因为在linux系统的终端上输入下面的命令:
LD_SHOW_AUXV=1 ps
最后显示AT_SECURE对应的值是0。上面命令中的”ps”可以是其他命令,如:ls。关于LD_SHOW_AUXV这个环境变量在《[翻译] getauxval() and the auxiliary vector》一文中有介绍。
- loader_exec -> linux-user/elfload.c - load_elf_binary -> linux-user/elfload.c - create_elf_tables
作者:寻禹@阿里聚安全,更多安全技术、资讯文章,请访问
qemuuser模式运行linux,在Android上使用qemu-user运行可执行文件相关推荐
- Kettle问题:脚本在本地运行正常,但上传服务器后运行失败
有时,我们在执行Kettle脚本时会遇到这种情况:脚本在本地运行正常,但上传服务器后运行却失败了,这很可能是文件引用中使用了绝对路径导致的. 我们在进行脚本开发时,一般会先在本地进行开发调试,调试好后 ...
- wine for linux android,技术|如何在 Android 上借助 Wine 来运行 Windows Apps
Wine(一种 Linux 上的程序,不是你喝的葡萄酒)是在类 Unix 操作系统上运行 Windows 程序的一个自由开源的兼容层.创建于 1993 年,借助它你可以在 Linux 和 macOS ...
- android wine教程_技术|如何在 Android 上借助 Wine 来运行 Windows Apps
Wine(一种 Linux 上的程序,不是你喝的葡萄酒)是在类 Unix 操作系统上运行 Windows 程序的一个自由开源的兼容层.创建于 1993 年,借助它你可以在 Linux 和 macOS ...
- android wine教程_如何在 Android 上借助 Wine 来运行 Windows Apps
Wine(一种 Linux 上的程序,不是你喝的葡萄酒)是在类 Unix 操作系统上运行 Windows 程序的一个自由开源的兼容层.创建于 1993 年,借助它你可以在 Linux 和 macOS ...
- 安卓平台运行python_在 android 上运行 python 的方法
android官方目前没有支持在android设备运行python,但是网上有一些项目组做了这个事情:http://geeknizer.com/install-run-python-apps-scri ...
- n1运行linux,斐讯N1折腾记:运行 Linux 及优化
此教程同样适用于斐讯 P1 咳咳咳,上篇教程教大家给斐讯 N1 降级并且刷了官改系统,可以当作一个电视盒子和下载机来使用. 有些小伙伴可能不想把它当作电视盒子,就想把它当作 NAS 或者是服务器,但是 ...
- 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )
文章目录 一.运行环境搭建 Android 模拟器安装 二.拷贝 Android 平台可执行文件和动态库到 /data/system 目录下 一.运行环境搭建 Android 模拟器安装 使用低版本的 ...
- 能运行Linux电脑,国外达人亲手打造可以运行Linux的名片
Mini PC并不奇怪,即便是比Mini PC更小的设备也并不是没有,但是能够将PCB设计成名片大小.成本控制在3美元.且能够运行Linux操作系统的却极为少见. 近日,国外一位嵌入式系统工程师Geo ...
- Ubuntu linux和android上安装使用obfsproxy给ssh加速
假如你有台国外的vps,ssh登陆使用的时候出现输入打字卡,慢等现象,毫不犹豫的使用obfsproxy来达到加速的目的! obfsproxy是一个完全独立的项目,ubuntu安装如下(当然也是最简单快 ...
最新文章
- 目录忽略_宣传册设计中目录的构思方法和运用
- Qcon大会归来(r12笔记第36天)
- SQL Server:OA权限管理设计的实现 下
- RocketMQ与kafka对比(18项差异)-转自阿里中间件
- Android ListView分页,动态添加数据
- Netty工作笔记0004---BIO简介,介绍说明
- do not back up文件夹属性
- typescript之nodejs开发
- 软件测试考证:ISTQB、软件评测师
- 如何从官网直接下载iTunes?
- 浙工大 drcom客户端 嵌入 Linux路由器
- 【OpenCV】马赛克算法
- Java实现Zip压缩包解压
- 谨赠20篇技术热文营造一个不一样的节日气氛!
- STM32单片机-汇编指令2
- 人脸皮肤高清xyz贴图库分享
- 崩坏3抽奖模拟html5,崩坏3崩坏周周练5月18日答案大全 夜隐重霞崩坏周周练答案汇总...
- 1758:二叉树——结点关系
- 一张图带你看懂UML类图
- 展讯平台初步调试笔记
热门文章
- 学习ASP.NET Core Razor 编程系列六——数据库初始化
- 记一个有趣的Java OOM!
- Hey,微信广告收到了吗?你哪个阶层的?
- 我眼中未来的人机交互
- 【250期门诊集锦】痛并快乐着的正则表达式
- 为什么优秀开发者进入Google后就不参与开源了
- 显示器说:偶好惨啊,每天给人看。
- 21.为什么要用swagger,它解决了什么问题?
- python数据变更邮件提醒_Python之Bilibili自动更新邮件提醒并任务栏图标「完整代码」...
- javascript监听输入框_html通过JS/jQuery实现 实时监听输入框input的内容