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
下载位置: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