我有一些C代码,我正在尝试理解它们,它们使用了函数__isoc99_scanf()
。我以前从来没有遇到过这个函数。我查了一下,发现它是scanf()
的某种变体。代码如下:
__isoc99_scanf(&DAT_00400d18,local_78,(undefined4 *)((long)puVar3 + 4));
&DAT_00400d18
是一个包含值"%s"
的C字符串。local_78
是未知数据类型的数组。puVar3
是指向该数组的最后一个元素的指针。
真正让我困惑的是为什么这个函数调用有三个参数?我知道scanf()
有两个参数:第一个是格式字符串。第二个参数是保存日期的内存地址。然而,这里的__isoc99_scanf()
是通过三个参数调用的。我不明白为什么第三个参数在那里。第一个参数&DAT_00400d18
就是"%s"
,这表明第二个参数是保存该字符串的内存位置。但是,当第三个参数甚至没有在格式字符串中指定时,为什么还需要它呢?
这不是我的代码,不是我写的。实际上,它是我正在尝试调试的特定应用程序的汇编代码的反汇编版本。但我以前从未见过__isoc99_scanf()
,因为我只在自己的代码中使用了scanf()
。
发布于 2020-03-29 21:59:53
当您编译libc时,编译器会自动将其转换为scanf
中的__isoc99_scanf
函数。如果你编译这段代码:
#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时要记住的一件重要的事情是,它不知道一个函数应该期望多少个参数,所以如果一个函数传入了太多的参数,就像你的例子一样,你应该忽略额外的参数,因为代码也会这样做。
https://stackoverflow.com/questions/60920923
复制相似问题