سؤال

أحتاج إلى الكتابة إلى ملف قابل للتنفيذ يتم تنفيذها، لكن لا يمكنني فتحه للكتابة. علي سبيل المثال:

#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 ().

(تحرير لإضافة أجزاء الوضع.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top