android su程序分析


下载位置:https://github.com/ChainsDD/su-binary


1:第一步,查看android.mk
查看这个可以了解编译结果是动态库,静态库,还是apk 还是bin文件。还有可以看到文件包含关系。这个我们可以看到是
编译一个可执行文件su


2:需要百度搜索一些资料,/proc/%u/cmdline,getopt_long ,其他相关的百度下,很详细。


3:查看 su.c 505行
if (ctx.from.uid == AID_ROOT || ctx.from.uid == AID_SHELL)
allow(&ctx);
如果为root或者shell执行,则直接允许。否则继续向下看:

dballow = database_check(&ctx);
这个便是读取之前我们是否保存了对此程序允许还是禁止root权限申请。依据返回结果,直接允许或者
禁止,没有读到,则继续。
通过
socket_create_temp send_intent socket_accept socket_send_request socket_receive_result
来进行创建了一个socket,从send_intent里面我们可以看到使用了命令
/system/bin/am broadcast -a ...... 借助am脚本,向系统广播出去一个action=ACTION_REQUEST的
广播,这时我们的Superuser.apk 的AndroidManifest.xml会注册接收此广播,弹出选择框。
操作完毕后socket_receive_result函数会返回,
if (!strcmp(result, "DENY")) {
deny(&ctx);
} else if (!strcmp(result, "ALLOW")) {
allow(&ctx);
进行拒绝允许操作。
deny 函数发送一个拒绝广播send_intent(ctx, "", 0, ACTION_RESULT);,然后退出。
allow函数发送一个允许广播send_intent(ctx, "", 1, ACTION_RESULT); 然后使用 execv(ctx->to.shell, ctx->to.argv + argc);将su进程直接替换成需要执行的
程序。发送 send_intent函数的目的是Superuser.apk里面需要存储数据。
至此android su程序分析完毕。


4:编译自己的su程序
参照http://blog.csdn.net/hunhunzi/article/details/6043032,进行修改编译。
编译完毕先将之前的su备份,将编译好的重命名为su_my,放到、system/bin下面,使用终端root状态下输入chmod 777 su_my
chmod u+s su_my ,此时可以将su_my重名为su,编译完成。
参考:


http://os.51cto.com/art/201108/286445.htm
http://hi.baidu.com/williwill/item/377331b8dbedcca2ebba93ee
http://baike.baidu.com/view/906700.htm

更多相关文章

  1. 学习Android之SimpleAdapter显示网络图片
  2. Android发送广播的三种方式
  3. 手工打包 system.img
  4. Android(安卓)应用程序发布流程---碗豆荚发布流程
  5. Android_DDMS快速入门
  6. Android(安卓)编译成功,先转个知识贴
  7. Android广播接收者使用总结
  8. 在Linux下编译Windows版本的adb和fastboot
  9. android studio编译jar包或者aar包

随机推荐

  1. Android LinearLayout 嵌套 button 监听L
  2. 【Android应用】【Shape使用总结】
  3. 如何调用Android隐藏API
  4. AIDL的实现
  5. ubuntu下Android源代码模块编译
  6. [Android Develop_004] Android Backgrou
  7. Android系统服务概要
  8. Android(安卓)Low Memory Killer
  9. windows 8环境—android studio初步体验(
  10. Android核心分析 之十-------Android GWE