如何通过 id 从 Windows 库(如 Linux 上的 winapi LoadString)读取字符串

问题描述 投票:0回答:1

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

linux windows winapi dll
1个回答
0
投票

但是我现在必须在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
如果您对法语字符串感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.