是否有一种简单的方法可以从跨结构的Go二进制文件中提取所有字符串?
Go的问题是字符串存储时没有空终止符,因此您不能简单地使用“ strings”命令。 ://github.com/CarveSystems/gostringsr2-使用对字符串部分的引用(通过使用radare2)提取字符串。但是此方法不能100%起作用并且会弄乱一些字符串,因为存在间接引用等。
https://github.com/strazzere/golang_loader_assist/blob/master/golang_loader_assist。 py-通过在字符串部分搜索“ lea” /“ mov”指令来提取字符串。但是此方法仅适用于x86体系结构。
是否存在更通用,更正确的方法来从Go编译的二进制文件中提取字符串?
评论
Go的本机文本编码是什么?对于7位ASCII,请查找字节数> =空格和=空间的字节。不成对的替代品是一个标志,毕竟它不太可能是UTF-16。在所有情况下,保真度都比查找以零结尾的字符串低。
@hippietrail我认为本机编码是ASCII,但是问题是GO将其保存为没有空终止符的字符串。所以您只能找到一个巨大的字符串,而我想按原样逐个提取这些字符串br />
据此,GO对字符串使用UTF-8。如果您不想自己拆分blob并且字符串不终止,那么似乎没有“简便方法”,直到知道所有体系结构的人使用您提到的工具之类的原理编写了统一的工具。同时,您也许可以使用Ghidra分析二进制文件。 Ada Pro当然也可以做一些事情。但是它们比您似乎要查找的要重,并且不会总是找到每个字符串。
您引用了项目golang_loader_assist,它仅支持x86。如果您想提交用于更新golang使用的非x86模式的is_string_load()的PR,我会很乐意接受并应用它们。 AFAIK,没有“简单”的方法可以做到这一点,这就是为什么我诉诸这种方法。长度优先于对字符串的调用,这很重要,因为此后没有空字节。