3.1 Java层Exec修改
修改方式和难易程度
1. 修改 Java 层
位置:libcore/ojluni/src/main/java/java/lang/ProcessImpl.java 目的:可以更方便地调整命令处理逻辑,适合添加高级功能或参数预处理。 修改难度:低
Java 层逻辑简单,影响面有限,但可能受 Native 实现限制。 修改代码
ini
// Only for use by ProcessBuilder.start()
static Process start(String[] cmdarray,
java.util.Map<String,String> environment,
String dir,
ProcessBuilder.Redirect[] redirects,
boolean redirectErrorStream)
throws IOException
{
assert cmdarray != null && cmdarray.length > 0;
// Convert arguments to a contiguous block; it's easier to do
// memory management in Java than in C.
byte[][] args = new byte[cmdarray.length-1][];
int size = args.length; // For added NUL bytes
// 新增这部分替换逻辑
String[] keywords = {"frida", "xposed", "magisk", "lsposed"};
String[] replaceKeywords = {"fffff", "xxxxx", "mmmmm", "llllll"};
for (int i = 0; i < cmdarray.length; i++) {
for (int j = 0; j < keywords.length; j++) {
if (cmdarray[i].contains(keywords[j])) {
java.lang.System.logE("Samuel Detected ["+cmdarray[i]+"] keyword: " + keywords[j] + " in command. Replacing with: " + replaceKeywords[j]);
cmdarray[i] = cmdarray[i].replace(keywords[j], replaceKeywords[j]);
} else if (cmdarray[i].equals("su") || cmdarray[i].endsWith("/su") || cmdarray[i].endsWith(" su")) {
java.lang.System.logE("Samuel Detected ["+cmdarray[i]+"] keyword: su in command. Replacing with: xu");
cmdarray[i] = cmdarray[i].replace("su", "xu");
}
}
}
2. 修改 Native 层
位置:libcore/ojluni/src/main/native/UNIXProcess_md.c 目的:可以调整底层命令的调用方式或参数传递机制,例如在 exec 函数调用前对路径或参数进行校验或修改。 修改难度:中
涉及 JNI 和系统调用的桥接代码,需要确保对参数进行正确转换。 不修改
3. 修改底层 exec 系列函数
位置:C 标准库实现(通常为 glibc 或其他库,非直接控制的代码)。 目的:直接修改或替换 execv、execvp、execve 的实现逻辑。 修改难度:高
涉及系统级别的核心函数,修改成本高,可能影响其他使用 exec 系列函数的程序。 通常不建议直接修改,而是通过拦截或代理(如 inlineHook 技术)实现定制。 修改代码 (不推荐真机上使用,性能差太多,容易卡机,死机。但可以在模拟器作为沙盒分析)
不同函数的修改难易程度
| 函数 | 调用方式 | 修改难度 |
|---|---|---|
| execv | 接受绝对路径和参数数组,不会搜索 PATH。 | 中等 |
| execvp | 基于 PATH 环境变量搜索可执行文件。 | 中等 |
| execve | 更底层的接口,需显式传递环境变量数组。 | 高 |
推荐修改路径
- 如果修改逻辑是高层次的(如添加功能或安全验证),优先选择 Java 层或 Native 层实现。
- 如果需要对底层调用进行重大更改,建议通过代理拦截
exec系列函数,而非直接修改底层实现。