<b></b>
<b>在android上使用qemu-user運作可執行檔案</b>
尋禹@阿裡聚安全
<b>前言</b>
qemu簡要介紹:
qemu-user的main函數源碼在檔案”linux-user/main.c”中。
設定前提
本文研究的qemu使用者模式的可執行檔案運作在(android & arm cpu)上,下文中說的“裝置”一詞指的就是android arm裝置,裝置的系統是cyanogenmod12.1 rom,該rom基于android5.1.1。
将qemu-user拷貝到裝置中,運作該可執行程式時會提示無法找到libglib-2.0.so.0和libgthread-2.0.so.0這兩個庫,如果讀者按照上文中引用的文章《編譯可在android上運作的qemu user mode》編譯成功qemu-user,那麼這兩個庫就會存在于android ndk目錄下,将這兩個目錄拷貝到裝置的”/system/lib/”目錄下,然後就可以成功運作qemu-user程式。
我在裝置上運作qemu-user的時候出現了标題上顯示的錯誤”fatal: kernel did not supply at_secure”。
解決辦法一
找到”bionic/linker/linker_environ.cpp”檔案,按照下面的代碼修改該檔案:
如果讀者用過git再看上面的代碼就可以很清楚的知道,上面的代碼是運作”git diff”後所顯示内容,代碼做了哪些修改清楚的顯示了出來。如果讀者沒有見過”git diff”指令所顯示的内容,那麼這麼做:找到”-static void __init_at_secure(kernelargumentblock& args) {“這一行,從這行開始(包括這一行)每一行以減号開頭的表示删除該行。
檔案修改完成後在android源碼根目錄運作下面的指令:
. build/envsetup.sh
breakfast hammerhead
mmm <android源碼根目錄>/bionic/linker/
mmm指令用于編譯”<android源碼根目錄>/bionic/linker/”目錄下的源碼,這個目錄下的源碼編譯完成後會生成一個名為”linker”的可執行檔案,這個可執行檔案的生成目錄會在終端上顯示出來,将這個linker覆寫裝置上的”/system/bin/linker”檔案。
覆寫裝置上的”/system/bin/linker”檔案的實際操作中,覆寫需要需要root權限。”/system/bin/linker”檔案覆寫完成以後,它的檔案權限是這樣的:
-rwxr-xr-x root root 91902 2016-05-01 21:50 linker
即linker屬于root使用者,并屬于root使用者組。但是linker原本的權限是下面這樣的:
-rwxr-xr-x root shell 91902 2016-05-01 21:50 linker
即linker屬于root使用者,并屬于shell使用者組。
是以linker覆寫完成後需要執行”chgrp shell /system/bin/linker”指令設定linker的使用者組。
__init_at_secure函數的被調路徑:__linker_init -> __linker_init_post_relocation -> linker_env_init -> __init_at_secure
在qemu源碼目錄下找到”linux-user/elfload.c”檔案,檔案中有create_elf_tables函數,在該函數中找到這一行代碼:
在這行代碼下添加一行代碼:
在該檔案中找到這一行:
将這一行改為:
即在标準的create_elf_tables函數中會添加at_secure這一項。通過閱讀“解決辦法一”可以推斷出,産生”fatal: kernel did not supply at_secure”錯誤是因為找不到at_secure這一項,那麼“解決辦法二”的思路就是在qemu的create_elf_tables函數中添加這一項。
為什麼在qemu的create_elf_tables函數中添加的at_secure項對應的值是0呢?這是因為我圖友善,标準代碼中at_secure項對應的值是函數security_bprm_secureexec(bprm)的傳回值,我發現了解security_bprm_secureexec函數比較麻煩。那麼為什麼是0而不是其他常量值?這是因為在linux系統的終端上輸入下面的指令:
ld_show_auxv=1 ps
- loader_exec -> linux-user/elfload.c - load_elf_binary -> linux-user/elfload.c - create_elf_tables
阿裡聚安全由阿裡巴巴移動安全部出品,面向企業和開發者提供企業安全解決方案,全面覆寫移動安全、資料風控、内容安全、實人認證等次元,并在業界率先提出“以業務為中心的安全”,賦能生态,與行業共享阿裡巴巴集團多年沉澱的專業安全能力。