ptrace %edx для sys_open несовместим

Я пытаюсь получить имя файла из системного вызова sys_open, используя ptrace. Я получаю указатель пути к файлу и могу получить правильные данные по этому адресу, однако мне нужен способ узнать, сколько данных нужно получить, т.е. длину имени файла. Я думал, что это значение должно быть в edx, но здесь это не так. Есть предположения?

        orig_eax = ptrace(PTRACE_PEEKUSER, child, 4 * ORIG_EAX, NULL);
        if(orig_eax == __NR_open){
            ptrace(PTRACE_GETREGS, child, NULL, &regs);
            if(regs.eax > 0){                    
                filepath = (char *)calloc((regs.edx+1), sizeof(char));
                getdata(child, regs.ebx, filepath, regs.edx);

                printf("Open eax %ld ebx %ld ecx %ld filepath %s\n",regs.eax, regs.ebx, regs.ecx, filepath);

                free(filepath);
            }
        } 

Пример вывода:

Open eax 3 ebx 2953895 edx 438 filepath /etc/localtime
Open eax 3 ebx 143028320 edx 384 filepath /var/log/vsftpd.log
Open eax 4 ebx 2957879 edx 438 filepath /etc/nsswitch.conf
Segmentation Fault

Просто edx:

edx 438
edx 384
edx 438
//seg fault here
edx -1217013808
edx 0
edx 143035796
edx 0
edx 0

person ofosho    schedule 30.03.2011    source источник


Ответы (1)


Мне всегда нравится проверять таблицу системных вызовов Linux для подобных ситуациях, а затем эту страницу для получения более подробной информации.

Дело в том, что для sys_open %edx не сохраняет длину имени файла. В нем хранятся права доступа к файлам.

Единственный способ узнать длину имени файла — после получения имени файла и передачи его функции strlen(), которая вернет размер строки.

person karlphillip    schedule 30.03.2011
comment
@karlphillip, вторая ссылка, которую вы дали, потрясающая. Я искал что-то подобное все утро. Однако я понимаю strlen, не могли бы вы объяснить, как мне получить имя файла, с которым нужно быть? Как узнать, сколько раз вызывать POKEDATA? - person ofosho; 30.03.2011
comment
Здорово! Для нас также важно, чтобы вы просмотрели ответы и приняли тот, который решил вашу проблему. Удачи. - person karlphillip; 30.03.2011
comment
извини @karlphillip, только что изменил мой комментарий. Не могли бы вы взглянуть еще раз? - person ofosho; 30.03.2011
comment
Я буду рад сделать это в другой теме, потому что на эту уже ответили, и ваш новый вопрос оправдывает создание новой темы. Просто чтобы в следующий раз вы сделали это правильно, где POKEDATA в вашем коде? Я не знаю, что ты имеешь в виду. Вы можете задать столько вопросов, сколько хотите. Но не лезь в свою ветку, ладно? - person karlphillip; 30.03.2011
comment
Между прочим, этот туториал показался мне весьма проясняющим: linuxjournal.com/article/6100 ?страница=0,0 - person karlphillip; 30.03.2011
comment
@karlphillip, твоя точка зрения понятна. Я следил за этим руководством, откуда я получил функцию getdata. Я добавлю новый вопрос и отправлю вам комментарий. Спасибо. - person ofosho; 30.03.2011
comment
@karlphillip: я столкнулся с аналогичной проблемой, которую я опубликовал [stackoverflow.com/questions/9799373/ Можете взглянуть?? - person kidd0; 21.03.2012