我有一些字符串,如“@%SystemRoot%\System32\sensrsvc.dll,-1001”,我知道它们代表dll文件中的某个字符串。在windows上,我可以使用LoadLibrary加载dll,然后使用LoadString从dll中读取id为1001的字符串。但是我需要把windows设备上的windows dll和相关字符串复制到linux服务器上,然后在linux服务器上分析,有什么办法吗?
clj7thdc1#
但是我现在必须在linux上分析这些字符串及其相关的dll,有什么办法吗?
首先,你必须了解Windows中字符串表是如何工作的,以及为什么要使用它们:
在Windows中,可以直接在代码中找到字符串:如果你写了下面的代码:
const char * example = "Hello world!";
字符串...该字符串未存储在字符串表中,无法使用LoadString()访问。DLL的程序员必须显式地将字符串放入字符串表中,如果该字符串可以使用LoadString()访问。通常,如果程序稍后将被翻译成另一种语言,则程序员这样做,因为字符串表中的字符串可以被替换而无需重新编译整个程序。因此,当字符串位于字符串表中时,程序可以在不重新编译的情况下进行翻译。不会被翻译的字符串被“直接”放入程序中,因此不能使用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文件。)另一种方法是使用wine:wine是一个程序套件,允许您在Linux上运行(许多,但不是全部)Windows程序。也许你的Windows程序(调用LoadString())使用wine工作。
.mo
gettext
.po
vlc
/usr/bin/vlc
/usr/share/locale/de/LC_MESSAGES/vlc.mo
/usr/share/locale/fr/LC_MESSAGES/vlc.mo
.mui
mlang.dll
C:\Windows\System32\de-DE\mlang.dll.mui
...\iexplore.exe
...\de-DE\iexplore.exe.mui
wine
1条答案
按热度按时间clj7thdc1#
但是我现在必须在linux上分析这些字符串及其相关的dll,有什么办法吗?
首先,你必须了解Windows中字符串表是如何工作的,以及为什么要使用它们:
在Windows中,可以直接在代码中找到字符串:如果你写了下面的代码:
字符串
...该字符串未存储在字符串表中,无法使用
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文件。)
另一种方法是使用
wine
:wine
是一个程序套件,允许您在Linux上运行(许多,但不是全部)Windows程序。也许你的Windows程序(调用LoadString()
)使用wine
工作。