android su程序分析
生活随笔
收集整理的這篇文章主要介紹了
android su程序分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
總結
以上是生活随笔為你收集整理的android su程序分析的全部內容,希望文章能夠幫你解決所遇到的問題。