【2017年整理】android运行二进制文件

上传人:豆浆 文档编号:986735 上传时间:2017-05-24 格式:DOCX 页数:11 大小:182.42KB
返回 下载 相关 举报
【2017年整理】android运行二进制文件_第1页
第1页 / 共11页
【2017年整理】android运行二进制文件_第2页
第2页 / 共11页
【2017年整理】android运行二进制文件_第3页
第3页 / 共11页
【2017年整理】android运行二进制文件_第4页
第4页 / 共11页
【2017年整理】android运行二进制文件_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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

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

2、b push busybox-armv7l /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- 查看并修改 busyb

3、ox 权限失败 : system 用户没有修改 sd 卡文件模式的权限;?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/dat

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

5、取执行结果 :3. 使用到的 api 解析(1) 获取 assets 目录文件的输入流?1 InputStream is = context.getAssets().open(source);- 获取 AssetsManager : 调用 Context 上下文对象的 context.getAssets() 即可获取 AssetsManager 对象;- 获取输入流 : 调用 AssetsManager 的 open(String fileName) 即可获取对应文件名的输入流;(2) 文件流相关操作根据输入流获取文件大小 : 调用输入流的 inputStream.available() 方法

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

7、fer);output.close();(3) 获取文件的绝对路径获取 app 绝对安装路径 : 调用 上下文对象的 getFilesDir().getAbsolutePath() 方法;?1 String filesPath = context.getFilesDir().getAbsolutePath();(4) 执行二进制文件创建 Process 对象, 并使用该 process 执行 shell 脚本命令 :?12Runtime runtime = Runtime.getRuntime();process = runtime.exec(cmd);获取执行的命令行结果 :?1234567

8、InputStream is = process.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is);String line = null; while (line = br.readLine() != null) processList.add(line); br.close();4. 代码示例MainActivity 主程序代码 :?1234567891011121314151617181920package cn.org.octopus.tracerouteandbusybox

9、;import java.io.BufferedReader;import java.io.FileNotFoundException;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 a

10、ndroid.support.v7.app.ActionBarActivity;import android.view.View;import android.widget.EditText;import android.widget.TextView;/* 看不懂注释我就吃半斤狗粮 :-) */public class MainActivity extends ActionBarActivity 212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697

11、07172private EditText et_cmd;private String app_path;private TextView tv_result;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.home_activity);/*初始化控件*/et_cmd = (EditText) findViewById(R.id.et_cmd);tv_result = (TextView) findViewB

12、yId(R.id.tv_result);/* 获取 app 安装路径 */app_path = getApplicationContext().getFilesDir().getAbsolutePath();/* 按钮点击事件 */public void onClick(View view) int id = view.getId();switch (id) case R.id.copy_busybox: /* 拷贝 busybox 可执行文件 */varifyFile(getApplicationContext(), busybox);break;case R.id.copy_tracero

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

14、ath + /traceroute 8.8.8.8;et_cmd.setText(cmd);break;case R.id.exe: /* 执行 Editext 中的命令 */cmd = et_cmd.getText().toString();/* 执行脚本命令 */List results = exe(cmd);String result = ;/* 将结果转换成字符串, 输出到 TextView 中 */for(String line : results)result += line + ;tv_result.setText(result);break;default:7374757677

15、78798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124break;/* 验证文件是否存在, 如果不存在就拷贝 */private void varifyFile(Context context, String fileName) try /* 查看文件是否存在, 如果不存在就会走异常中的代码 */context.openFileInput(fileName); catch (FileNotFoundExcepti

16、on notfoundE) try /* 拷贝文件到 app 安装目录的 files 目录下 */copyFromAssets(context, fileName, fileName);/* 修改文件权限脚本 */String script = chmod 700 + app_path + / + fileName;/* 执行脚本 */exe(script); catch (Exception e) e.printStackTrace();/* 将文件从 assets 目录中拷贝到 app 安装目录的 files 目录下 */private void copyFromAssets(Context context, String source,String destination) throws IOException /* 获取 as

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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