如何通过id从windows库中读取字符串,如linux上的winapi LoadString

e7arh2l6  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(105)

我有一些字符串,如“@%SystemRoot%\System32\sensrsvc.dll,-1001”,我知道它们代表dll文件中的某个字符串。在windows上,我可以使用LoadLibrary加载dll,然后使用LoadString从dll中读取id为1001的字符串。但是我需要把windows设备上的windows dll和相关字符串复制到linux服务器上,然后在linux服务器上分析,有什么办法吗?

clj7thdc

clj7thdc1#

但是我现在必须在linux上分析这些字符串及其相关的dll,有什么办法吗?

首先,你必须了解Windows中字符串表是如何工作的,以及为什么要使用它们:

在Windows中,可以直接在代码中找到字符串:如果你写了下面的代码:

const char * example = "Hello world!";

字符串
...该字符串存储在字符串表中,无法使用LoadString()访问。
DLL的程序员必须显式地将字符串放入字符串表中,如果该字符串可以使用LoadString()访问。
通常,如果程序稍后将被翻译成另一种语言,则程序员这样做,因为字符串表中的字符串可以被替换而无需重新编译整个程序。
因此,当字符串位于字符串表中时,程序可以在不重新编译的情况下进行翻译。
不会被翻译的字符串被“直接”放入程序中,因此不能使用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
复制windows dll
...你想写一个从WindowsDLL文件读取字符串的Linux程序?
旧版Windows DLL/EXE文件中,LoadString()读取的字符串直接存储在DLL或EXE文件中。
较新的Windows文件中,操作方式与Linux类似:这些字符串存储在一个名为.mui的单独文件中。
示例:mlang.dll的德语字符串存储在C:\Windows\System32\de-DE\mlang.dll.mui中; ...\iexplore.exe的德语字符串存储在...\de-DE\iexplore.exe.mui中。
因此,如果您想从“新”DLL或EXE文件中读取字符串,则必须将“.mui”文件复制到Linux机器上,而不是“实际”DLL文件。
.mui文件本身似乎是DLL文件,而且似乎总是32位DLL文件(即使相应的DLL或EXE文件是64位DLL或EXE文件)。
就像Windows没有任何阅读Linux文件的功能一样,Linux也没有任何读取Windows文件的功能。
所以你必须自己写一个解析DLL/EXE文件的函数。这不是很难,但是,这是一个很大的工作.
(...特别是如果您希望同时支持32位和64位DLL文件。)
另一种方法是使用winewine是一个程序套件,允许您在Linux上运行(许多,但不是全部)Windows程序。也许你的Windows程序(调用LoadString())使用wine工作。

相关问题