【问题标题】:DLL Injection with C++使用 C++ 进行 DLL 注入
【发布时间】:2020-03-06 04:18:50
【问题描述】:
#include <Windows.h>
HANDLE h = OpenProcess(PROCESS_CREATE_THREAD, FALSE, 34808); //Creating a remote thread 
int main() {
    LPVOID path = "MessageBoxDLL.dll";
    CreateRemoteThread(h, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, path, 0, NULL);
}

当我尝试运行我的代码时,它返回错误“无法从 const char 转换为 lpvoid”我有点迷茫,为什么它不让我给它一个有效的路径,甚至为什么它需要转换我的值。我玩了更多,但找不到任何可行的解决方案。 https://i.stack.imgur.com/Ne0bp.png

【问题讨论】:

  • 显然该功能(您不知道它是哪一个)想要更改您的const charconst char对你来说很重要还是你介意让它可变?
  • @TedLyngmo 它是可变的
  • 不,不是根据编译器。显示完整的错误消息并指向您显示的代码中的确切行。
  • @TedLyngmo i.stack.imgur.com/Ne0bp.png 抱歉
  • Ted 想说的是,字符串文字被认为是“const”,它的内容不会传递给签名不能保证它不会改变它的函数。因此,CreateThread 期望 void* 期望线程函数可以做它想做的事情。因此,编译器禁止从const char* 转换为非常量void*。你当然可以用const_cast 抛弃这种不变性,但这不是你唯一的问题。您认为远程进程将如何处理来自另一个进程的地址变量?它不会指向你认为的字符串!

标签: c++ dll dll-injection


【解决方案1】:

为什么要转换为 LPVOID?因为你告诉它。让我们修剪一下,注意错误仍然存​​在:

int main() {
    void* x = "characters";
}

错误 C2440:“正在初始化”:无法从“const char [11]”转换为“void *”

我想说清楚,我只是在回答这个问题。我对代码的其余部分不做任何声明。

通常,旧样式转换被认为是不好的做法,但是对于期望 void* 的旧样式函数,请使用它:

#include <Windows.h>
int main() {
    const char *path = "MessageBoxDLL.dll";
    HANDLE h = OpenProcess(PROCESS_CREATE_THREAD, FALSE, 34808); //Creating a remote thread 
    CreateRemoteThread(h, NULL, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, (LPVOID)path, 0, NULL);
}

由于该函数不进行任何类型检查,因此您需要自己传递正确的参数。文档和示例代码应该会有所帮助。强制转换为 void* 对于操作系统线程函数是有意义的,因为操作系统不知道您将要传递什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多