Как strace читает имя файла системного вызова sys_open? - PullRequest
4 голосов
/ 21 марта 2012

Я пишу программу, которая использует Ptrace и выполняет следующие действия:

  • Она читает текущий eax и проверяет, является ли системный вызов sys_open.
  • Если это так, то янужно знать, какие аргументы передаются.

    int sys_open (const char * имя файла, const int mode, const int mask)

Таким образом, eax = 5 подразумевает, что это открытый системный вызов
Я узнал, что у ebx есть адрес расположения файла из этого Вопрос Но как узнать длину имени файла, чтобы я мог прочитать содержимое в этом месте?
Я наткнулся наследующие вопросы, которые касаются одного и того же
Вопрос 1
Вопрос 2 (Этот вопрос только мой!)
Но я так и не нашел решение своей проблемы.проблема.:( так как оба ответа не были ясны. Я все еще получаю ошибку сегментации, когда я пробую подход в Вопросе-1
Вы можете проверить мой код здесь
Так что теперь я действительно былинтересно, как strace извлекает эти значения так красиво: (

1 Ответ

4 голосов
/ 21 марта 2012

Как вы знаете, sys_open() не получает размер имени файла в качестве параметра. Однако в стандарте говорится, что буквенная строка должна заканчиваться символом \0. Это хорошая новость, потому что теперь мы можем выполнить простой цикл итерации по символам строки, и когда мы находим символ \0 (NULL), мы знаем, что достигли его конца.

Это стандартная процедура, вот как strlen() делает это, а также как strace делает это!

C пример:

#include <stdio.h>

int main()
{
    const char* filename = "/etc/somefile";

    int fname_length = 0;
    for (int i = 0; filename[i] != '\0'; i++)
    {
        fname_length++;
    }

    printf("Found %d chars in: %s\n", fname_length, filename);

    return 0;
}

Возвращаясь к своей задаче, вы должны получить доступ к адресу filename и выполнить процедуру, которую я только что описал. Это то, что вам придется сделать, и другого пути нет.

...