【问题标题】:Trying to make a dll injector in c++, a few errors show up尝试在 C++ 中制作 dll 注入器,出现一些错误
【发布时间】:2020-07-09 16:32:14
【问题描述】:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

DWORD GetProcId(const char* procName)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);

        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!_stricmp(procEntry.szExeFile, procName))
                    {
                        procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));
        }
    }
    CloseHandle(hSnap);
    return procId;
}

int main()
{
    const char* dllPath = "C:\\Users\\%User%\\Desktop\\dll.dll";
    const char* procName = "csgo.exe";
    DWORD procId = 0;

    while (!procId)
    {
        procId = GetProcId(procName);
        Sleep(30);
    }

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, procId);

    if (hProc && hProc != INVALID_HANDLE_VALUE)
    {
        void* loc = VirtualAllocEx(hProc, 0, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

        WriteProcessMemory(hProc, loc, dllPath, strlen(dllPath) + 1, 0);

        HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryA, 
loc, 0, 0);

        if (hThread)
        {
            CloseHandle(hThread);
        }
    }

    if (hProc)
     {
        CloseHandle(hProc);
     }
    return 0;
}

弹出的2个错误:

第一个:

错误(活动)“WCHAR *”类型的 E0167 参数与类型的参数不兼容 "常量字符

第二个:

错误 C2664 'int _stricmp(const char *,const char *)': 无法将参数 1 从 'WCHAR [260]' 到 'const char *'

我是否缺少内含物?

基本上它不会正确运行,这是我得到的唯一 2 个错误,我修复了其他错误。我似乎无法弄清楚这一点。我试过删除一些东西,添加一些东西,但我对包含物知之甚少。如果知道夹杂物的人看到缺少的夹杂物,请告诉我。我在这方面尝试了很多东西。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您应该包含 wchar.h 并使用 wchar_t 而不是 char。 char 通常为 1 个字节,而 wchar 为 2 个字节。

    您可以在此处找到更多详细信息: https://docs.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t?view=vs-2019

    此外,您应该使用:_wcsicmp 而不是 _stricmp 在此处查看更多详细信息:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stricmp-wcsicmp-mbsicmp-stricmp-l-wcsicmp-l-mbsicmp-l?view=vs-2019

    【讨论】:

    • 你能再解释一下吗?我仍然对你的意思感到困惑。你能发回一个例子吗?我包括了 wchar,现在呢?
    • "const char* dllPath" => "const wchar_t* dllPath"。 main 和 GetProcId 中的“procName”相同。 ("const char* procName" => "const wchar_t* procName")。并将 _stricmp 替换为 _wcsicmp '_stricmp(procEntry.szExeFile, procName)' => '_wcsicmp(procEntry.szExeFile, procName)'。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2019-11-10
    • 2012-07-04
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多