吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5968|回复: 7
收起左侧

[Android 原创] Android逆向基础笔记—Android NDK开发2之Windows及L下的gcc手动编译(交叉连编译)

[复制链接]
牵走天涯 发表于 2016-11-2 20:53
本帖最后由 牵走天涯 于 2016-11-2 20:55 编辑

一、交叉工具链
这些工具都在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,大家可以按自己的习惯。记事本都可以。



[C] 纯文本查看 复制代码
#include <stdio.h>
void main(){
       printf("Hello,you are successful !");
}





三、编写makefile

注意:1.斜杠的方向(千万不要弄反了,这个很重要!!!)
            2.把我makefile中 的//以及后面的内容删除!
            3.一定记得先配置环境
最后给这个makefile文档
[Asm] 纯文本查看 复制代码
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如下

[Asm] 纯文本查看 复制代码
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的。
命令是
sorgs@sorgs-VirtualBox:/home/tools/gccNDKtest$ sudo make

这个就说明编译成功了。
因为我这Linux是虚拟机,所以不好用手机真是去测试
所以手续的测试就在Windows上测试的,效果和上面的一样。

六、总结
虽然看起来这很简单,但是实际上自己不去动手,永远不知道这点点东西来的多么艰辛,各种百度查。
其实这个还遗留了一个问题。本来说好的NDK用gcc编译,是可以编译C++的,但是我写了一个C++。不管怎么修改makefile都要报错。这个问题我查了很多资料,都没有结果。我在想等下,有空了,去问问我们的老师,看看能不能给出答案。如果可以的话,再回来更新,编写一个C++的代码尝试编译。
然后就是Linux,我的天啊。我之前都没有学过这个,然后为了写出来来尝试,才开始研究。各种报错,各种重装。
你不去动手,永远不知道这里面的辛酸和晚上连续几天熬夜到12点的汗水以及成功之后的喜悦。
所以说,不要看着简单,要实际去做做!

链接:http://pan.baidu.com/s/1boNj4IF 密码:w4ec



Android逆向基础笔记—Android NDK开发2之Windows下的gcc手动编译(交叉连编译)和利L.doc

264.56 KB, 下载次数: 27, 下载积分: 吾爱币 -1 CB

文档

免费评分

参与人数 7热心值 +7 收起 理由
lmpy + 1 鼓励转贴优秀软件安全工具和文档!
mishlin + 1 谢谢@Thanks!
a5606495 + 1 我很赞同!
玩世不攻 + 1 我很赞同!
ZMZwise + 1 谢谢@Thanks!
ShadowY + 1 我很赞同!
初亦泽 + 1 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ShadowY 发表于 2016-11-2 21:10
菜鸟路过!~~~~
palard 发表于 2016-11-2 21:13
ZMZwise 发表于 2016-11-2 21:19
DEF_dove 发表于 2016-11-2 21:29
看看这个学习学习
weiguobinbupt 发表于 2016-11-10 15:00
都是比较基础的东西!
s19996 发表于 2016-11-11 13:08
很精辟,一目了然。
devilrrt1013 发表于 2016-11-30 10:46

很精辟,一目了然。谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-9 03:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表