Android: выполнить двоичный файл из приложенияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: выполнить двоичный файл из приложения

Сообщение Anonymous »

Как следует из названия, я хочу выполнить двоичный файл из моего приложения 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.

Подробнее здесь: https://stackoverflow.com/questions/679 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»