Как следует из названия, я хочу выполнить двоичный файл из моего приложения Android. Я создал двоичный файл с NDK и могу запустить его с оболочкой ADB. Затем я попытался запустить его со временем выполнения, но в разрешении запрещено. Я попробовал разные каталоги и изменяли разрешения на файл. Похоже, что безопасность Android сильно изменилась по сравнению с различными версиями. Это называется записи XOR Execute и имеет смысл. Исключениями из этого являются файлы .apk и .dex. Это должно означать то, что я хочу, невозможно. Еще одним известным приложением, которое может выполнить двоичные файлы, является терминал терминального эмулятора. Кроме того, интересно, что они оба имеют одинаковую производительность, что и оболочка ADB, при выполнении двоичного файла. Поэтому я предположил, что они запускают двоичные файлы над оболочкой. Вместо этого я всегда использовал объект выполнения, к которому можно получить доступ с Java. Кроме того, они использовали собственный код для изменения разрешений на файлы. Это заставляет меня задуматься о том, дает ли использование нативного кода более свободу в отношении этих ограничений. Если нет, то по какой причине они могут выполнить двоичные файлы, и это может быть достигнуто с помощью Java?
static int create_subprocess(JNIEnv *env, const char *cmd, char *const argv[], char *const envp[], int masterFd)
{
// same size as Android 1.6 libc/unistd/ptsname_r.c
char devname[64];
pid_t pid;
fcntl(masterFd, F_SETFD, FD_CLOEXEC);
// grantpt is unnecessary, because we already assume devpts by using /dev/ptmx
if(unlockpt(masterFd)){
throwIOException(env, errno, "trouble with /dev/ptmx");
return -1;
}
memset(devname, 0, sizeof(devname));
// Early (Android 1.6) bionic versions of ptsname_r had a bug where they returned the buffer
// instead of 0 on success. A compatible way of telling whether ptsname_r
// succeeded is to zero out errno and check it after the call
errno = 0;
int ptsResult = ptsname_r(masterFd, devname, sizeof(devname));
if (ptsResult && errno) {
throwIOException(env, errno, "ptsname_r returned error");
return -1;
}
pid = fork();
if(pid < 0) {
throwIOException(env, errno, "fork failed");
return -1;
}
if(pid == 0){
int pts;
setsid();
pts = open(devname, O_RDWR);
if(pts < 0) exit(-1);
ioctl(pts, TIOCSCTTY, 0);
dup2(pts, 0);
dup2(pts, 1);
dup2(pts, 2);
closeNonstandardFileDescriptors();
if (envp) {
for (; *envp; ++envp) {
putenv(*envp);
}
}
execv(cmd, argv);
exit(-1);
} else {
return (int) pid;
}
}
Если я что -то упускаю, и есть какой -то другой трюк, чтобы выполнить двоичные файлы, я также хотел бы услышать это.
Любая помощь и/или понимание очень ценится! Кроме того, бинар не является чем -то сложным. В настоящее время я просто пытаюсь выполнить «Hello World» -Binary.
Как следует из названия, я хочу выполнить двоичный файл из моего приложения Android. Я создал двоичный файл с NDK и могу запустить его с оболочкой ADB. Затем я попытался запустить его со временем выполнения, но в разрешении запрещено. Я попробовал разные каталоги и изменяли разрешения на файл. Похоже, что безопасность Android сильно изменилась по сравнению с различными версиями. Это называется записи XOR Execute и имеет смысл. Исключениями из этого являются файлы .apk и .dex. Это должно означать то, что я хочу, невозможно. Еще одним известным приложением, которое может выполнить двоичные файлы, является терминал терминального эмулятора. Кроме того, интересно, что они оба имеют одинаковую производительность, что и оболочка ADB, при выполнении двоичного файла. Поэтому я предположил, что они запускают двоичные файлы над оболочкой. Вместо этого я всегда использовал объект выполнения, к которому можно получить доступ с Java. Кроме того, они использовали собственный код для изменения разрешений на файлы. Это заставляет меня задуматься о том, дает ли использование нативного кода более свободу в отношении этих ограничений. Если нет, то по какой причине они могут выполнить двоичные файлы, и это может быть достигнуто с помощью Java?[code] static int create_subprocess(JNIEnv *env, const char *cmd, char *const argv[], char *const envp[], int masterFd) { // same size as Android 1.6 libc/unistd/ptsname_r.c char devname[64]; pid_t pid;
fcntl(masterFd, F_SETFD, FD_CLOEXEC);
// grantpt is unnecessary, because we already assume devpts by using /dev/ptmx if(unlockpt(masterFd)){ throwIOException(env, errno, "trouble with /dev/ptmx"); return -1; } memset(devname, 0, sizeof(devname)); // Early (Android 1.6) bionic versions of ptsname_r had a bug where they returned the buffer // instead of 0 on success. A compatible way of telling whether ptsname_r // succeeded is to zero out errno and check it after the call errno = 0; int ptsResult = ptsname_r(masterFd, devname, sizeof(devname)); if (ptsResult && errno) { throwIOException(env, errno, "ptsname_r returned error"); return -1; }
if (envp) { for (; *envp; ++envp) { putenv(*envp); } }
execv(cmd, argv); exit(-1); } else { return (int) pid; } } [/code] Если я что -то упускаю, и есть какой -то другой трюк, чтобы выполнить двоичные файлы, я также хотел бы услышать это. Любая помощь и/или понимание очень ценится! Кроме того, бинар не является чем -то сложным. В настоящее время я просто пытаюсь выполнить «Hello World» -Binary.