我一直在谷歌上四处寻找,但没有卓有成效的结果。我实际上正在寻找一种导出方法或一些如何获取所有字符串文字的列表,例如
int main(){
const char *p = "Hello";
const char x[] = "World";
}
编译这段代码有没有办法知道“Hello”和“World”?我知道它们在反汇编程序中可用(在 Windows 中使用了一些)。但是是否有一些适当的工具可以实际转储这些字符串或以某种方式导出它们?
我一直在谷歌上四处寻找,但没有卓有成效的结果。我实际上正在寻找一种导出方法或一些如何获取所有字符串文字的列表,例如
int main(){
const char *p = "Hello";
const char x[] = "World";
}
编译这段代码有没有办法知道“Hello”和“World”?我知道它们在反汇编程序中可用(在 Windows 中使用了一些)。但是是否有一些适当的工具可以实际转储这些字符串或以某种方式导出它们?
我不完全明白这个问题。你有一个源文件,当你编译它时,你需要 GCC 告诉你你使用了多少个字符串常量。我对此的解释是否正确?
如果是,您可以告诉 gcc 使用 "gcc -S source_file" 进行编译。这将为您提供 .s 文件,其中包含您定义的字符串常量,与 ".string" 相对。您可以解析此文件中出现的“.string”并获取计数(手动或使用“grep”管道传输到“wc -l”)
如果没有调试信息,您只能知道它们将被简单地放入只读数据区域(可能是.rdata
IIRC 部分)。
linuxstrings
实用程序将查看一个二进制文件,并在给定的长度和编码限制内转储任何可识别的字符串。
为什么你需要 C 代码中的所有字符串常量?(strings
在二进制文件上使用该实用程序可能就足够了)。
为此,您可以自定义 GCC 编译器,例如使用MELT,但这可能需要您几天的时间,我觉得这有点过头了。
您还可以从 GCC 发出汇编代码并解析该汇编代码以获得字符串常量。
当然,您可以标记和解析预处理的表单。
编写一个简单的分词器,它可以识别字符串和注释并忽略其他所有内容。