سؤال
أحتاج إلى الكتابة إلى ملف قابل للتنفيذ يتم تنفيذها، لكن لا يمكنني فتحه للكتابة. علي سبيل المثال:
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int fd = open(argv[0], O_RDWR);
if (fd == -1) perror(NULL);
return 0;
}
٪ Unname -RS FreeBSD 8.0-Stable٪ ./example_etxtbsy ملف نصي مشغول
هناك بعض التفسيرات ما هي هيك etxtbsy في لينكس، ولكن مع ذلك، هل من الممكن تجنب هذا الخطأ؟
ملاحظة
أنا لا أحاول كتابة فيروس.
المحلول
إذا كنت تحاول استبدال ملف تنفيذ، على عكس تعديل قابل للتنفيذ على الطاير، فيمكنك إلغاء ربط () أولا ثم افتحه للكتابة.
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
unlink(argv[0]);
int fd = open(argv[0], O_RDWR|O_CREAT, S_IRWXU|S_IRWXG|S_IRWXO);
if (fd == -1) perror(NULL);
return 0;
}
إذا كنت تحاول الوصول إلى العملية الجارية الفعلية، فإن أفضل رهان هو ptrace ().
(تحرير لإضافة أجزاء الوضع.)
لا تنتمي إلى StackOverflow