1. 程式人生 > >Android逆向基礎筆記—Android NDK開發2之Windows下的gcc手動編譯(交叉連編譯)和利Linux Ubuntu系統下的交叉工具鏈手動編譯

Android逆向基礎筆記—Android NDK開發2之Windows下的gcc手動編譯(交叉連編譯)和利Linux Ubuntu系統下的交叉工具鏈手動編譯

一、交叉工具鏈

這些工具都在NDK的路徑下:E:\Android\android-ndk-r13\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin

這些工具的字首均為arm-linux-androideabi,可以直接使用他們來編寫NDK原生程式

Windows和Linux平臺使用的gcc都是一樣的,命令引數也是一樣的:

arm-linux-androideabi-addr2line  //將程式地址轉換為檔名和行號

arm-linux-androideabi-ar  // 建立、修改、提取歸檔檔案

arm-linux-androideabi-as  //gas彙編器

arm-linux-androideabi-c++  //工具鏈中arm-linux-androideabi-g++.exe的一個拷貝

arm-linux-androideabi-c++filt  //聯結器使用它過濾符號,防止過載函式衝突

arm-linux-androideabi-cpp  //C++程式編譯工具

arm-linux-androideabi-g++  //C++程式編譯工具

arm-linux-androideabi-gcc-4.9.x //工具鏈中arm-linux-androideabi-gcc.exe的一個拷貝

arm-linux-androideabi-gcc  //C程式編譯工具

arm-linux-androideabi-gcov  //程式覆蓋度測量工具,記錄程式碼的執行路徑

arm-linux-androideabi-gdb  //除錯工具

arm-linux-androideabi-gprof  //程式效能測量工具

arm-linux-androideabi-ld  //聯結器,用於生成可執行程式

arm-linux-androideabi-nm  //列出目標檔案中的符號

arm-linux-androideabi-objcopy  //複製目標檔案中的內容到另一種型別的目標檔案中

arm-linux-androideabi-objdump  //輸出目標檔案的資訊

arm-linux-androideabi-ranlib  //產生歸檔檔案索引,並將其儲存到這個歸檔檔案中

arm-linux-androideabi-readelf  //顯示elf格式可執行檔案的資訊

arm-linux-androideabi-run  //ARM程式模擬器

arm-linux-androideabi-size  //列出目標檔案每一段的大小及總體的大小

arm-linux-androideabi-strings  //輸出目標檔案的可列印字串

arm-linux-androideabi-strip  //去除目標檔案中的符號資訊

以上摘錄之《Android軟體安全與逆向分析》

二、編寫C++程式

我這裡習慣使用VS2012,大家可以按自己的習慣。記事本都可以。


#include <stdio.h>
void main(){
       printf("Hello,you are successful !");
}


三、編寫makefile

注意:1.斜槓的方向(千萬不要弄反了,這個很重要!!!)

            2.把我makefile中 的//以及後面的內容刪除!

            3.一定記得先配置環境

最後給這個makefile文件

NDK_ROOT=E:/Android/android-ndk-r13
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.9.x/include-fixed

PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-17/arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/include
PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib

MODULE_NAME=HelloNDK
RM=del

FLAGS=-I$(TOOLCHAINS_INCLUDE) \
	-I$(PLATFORM_INCLUDE) \
	-L$(PLATFORM_LIB) \
	-nostdlib \
	-lgcc \
	-Bdynamic \
	-lc

OBJS=$(MODULE_NAME).o \
	$(PLATFORM_LIB)/crtbegin_dynamic.o \
	$(PLATFORM_LIB)/crtend_android.o

all:
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
	$(RM) *.o
install:
	adb push $(MODULE_NAME) /data/local/
	adb shell chmod 755 /data/local/$(MODULE_NAME)

四、編譯

我們把這些東西弄好了放到桌面上的資料夾gccNDKtest。

然後cmd命令開啟這個資料夾

然後make

看到是這個樣子,就說明沒有問題了


接下來,我們需要看效果,就需要一個Android的手機或者模擬器了。

依次輸入

make install

adb shell /data/local/HelloNDK

就可以看到效果圖了


五、Linux

和Windows差不多,重點是環境需要配置好

我直接把Windows裡面的C放進去,再編寫makefile

makefile如下

NDK_ROOT=/home/tools/android-ndk-r13
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.9.x/include-fixed

PLATFORM_ROOT=$(NDK_ROOT)/platforms/android-17/arch-arm
PLATFORM_INCLUDE=$(PLATFORM_ROOT)/usr/include
PLATFORM_LIB=$(PLATFORM_ROOT)/usr/lib

MODULE_NAME=HelloNDK
RM=rm -rf

FLAGS=-I$(TOOLCHAINS_INCLUDE) \
	-I$(PLATFORM_INCLUDE) \
	-L$(PLATFORM_LIB) \
	-nostdlib \
	-lgcc \
	-Bdynamic \
	-lc

OBJS=$(MODULE_NAME).o \
	$(PLATFORM_LIB)/crtbegin_dynamic.o \
	$(PLATFORM_LIB)/crtend_android.o

all:
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODULE_NAME).c -o $(MODULE_NAME).o
	$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODULE_NAME)
clean:
	$(RM) *.o
install:
	adb push $(MODULE_NAME) /data/local/
	adb shell chmod 755 /data/local/$(MODULE_NAME)

然後放到Linux下面去,到這個檔案的目錄下make就OK的。

命令是

[email protected]:/home/tools/gccNDKtest$ sudo make


這個就說明編譯成功了。

因為我這Linux是虛擬機器,所以不好用手機真是去測試

所以手續的測試就在Windows上測試的,效果和上面的一樣。

六、總結

雖然看起來這很簡單,但是實際上自己不去動手,永遠不知道這點點東西來的多麼艱辛,各種百度查。

其實這個還遺留了一個問題。本來說好的NDK用gcc編譯,是可以編譯C++的,但是我寫了一個C++。不管怎麼修改makefile都要報錯。這個問題我查了很多資料,都沒有結果。我在想等下,有空了,去問問我們的老師,看看能不能給出答案。如果可以的話,再回來更新,編寫一個C++的程式碼嘗試編譯。

然後就是Linux,我的天啊。我之前都沒有學過這個,然後為了寫出來來嘗試,才開始研究。各種報錯,各種重灌。

你不去動手,永遠不知道這裡面的辛酸和晚上連續幾天熬夜到12點的汗水以及成功之後的喜悅。

所以說,不要看著簡單,要實際去做做!

連結:http://pan.baidu.com/s/1boNj4IF 密碼:w4ec