Closed w296488320 closed 1 year ago
My idea is very simple: to modify the parameters before the execve is executed. For example, replace (stat-f /) like this command line with (cat my own file), but now it seems to have a problem in the before entrance of svc, I modify it in the case in the enter.cpp execve, but it never works. I don t know what s wrong the modified code is the code above.
Hi great developers, I had a problem recently about the execve parameter replacement. My requirement is to replace and modify (parameter 1) and (parameter 2) before some execve commands execute. But I refer to the proroot code now and it doesn t seem to take effect. If the parameters are not modified, the program will print the content normally, but if the parameter is modified, the program will not print any information. I tried to reconstruct the logic of enter.c in execve, which is the code I modified:
//int execve(const char *pathname, char *const argv[], char *const envp[]);
case SC_execve: {
status = 0;
if (getRuntimeIsFinsh()) {
char org_path_buff[PATH_MAX];
get_sysarg_path(tracee, org_path_buff, SYSARG_1);
ArrayOfXPointers *args_array;
fetch_array_of_xpointers(tracee, &args_array, SYSARG_2, 0);
string orig_args, orig_cmd_path(org_path_buff);
size_t args_count = args_array->length;
for (size_t i = 0; i < args_count - 1; i++) {
char *arg_str;
read_xpointee_as_string_t(tracee, args_array, i, &arg_str);
if (i != 0) {
orig_args.append(" ");
}
orig_args.append(arg_str);
}
//get mock value
auto handler_info = ZhenxiRunTime::handlerExecve::handler(orig_args);
if (handler_info.isHandler) {
//set cmd path
set_sysarg_path(tracee, handler_info.cmd_path.c_str(), SYSARG_1);
vector<string> new_args_list = handler_info.args;
resize_array_of_xpointers(args_array, 0, (ssize_t) (new_args_list.size() + 1));
for (size_t i = 0; i < new_args_list.size(); i++) {
write_xpointee(args_array, i, new_args_list[i].c_str());
}
//nullptr
write_xpointee(args_array, new_args_list.size(), nullptr);
//set args
status = push_array_of_xpointers_t(tracee, args_array, SYSARG_2);
if (status < 0) {
LOGE("svc execve error push_array_of_xpointers %d", status);
break;
}
}
}
break;
}
This is the code that I tested, and the main purpose is to replace the return value of [stat-f /], with [cat my_file_path]
const char *logcatPath = "/system/bin/stat";
const char *logcatArgs[] = { "stat", "-f", "/", nullptr,"111","222" };
int pipefd[2];
if (pipe(pipefd) == -1) {
LOGE("pipe error")
return;
}
pid_t pid = fork();
if (pid < 0) {
LOGE("fork");
return;
} else if (pid == 0) {
close(pipefd[0]);
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
close(pipefd[1]);
//int ret = (int)syscall(__NR_execve,logcatPath, (char *const *)logcatArgs, nullptr);
int ret = execve(logcatPath, (char *const *)logcatArgs, nullptr);
if (ret < 0) {
LOGE("test execve error ret < 0 %s ", strerror(errno))
_exit(EXIT_FAILURE);
}
LOGE("test execve success ret %d",ret)
} else {
close(pipefd[1]);
char buffer[1024];
ssize_t bytesRead;
//read
while ((bytesRead = read(pipefd[0], buffer, sizeof(buffer) - 1)) > 0) {
buffer[bytesRead] = '\0';
LOGE("test execve printf -> %s", buffer)
//break;
}
close(pipefd[0]);
int status;
waitpid(pid, &status, 0);
}
The problem now is that as long as I make a parameter modification and replacement
LOGE("test execve printf -> %s", buffer)
This log will not be printed, the program does not have any translation, if it is ok, I tried to change the stat command to [cat my_file_path] or [sh-c 'cat my_file_path'], I don't know how to solve this problem. Can you help me with something? Great developer
Hi great developer, I'm using execve enter.cpp to modify execve parameters, such as replacing some of the original command line content with mine, like the original sh-c stat-f / like this command line with my sh-c cat & lt; my file path & gt; but unfortunately now prompt me at Socket operation on non-socket, I don't know why that. Here is my test code:
Here is the code for which I modify the execve parameter.
I don't know why this problem occurs. Can you give me some help?