0%

Android-内存执行ELF研究-替换linker

参考 [原创] Android 内存执行 ELF 研究

环境

1. 小米 12pro
2. 安卓 12
3. 内核 5.10

修改 linker

补充 ld.config.txt

由于是直接编译 linker, 因此可以不修改 ld.config.txt, 完成同样的效果

http://aospxref.com/android-12.0.0_r3/xref/bionic/linker/linker_config.cpp#182

1
2
3
4
5
6
7
8
9
10
186    std::string content;
187 if (!android::base::ReadFileToString(ld_config_file_path, &content)) {
188 if (errno != ENOENT) {
189 *error_msg = std::string("error reading file \"") +
190 ld_config_file_path + "\": " + strerror(errno);
191 }
192 return false;
193 }
194
195 ConfigParser cp(std::move(content));

186 行的 content 就是从 ld.config.txt 读取到的内容,只需要追加 dir.unrestricted = /memfd:/\n 即可

1
2
3
//add extern name,下面的代码加在194行里
std::string s{"dir.unrestricted = /memfd:/\n"};
content=s+content;

修改 access 返回值

http://aospxref.com/android-12.0.0_r3/xref/bionic/linker/linker_config.cpp#242

1
2
3
4
5
242        if (access(value.c_str(), R_OK) != 0) {
243 if (errno == ENOENT) {
244 // no need to test for non-existing path. skip.
245 continue;
246 }

补充一个条件判断就行

1
2
3
4
5
//加在242行下面
std::string memfd_path{"/memfd:"};
if (value.substr(0,7).compare(memfd_path)!=0&&errno == ENOENT) {
continue;
}

最后

把编译好的 linker64 用 zygisk 替换就行,测试用例

https://github.com/PShocker/memexec/releases/tag/1.0