定位独立的可执行文件和Android

时间:2015-05-28 06:28:31

标签: android linux android-ndk android-5.0-lollipop

我编写了一个.c源代码(在Eclipse中),它使用libcap库来获取与网络流量相关的信息。现在我已经在Eclipse中使用ndk-build创建了可执行二进制文件。我已将libs / armeabi文件夹中创建的二进制文件推送到我的android(rooted nexus 5,Lollipop)的/ data / local /文件夹中,并尝试执行二进制文件。但是android正在抛出这个错误

  

错误:仅支持位置独立可执行文件(PIE)

我对PIE一无所知,请告诉我如何创建与位置无关的可执行文件。

2 个答案:

答案 0 :(得分:18)

  

我对PIE一无所知,请告诉我如何创建与位置无关的可执行文件。

位置独立可执行文件或PIE允许重新定位程序,就像共享对象一样。在程序的每次运行中,程序都可以加载到不同的地址,以使攻击者更难猜出某个程序状态。

您可以通过两种方式之一编译和链接PIE可执行文件。首先,使用-fPIE编译所有内容并与-pie相关联。第二种是用-fPIC编译所有内容并与-pie链接。

如果要构建共享对象和程序,则使用-fPIC编译所有内容。将共享对象与-shared相关联,并将该程序与-pie

相关联

你不能以其他方式做到这一点。也就是说,您无法使用-fPIE编译所有内容并构建共享对象和程序。有关详细信息,请参阅GCC手册中的Code Generation Options

在Android上需要注意的一件事:在4.1之前使用PIE构建将导致/system/bin/linker中的分段错误。 PIE是在Android 4.1上添加的,它崩溃的版本较少。

有人告诉我提供自定义链接/加载程序以避免此问题,但目前我找不到该引用。

另见Security Enhancements in Android 1.5 through 4.1

  

错误:仅支持位置独立可执行文件(PIE)

是的,这是一个棒棒糖功能。请参阅Security Enhancements in Android 5.0

您可以使用readelf检查程序是否使用PIE构建:

$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)

重要的部分是readelf报告 DYN ,而不报告 EXE 即可。 EXE表示它缺少PIE,并且应该触发与安全相关的缺陷。

相关,请参阅Is PIE (Position-independent executable) for main executables supported in Android 4.0 (ICS)?

答案 1 :(得分:4)

我知道这是一个古老的话题,但这种hacky方式可能会节省一些人的时间 使用十六进制编辑器,找到第17个字节,将值02更改为03,就是这样!