android运行二进制.docx

上传人:枫** 文档编号:559697536 上传时间:2023-03-23 格式:DOCX 页数:11 大小:182.43KB
返回 下载 相关 举报
android运行二进制.docx_第1页
第1页 / 共11页
android运行二进制.docx_第2页
第2页 / 共11页
android运行二进制.docx_第3页
第3页 / 共11页
android运行二进制.docx_第4页
第4页 / 共11页
android运行二进制.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《android运行二进制.docx》由会员分享,可在线阅读,更多相关《android运行二进制.docx(11页珍藏版)》请在金锄头文库上搜索。

1、Android 上实现非root的 Traceroute - 非Root权限下移植可执行二进制文件 脚本文件2014-07-16 我来说两句 来源:让学习成为一种习惯收藏我要投稿1. 原理思路文件权限修改无法实现: 如果没有 root 权限, 就不能改变二进制文件的文件权限;-将busybox推送到Android系统中: 使用 adb push 命令, 将 busybox 传入到 sd 卡中, 注意, 上传到内存中无法实现;-上传到sd卡成功: 使用adb push 文件名 手机中的文件全路径名命令;?12octopusoctopus:/csdn$ adb push busybox-armv7

2、l /sdcard/octopus/busybox3256 KB/s (1109128 bytes in 0.332s)-上传到内存失败: 使用 adb push 上传到内存中失败, 因为 adb 使用的是 system 用户, 只有 root 用户才有权限向内存中写入数据;?12octopusoctopus:/csdn$ adb push busybox-armv7l /data/busyboxfailed to copy busybox-armv7l to /data/busybox: Permission denied-查看并修改busybox权限失败: system 用户没有修改 sd

3、 卡文件模式的权限;?1234shellandroid:/sdcard/octopus $ ll -rw-rw-r- root sdcard_rw 1109128 2014-07-08 19:49 busyboxshellandroid:/sdcard/octopus $ chmod 755 busybox Unable to chmod busybox: Operation not permitted应用程序解决方案:-应用程序专属用户: Android 操作系统会为每个应用程序设置一个用户, 这个用户对其安装目录(/data/data/包名/)下的文件有完整的权限;-将可执行二进制文件拷贝

4、到安装目录中: 将交叉编译好的 busybox 放到 工程目录下的 res/assets/ 目录下;2. 实现策略文件初始放置: 将 交叉编译好的 busybox 文件放在 工程目录的 /res/assets/ 目录下;文件拷贝: 将该 二进制文件 拷贝到 app 的安装目录的 files 目录下, 即 /data/data/包名/files/下;修改文件权限: 使用命令可以直接修改该目录下的权限, 注意这个操作是可以执行的;执行busybox: 在代码中执行 ./data/data/包名/files/busybox ;获取执行结果 :3. 使用到的api解析(1) 获取 assets 目录文

5、件的输入流?1InputStream is = context.getAssets().open(source);-获取AssetsManager: 调用 Context 上下文对象的 context.getAssets() 即可获取 AssetsManager对象;-获取输入流: 调用 AssetsManager 的 open(String fileName) 即可获取对应文件名的输入流;(2) 文件流相关操作根据输入流获取文件大小: 调用输入流的 inputStream.available() 方法;?1int size = is.available();将文件读取到缓冲区中: 创建一个与

6、文件大小相同的字节数组缓冲区, 输入流将数据存放到缓冲区中;?123byte buffer = new bytesize;is.read(buffer);is.close();将文件写到内存中: 调用上下文对象的 openFileOutput(绝对路径名, 权限), 即可创建一个文件的输出流;?123FileOutputStream output = context.openFileOutput(destination, Context.MODE_PRIVATE);output.write(buffer);output.close();(3) 获取文件的绝对路径获取app绝对安装路径: 调用

7、上下文对象的 getFilesDir().getAbsolutePath() 方法;?1String filesPath = context.getFilesDir().getAbsolutePath();(4) 执行二进制文件创建 Process 对象, 并使用该 process 执行shell脚本命令:?12Runtime runtime = Runtime.getRuntime();process = runtime.exec(cmd);获取执行的命令行结果:?1234567InputStream is = process.getInputStream();BufferedReader

8、br = new BufferedReader(new InputStreamReader(is);String line = null; while (line = br.readLine() != null) processList.add(line); br.close();4. 代码示例MainActivity 主程序代码:?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707

9、172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147package cn.org.octopus.tracerouteandbusybox;import java.io.BufferedReader;import java.io.FileNotFou

10、ndException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.v

11、iew.View;import android.widget.EditText;import android.widget.TextView;/* 看不懂注释我就吃半斤狗粮 :-) */public class MainActivity extends ActionBarActivity private EditText et_cmd;private String app_path;private TextView tv_result;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedI

12、nstanceState);setContentView(R.layout.home_activity);/*初始化控件*/et_cmd = (EditText) findViewById(R.id.et_cmd);tv_result = (TextView) findViewById(R.id.tv_result);/* 获取app安装路径 */app_path = getApplicationContext().getFilesDir().getAbsolutePath();/* 按钮点击事件 */public void onClick(View view) int id = view.g

13、etId();switch (id) case R.id.copy_busybox: /* 拷贝busybox可执行文件 */varifyFile(getApplicationContext(), busybox);break;case R.id.copy_traceroute:/* 拷贝traceroute可执行文件 */varifyFile(getApplicationContext(), traceroute);break;case R.id.exe_busybox:/* 将busybox命令添加到Editext中 */String cmd = . + app_path + /busybox;System.out.println(et_cmd);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号