Нужна помощь в определении параметров __isoc9_scanf () - PullRequest
0 голосов
/ 30 марта 2020

У меня есть какой-то C код, который я пытаюсь понять, который использует функцию __isoc99_scanf(). Я никогда не сталкивался с этой функцией раньше. Я посмотрел его, и оказалось, что это какая-то разновидность scanf(). Это код:

__isoc99_scanf(&DAT_00400d18,local_78,(undefined4 *)((long)puVar3 + 4));

&DAT_00400d18 - это строка C, содержащая значение "%s". local_78 - массив данных неизвестного типа. puVar3 - это указатель, который указывает на последний элемент этого массива.

Что меня действительно смущает, так это почему у вызова функции есть три параметра? Я знаю, что scanf() принимает два параметра: первый - строка формата. Второй - это адрес памяти, в который сохраняется дата. Однако __isoc99_scanf() здесь вызывается с тремя параметрами. Я не могу понять, почему третий параметр там. Первый параметр &DAT_00400d18 - это просто "%s", что говорит о том, что вторым параметром является область памяти, в которой нужно сохранить эту строку. Но зачем вам третий параметр, даже если он не указан в строке формата?

Это не мой код, я его не писал. На самом деле это разобранная версия кода сборки для конкретного приложения, которую я пытаюсь отладить. Но я никогда не видел __isoc99_scanf() раньше, потому что я использовал scanf() только в своем собственном коде.

1 Ответ

0 голосов
/ 30 марта 2020

Когда вы компилируете scanf, компилятор автоматически переводит его в функцию __isoc99_scanf в lib c. Если вы скомпилируете этот код:

#include <stdio.h>

int main() {
    char buf[32];
    scanf("%32s", buf);
    return 0;
}

и декомпилируете в GHIDRA, вы получите:

__isoc99_scanf(&DAT_001007b4,local_38);

, где DAT_001007b4 - "% 32s", а local_38 - буфер. Он ведет себя точно так же, как обычно scanf. При использовании GHIDRA следует помнить одну важную вещь: она не знает точно, сколько аргументов должна ожидать функция, поэтому, если функции передается слишком много аргументов, как в вашем случае, вы должны просто игнорировать дополнительные аргументы, так как код тоже будет.

...