天天看點

在Android上使用qemu-user運作可執行檔案

<b></b>

<b>在android上使用qemu-user運作可執行檔案</b>

尋禹@阿裡聚安全

<b>前言</b>

qemu簡要介紹:

    qemu-user的main函數源碼在檔案”linux-user/main.c”中。

設定前提

本文研究的qemu使用者模式的可執行檔案運作在(android &amp; 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”檔案,按照下面的代碼修改該檔案:

在Android上使用qemu-user運作可執行檔案
在Android上使用qemu-user運作可執行檔案

如果讀者用過git再看上面的代碼就可以很清楚的知道,上面的代碼是運作”git diff”後所顯示内容,代碼做了哪些修改清楚的顯示了出來。如果讀者沒有見過”git diff”指令所顯示的内容,那麼這麼做:找到”-static void __init_at_secure(kernelargumentblock&amp; args) {“這一行,從這行開始(包括這一行)每一行以減号開頭的表示删除該行。

檔案修改完成後在android源碼根目錄運作下面的指令:

    . build/envsetup.sh

breakfast hammerhead

mmm &lt;android源碼根目錄&gt;/bionic/linker/

mmm指令用于編譯”&lt;android源碼根目錄&gt;/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 -&gt; __linker_init_post_relocation -&gt; linker_env_init -&gt; __init_at_secure

在qemu源碼目錄下找到”linux-user/elfload.c”檔案,檔案中有create_elf_tables函數,在該函數中找到這一行代碼:

在Android上使用qemu-user運作可執行檔案

在這行代碼下添加一行代碼:

在該檔案中找到這一行:

在Android上使用qemu-user運作可執行檔案

将這一行改為:

在Android上使用qemu-user運作可執行檔案
在Android上使用qemu-user運作可執行檔案

即在标準的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 -&gt; linux-user/elfload.c - load_elf_binary -&gt; linux-user/elfload.c - create_elf_tables

阿裡聚安全由阿裡巴巴移動安全部出品,面向企業和開發者提供企業安全解決方案,全面覆寫移動安全、資料風控、内容安全、實人認證等次元,并在業界率先提出“以業務為中心的安全”,賦能生态,與行業共享阿裡巴巴集團多年沉澱的專業安全能力。

繼續閱讀