Mac 上安裝so黑盒測試工具 Unicorn

0、 啥玩意

Unicorn (The ultimate CPU emulator) ,能夠簡單理解爲,能夠在電腦上運行任意cpu 架構 指令 的一個框架。html

對我來講,一個打包好的apk裏面的動態庫,也就是libxxx.so 是沒辦法直接在pc環境下調用的。可是藉助這工具就能夠了。java

一、 安裝框架

官網提供好幾種安裝方式。源碼編譯安裝,homebrew安裝,等等。。。python

當前環境 Mac Pro 10.14.4,因此能夠直接經過homebrew安裝git

$ brew install unicorngithub

這樣的話,其實unicorn 的核心框架就安裝好了,這時候能夠直接編寫c代碼調用。可是若是想要用其餘語言須要用其餘語言對應的包裝器。bash

官網文檔說經過homebrew安裝的軟件會安裝在他本身的目錄下面,若是想要被別的應用可以引用到的話須要導出:架構

$ export DYLD_LIBRARY_PATH=/usr/local/opt/unicorn/lib/:$DYLD_LIBRARY_PATH框架

個人理解是須要配置環境變量,可是如今我沒有配置,依然能用,不知道爲啥?函數

官網的文檔裏面說的若是是用Python的就很簡單了,若是用Python的上面的步驟都省了,直接 pip install unicorn (可能mac和Linux須要root權限運行)。貌似這樣安裝的話 unicorn 的核心已經嵌入到了Python庫裏面,可是若是經過編譯Python代碼的方式安裝的話須要提早安裝 unicorn 的核心。也就是上面經過homebrew安裝的。工具

至於java的話,須要在安裝了核心庫的基礎上,再編譯一個包裝庫(官方叫作bindings),而後咱們本身開發的話須要調用這個包裝器(bindings)。看sample裏面的代碼吧。Source archive

二、運行官方c代碼sample

官網地址

壓縮文件地址

能夠下載這個壓縮包。而後進入到目錄

$ make ## 命令行輸入
##而後會看到打印以下信息
cc  test1.c -L/usr/local/Cellar/glib/2.44.1/lib -L/usr/local/opt/gettext/lib -lglib-2.0 -lintl  -lpthread -lm -lunicorn -o test1

$ ./test1  ## 命令行輸入,調用編譯好的可執行文件
Emulate i386 code
Emulation done. Below is the CPU context
>>> ECX = 0x1235
>>> EDX = 0x788f
複製代碼
2.1 編譯過程的一個錯誤

當我運行make的時候獲得以下錯誤:

cc  test1.c -L/usr/local/Cellar/glib/2.58.3/lib -L/usr/local/opt/gettext/lib -lglib-2.0 -lintl -Wl,-framework -Wl,CoreFoundation -pthread -lm -lunicorn -o test1
ld: warning: directory not found for option '-L/usr/local/opt/gettext/lib'
ld: library not found for -lintl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [test1] Error 1
複製代碼

大概的意思是說找不到 /usr/local/opt/gettext/lib 這個路徑,緣由是我電腦上沒有安裝 gettext 的這個工具,參考文章

解決辦法,安裝這個庫。而後就能夠了。

$ brew install gettext

PS:只談安裝沒什麼卵用,接下來經過一個列子分析一下,通常來講Android apk 裏面的動態庫都是 arm架構的,這個動態庫是不能直接在電腦上調用的,咱們經過這個框架來實現調用。調用一個沒有源碼的arm架構的so庫裏面的函數。想要調用so的裏面的函數,須要先把so反彙編

3. bing python

安裝官網提示,不管我用Python2.7 執行 pip install unicorn 仍是 Python 3.x 執行 pip3 install unicorn 都會不斷的獲得以下錯誤,大概意思是找不到,libunicorn.dylib 可是這個lib是經過homebrew安裝的,在 /usr/local/opt/unicorn/lib/ 路徑下面,我最後也沒搞清楚爲啥找不到??????

不斷的提示錯誤:

ERROR: pthread check failed
       Make sure to have the pthread libs and headers installed.

make[1]: *** [qemu/config-host.h-timestamp] Error 1
error: [Errno 2] No such file or directory: 'libunicorn.dylib'
make: *** [install3] Error 1
複製代碼

而後我下載了,他的Python庫的源碼,而後想經過源碼的方式安裝 wiki

For Python users (this must be done after installing the core as above) cd bindings/python; sudo make install

可是我依然獲得這個錯誤,而後我去他的setup.py 查看源碼邏輯。而後搜一下這個'libunicorn.dylib'在哪裏用到了。

# check if a prebuilt library exists
    # if so, use it instead of building
    #看這段的邏輯,說要判斷這兩個文件是否存在,若是存在就copy到Python的編譯環境裏面,我去看了一下發現不存在,
    #LIBRARY_FILE=unicorn-1.0.1/bindings/python/prebuilt/libunicorn.dylib
    #STATIC_LIBRARY_FILE=unicorn-1.0.1/bindings/python/prebuilt/libunicorn.a
    #而後我手動把 /usr/local/opt/unicorn/lib/ 目錄裏面的文件copy過來而後就能安裝了
    if os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE)) \
            and os.path.exists(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE)):
        shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', LIBRARY_FILE), LIBS_DIR)
        shutil.copy(os.path.join(ROOT_DIR, 'prebuilt', STATIC_LIBRARY_FILE), LIBS_DIR)
        return
        
複製代碼

而後安裝官網的教程運行:$ sudo make install3

之因此用install3,是由於我電腦上用的Python3

相關文章
相關標籤/搜索