【问题标题】:c++ win32 DLL - need to dynamically load a base64 string (very strange!)c++ win32 DLL - 需要动态加载base64字符串(很奇怪!)
【发布时间】:2014-11-04 15:34:43
【问题描述】:

首先,对不起,如果标题不是很准确,我不知道如何将我的问题放在一个句子中。

我面临的问题是我有一个 win32 DLL,它需要动态加载二进制文件并对其进行处理(二进制文件位于 base64 字符串中,然后 DLL 对其进行解码并写入磁盘) .

理论上很简单。然而,问题来了:

  1. 我尝试通过外部程序将字符串放入资源中。那行得通,并且确实出现在资源中(根据重新破解),但是当我尝试从 DLL 内部访问它时,它不起作用。是的,我知道您需要 DLL 本身的 hInstance,而不是来自包含它的可执行文件,但它也不起作用。

  2. 我还尝试从另一个源加载字符串(我尝试了文件、URL 甚至注册表),但是每当我将它保存在变量中时,程序就会崩溃(“X 停止工作”消息),我我假设加载 DLL 的程序没有清除足够的 RAM 来存储那个额外的变量。

最后但并非最不重要的一个额外说明:我无权访问包含 DLL 的程序的源代码(我正在或多或少地编写一个插件),所以我也无法传递参数。

我真的希望有人能帮助我摆脱这个困境。

编辑:根据要求编写代码

方法一:从资源中加载base64字符串

HMODULE handle = itsamee; // "itsamee" was set in DllMain
HSRC hResa = FindResource(handle, MAKEINTRESOURCE(IDR_PEFILE), "BASICFILE"); // IDR_PEFILE is 300
if(hResa == 0)
    printf("FAIL"); // it ALWAYS prints "FAIL" ...

.rc 文件:

#include "resource.h" // there it just defines IDR_PEFILE and includes <windows.h>
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
IDR_PEFILE BASICFILE "app.txt"

方法二:从注册表加载base64字符串

HKEY hkey;
RegOpenKeyEx(root, key, 0, REG_READ, &hkey); // "root" is "HKEY_CURRENT_USER" and "key" is "software\\microsoft\\windows\\currentversion\\run"
DWORD type = REG_EXPAND_SZ;
DWORD cbData;
RegQueryValueEx(hkey, name, NULL, &type, NULL, &cbData);
char* value = new char[cbData];
RegQueryValueEx(hkey, name, NULL, &type, (LPBYTE)&value, &cbData); // "name" is "pefile"
RegCloseKey(hkey);
// now here I had two lines of code. the first one is:
printf("Okay"); // it would always print "Okay"
// this is the second version:
printf("Okay, value is %s", value); // it wouldn't print this, instead I'd get the "X stopped working" error
std::vector<char> dec = base64_decode(value); // this would never happen, "stopped working", regardless of which printf was called before

【问题讨论】:

  • 代码,否则它从未发生过。或者,更正式地说,当开发人员描述他的实现时,他从未提及他引入错误的那段代码。为了帮助自己获得更好的帮助,请发布不会产生预期结果的代码。
  • 对于注册表版本,尝试为value分配一个额外的字节并用零填充。
  • 您还应该显示 .rc 文件中定义资源的几行。
  • 那是因为value[cbData+1] 越界了。请改用value[cbData]
  • 好的,想通了。而不是(LPBYTE)&amp;value 使用(LPBYTE)value。否则,您将写入指针本身,而不是它指向的缓冲区,并且由于字符串几乎肯定比您获得 UB 的指针大。附言您还没有将 .rc 代码添加到问题中。

标签: c++ winapi dll base64 ram


【解决方案1】:

错误是(LPBYTE)&amp;value 使函数写入指针而不是缓冲区本身。它必须更改为(LPBYTE)value。感谢 Mark Ransom 的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-09-18
    相关资源
    最近更新 更多