我有一些字符串,如“@%SystemRoot%\System32\sensrsvc.dll,-1001”,我知道它们代表 dll 文件中的某个字符串。 在Windows上,我可以使用LoadLibrary加载dll,然后使用LoadString从dll中读取id为1001的字符串。 但是我需要将windows dll和相关字符串从windows设备复制到linux服务器上,并在linux服务器上进行分析,,有什么办法吗?
但是我现在必须在linux上分析这些字符串及其关联的dll,有什么办法吗?
首先,你必须了解Windows中的字符串表是如何工作的以及为什么使用它们:
在Windows中,可以直接在代码中定位字符串:如果编写以下代码:
const char * example = "Hello world!";
...该字符串不存储在字符串表中,您无法使用
LoadString()
访问它。
如果可以使用
LoadString()
访问字符串,则 DLL 的程序员必须显式地将字符串放入字符串表中。
通常,如果程序稍后要翻译成另一种语言,程序员会这样做,因为可以替换字符串表中的字符串,而无需重新编译整个程序。
所以当字符串位于字符串表中时,程序就可以被翻译而无需重新编译。
不会被翻译的字符串被“直接”放入程序中,因此无法使用
LoadString()
访问它们。
在Linux下,这样的字符串(需要翻译的)甚至不存储在与Windows中的EXE或DLL文件对应的文件中,而是存储在一个单独的文件中。
其中许多文件使用二进制
.mo
格式(由 gettext
库使用),其他文件使用 ASCII .po
格式。
因此,如果您想分析
vlc
媒体播放器的字符串(作为示例),则不必分析文件 /usr/bin/vlc
,而是分析文件 /usr/share/locale/de/LC_MESSAGES/vlc.mo
(如果您想查看德语字符串) /usr/share/locale/fr/LC_MESSAGES/vlc.mo
如果您对法语字符串感兴趣。