参考 [原创] 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
| 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 245 continue; 246 }
|
补充一个条件判断就行
1 2 3 4 5
| 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