2015年1月24日 星期六

build native c/c++ program in android phone/pad

像我這麼喜歡 c/c++ 的程式員, 要我用 java 寫程式, 還真的有點不爽。我想用 c/c++ 寫 android native 程式, 先來看看結果。


root_android
 1 /data/data # ls -l hello
 2 -rw-r----- root     root         6160 2015-01-22 08:44 hello
 3 /data/data # chmod 755 hello
 4 /data/data # ls -l hello
 5 -rwxr-xr-x root     root         6160 2015-01-22 08:44 hello
 6 /data/data # ./hello
 7 hello android
 8
 9 /data/data # ls
10 ml.android.dictlite
11 org.qtproject.example.dirview
12 org.videolan.vlc.betav7neon
13 os.tools.scriptmanager
14 the.pdfviewer3
15 tw.bluezz.m
16 tw.com.books.android.plus
17 tw.ebookservice.voler
18 tw.goodlife.a_gas
19 tw.taaze.yaimmreader
20 tw.taaze.zekea
21 web.oss.sshsftpDaemon


root_android L7 成功印出 hello android, 爽阿! 我的方法需要 root, 沒有 root 的朋友可以參考這篇:
Building and running native code utilities on Android without ADB or rooting

首先得下載 android ndk, 用裡頭的 compiler 來建構出 native c code。

再來就是這個 makefile, 這是參考 android 及 arm 原生語言逆向工程破解 android app 一書 7.1.2.1 使用 gcc 編譯器手動編譯

簡體中文原文版本: Android软件安全与逆向分析

如果台灣的繁體版本製作的不好, 我傾向買原文簡體版本; 350nt vs 590nt, 台灣出版社得拿出品質來讓讀者買單。這本品質算是中規中矩, 但看看售價, 讀者們得考慮一下值不值得為繁體中文的版本多付 240 nt。

一個使用中國術語的繁體中文翻譯書籍, 不值得多花一塊錢購買。

本書內容紮實, 解釋了apk 裡頭的東西, 以及 dalvik 的執行檔格式, 怎麼編譯 native c code, 示範如何破解 qt, c#, native, java 寫的 android app, 如何保護自己寫的 android app, 有心在此領域的朋友, 應該要珍藏一本。

回到主題, 熟悉這種開發模式的人應該看得出來, 最主要是設定 inc path, link library, 不過 makefile L14 比較特別, 需要手動 link 這兩個檔案。這是產生 c native code 的重點, google 是故意找我們麻煩, 因為使用 jni 來 link c library, 只要能產生 c library 就好了。

makefile
 1 # ref: android 及 arm 原生語言逆向工程破解 android app 一書 7.1.2.1 使用 gcc 編譯器手動編譯
 2 NDK_ROOT=/home/descent/and-dev/android-ndk-r10
 3 TOOLCHAINS_ROOT=/home/descent/and-dev/android-ndk-r10/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86
 4 TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi-
 5 TOOLCHAINS_INC=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.8/include-fixed
 6 
 7 PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-17/arch-arm
 8 PLATFORM_INC=$(PLATFORM_ROOT)/usr/include/
 9 PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib/
10 
11 #FLAGS=-static -I$(TOOLCHAINS_INC) -I$(PLATFORM_INC) -L$(PLATFORM_LIB) -nostdlib -lgcc -Bdynamic -lc
12 FLAGS=-I$(TOOLCHAINS_INC) -I$(PLATFORM_INC) -L$(PLATFORM_LIB) -nostdlib -lgcc -Bdynamic -lc
13 
14 OBJS=$(PLATFORM_LIB)/crtbegin_dynamic.o $(PLATFORM_LIB)/crtend_android.o
15 #OBJS=$(PLATFORM_LIB)/crtbegin_static.o $(PLATFORM_LIB)/crtend_android.o
16 
17 hello: hello.o
18  $(TOOLCHAINS_PREFIX)gcc $(FLAGS) $(OBJS) $< -o $@
19 hello.o: hello.c
20  $(TOOLCHAINS_PREFIX)gcc -c $< $(FLAGS)
21 
22 clean:
23  rm -rf *.o hello

很容易就編出 dynamic 的版本,

descent@debianlinux:android_compile$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

困難的是怎麼執行這個 elf 執行檔。

我的作法是把這個檔案搬到 /data/data 下, 沒 root 的話, 這件事情不容易做到, 書上是使用 adb 來觀察執行結果, 但我還是希望看到程式在終端機下執行, 比較能確定成功了。

我使用了 ssh 來連入 android phone, 這個 ssh server 不但需要 root 還需要 busybox, 再來就用 sftp protocol 傳到 android phone。

root ssh server busybox

我很開心的 chmod 755 hello, 結果一直得到

ash: ./hello: Permission denied

原來 sd card 分割區無法將權限設定為執行, 移動到 /data/data 下之後就沒問題了。當然要寫 android app 還是要用 java, 這純粹是自 high 用的。

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。