安卓逆向3.使用NDK编译c语言可执行程序
1)创建.c文件,我本地存放的路径为【C:\TestNdk\TestNdk.c】,之后给TestNdk.c文件添加以下代码
#include <stdio.h> void Sort(int a[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) { for (j = len - 1; j > i; j--) if (a[j] < a[j - 1]) { temp = a[j - 1]; a[j - 1] = a[j]; a[j] = temp; } } } int main() { int nNumbers[10]; for (int i = 0; i < 10; i++) { printf("请输入第%2d个数:", i + 1); scanf("%d", &nNumbers[i]); } printf("\n\n您输入的数字为:\n"); for (int i = 0; i < 10; i++) { printf("%d ", nNumbers[i]); } Sort(nNumbers, 10); printf("\n\n排序后的结果为:\n"); for (int i = 0; i < 10; i++) { printf("%d ", nNumbers[i]); } printf("\n"); getchar(); }
2)给【C:\TestNdk】路径下增加两个文件,分别是Android.mk和Application.mk
3)Android.mk文件内容如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #会清理除了LOCAL_PATH歪的其他LOCAL文件路径 LOCAL_CFLAGS += -std=c99 #使用c语言c99规范 LOCAL_CFLAGS += -pie -fPIE #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用 LOCAL_LDFLAGS += -pie -fPIE #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用 LOCAL_ARM_MODE := arm #模块指令集 LOCAL_MODULE := TestNdk #模块名称 LOCAL_SRC_FILES := TestNdk.c #源文件名 include $(BUILD_EXECUTABLE) #编译为可执行文件
4)Application.mk文件内容如下
APP_ABI := x86 armeabi-v7a
5)打开cmd切换到路径C:\TestNdk下,并输入命令ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
6)上一步执行完成后,在路径C:\TestNdk下会多出两个文件夹libs和obj
7)其中C:\TestNdk\libs\armeabi文件夹里有个文件名为TestNdk的文件,这就是编译好的elf格式的可执行程序
8)打开雷电模拟器,执行命令adb push C:\TestNdk\libs\armeabi\TestNdk /data/local/tmp 将刚才编译的文件上传到/data/local/tmp目录下
9)依次执行如下命令,查看文件是否发送成功 adb shell su cd /data/local/tmp ls
10)执行命令chmod 777 TestNdk,修改TestNdk文件权限
11)执行命令./TestNdk,此时发现CMD窗口显示的所有中文字符都是乱码
12)上述原因是由于CMD控制台所使用的代码页和TestNdk的代码页不匹配导致的,TestNdk使用的是UTF-8编码,而CMD控制台默认使用的GBK编码!
13)解决上述问题就是修改CMD窗口的默认代码页为UTF-8编码即可,我们新建一个CMD窗口,输入命令chcp 65001,意思是修改CMD的代码页为65001,65001就是UTF-8编码
14)重新依次输入命令 adb shell su cd /data/local/tmp ./TestNdk