【Android 应用开发】Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件(一)

简介: 【Android 应用开发】Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件

示例代码下载 :


-- CSDN : http://download.csdn.net/detail/han1202012/7639253;


-- GitHub : https://github.com/han1202012/TracerouteAndBusybox ;




1. 原理思路



文件权限修改无法实现 : 如果 没有 root 权限, 就不能改变二进制文件的文件权限;


-- 将busybox推送到Android系统中 : 使用 adb push 命令, 将 busybox 传入到 sd 卡中, 注意, 上传到内存中无法实现;


-- 上传到sd卡成功 : 使用 adb push 文件名 手机中的文件全路径名 命令;



octopus@octopus:~/csdn$ adb push busybox-armv7l /sdcard/octopus/busybox
3256 KB/s (1109128 bytes in 0.332s)

-- 上传到内存失败 : 使用 adb push 上传到内存中失败, 因为 adb 使用的是 system 用户, 只有 root 用户才有权限向内存中写入数据;


octopus@octopus:~/csdn$ adb push busybox-armv7l /data/busybox
failed to copy 'busybox-armv7l' to '/data/busybox': Permission denied

-- 查看并修改busybox权限失败 : system 用户没有修改 sd 卡文件模式的权限;


shell@android:/sdcard/octopus $ ll 
-rw-rw-r-- root     sdcard_rw  1109128 2014-07-08 19:49 busybox
shell@android:/sdcard/octopus $ chmod 755 busybox                              
Unable to chmod busybox: Operation not permitted


应用程序解决方案 :


-- 应用程序专属用户 : Android 操作系统会为每个应用程序设置一个用户, 这个用户对其安装目录(/data/data/包名/)下的文件有完整的权限;


-- 将可执行二进制文件拷贝到安装目录中 : 将交叉编译好的 busybox 放到 工程目录下的 res/assets/ 目录下;




2. 实现策略



文件初始放置 : 将 交叉编译好的 busybox 文件放在 工程目录的 /res/assets/ 目录下;


文件拷贝 : 将该 二进制文件 拷贝到 app 的安装目录的 files 目录下, 即 /data/data/包名/files/下;


修改文件权限 : 使用命令可以直接修改该目录下的权限, 注意这个操作是可以执行的;


执行busybox : 在代码中执行 ./data/data/包名/files/busybox ;


获取执行结果 :




3. 使用到的api解析



(1) 获取 assets 目录文件的输入流




InputStream is = context.getAssets().open(source);

-- 获取AssetsManager : 调用 Context 上下文对象的 context.getAssets() 即可获取 AssetsManager对象;

-- 获取输入流 : 调用 AssetsManager 的 open(String fileName) 即可获取对应文件名的输入流;




(2) 文件流相关操作



根据输入流获取文件大小 : 调用输入流的 inputStream.available() 方法;



int size = is.available();


将文件读取到缓冲区中 : 创建一个与文件大小相同的字节数组缓冲区, 输入流将数据存放到缓冲区中;


byte[] buffer = new byte[size];
is.read(buffer);
is.close();


将文件写到内存中 : 调用上下文对象的 openFileOutput(绝对路径名, 权限), 即可创建一个文件的输出流;



FileOutputStream output = context.openFileOutput(destination, Context.MODE_PRIVATE);
output.write(buffer);
output.close();





(3) 获取文件的绝对路径



获取app绝对安装路径 : 调用 上下文对象的 getFilesDir().getAbsolutePath() 方法;


String filesPath = context.getFilesDir().getAbsolutePath();


(4) 执行二进制文件



创建 Process 对象, 并使用该 process 执行shell脚本命令 :



Runtime runtime = Runtime.getRuntime();
process = runtime.exec(cmd);

获取执行的命令行结果 :


       

InputStream is = process.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = null;  
            while ((line = br.readLine()) != null) {  
                processList.add(line); 
            }
            br.close();




目录
相关文章
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
2月前
|
Android开发
安卓SO层开发 -- 编译指定平台的SO文件
安卓SO层开发 -- 编译指定平台的SO文件
32 0
|
1天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
20 1
|
1天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
14 1
|
1天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
7 1
|
1天前
|
Android开发
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
Android源代码定制:添加customize.mk文件进行分项目和分客户的定制
2 0
|
2天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
13 0
|
2月前
|
JSON Java Go
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库