DLL 注入编译 "unresolved external symbol" Visual Studio C++

DLL Injection Compilation "unresolved external symbol" Visual Studio C++

本文关键字:Visual Studio C++ symbol unresolved 注入 编译 DLL external      更新时间:2023-10-16

我正在为DLL文件编写代码以注入到另一个系统的进程。但是,我在编译时收到以下错误

LNK2001, unresolved external symbol _DLL_TEXT
LNK2001, unresolved external symbol _DLL_InitData

现在我知道此错误意味着我的代码中未定义DLL_TEXTDLL_InitData,但事实并非如此。我在头文件中定义了它们,并将其包含在文件中。我已经重写了代码的问题部分并将其发布在下面。我不确定这里的问题是什么...

头文件:文件.h

#if !defined(HEADER_FILE)
#define HEADER_FILE
#if _MSC_VER > 1000
#pragma once
#endif
extern "C"
{
#include <windows.h>
__declspec(align(16)) extern UCHAR DLL_TEXT[0x11000];
extern UCHAR DLL_InitData[0x2319];
}
extern HMODULE g_hDLL;
BOOL DLL_Init();
BOOL DLL_LoadLibrary();
BOOL DLL_FreeLibrary();
void* __stdcall DLL_RVA(DWORD rvaAddr);
#endif

主文件:文件.cpp

#include "stdafx.h"
#include "file.h"
HMODULE g_hDLL;
BOOL(WINAPI *DLL_DllEntryPoint)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);
void* __stdcall DLL_RVA(DWORD rvaAddr)
{
if (rvaAddr == 0)
return g_hDLL;
if (rvaAddr >= 0x1000 && rvaAddr < 0x12000)
return &DLL_TEXT[rvaAddr - 0x1000];
return NULL;
}
BOOL DLL_Init()
{
HMODULE hDll;
DWORD oldProtect;
void(*fInitData)(void*);
g_hDLL = GetModuleHandle(0);
oldProtect = PAGE_EXECUTE_READWRITE;
VirtualProtect(DLL_TEXT, sizeof(DLL_TEXT), PAGE_EXECUTE_READWRITE, &oldProtect);
hDll = ::LoadLibraryA("KERNEL32.dll");
if (!hDll)
return FALSE;
*(FARPROC*)DLL_RVA(0x12000) = ::GetProcAddress(hDll, "FuncName");
hDll = ::LoadLibraryA("USER32.dll");
if (!hDll)
return FALSE;
*(FARPROC*)DLL_RVA(0x12120) = ::GetProcAddress(hDll, "Func2Name");
if (!*(FARPROC*)DLL_RVA(0x12120))
return FALSE;
*(FARPROC*)&fInitData = (FARPROC)&DLL_InitData[0];
fInitData(DLL_RVA);
VirtualProtect(DLL_TEXT, sizeof(DLL_TEXT), oldProtect, NULL);
*(FARPROC*)&DLL_DllEntryPoint = (FARPROC)DLL_RVA(0x327C);
return TRUE;
}

正如您在代码中看到的,数组DLL_TEXTDLL_InitData是在头文件中定义的,并且头文件已正确包含。我什至尝试了以下修复程序,这是我在一个旧的堆栈溢出问题中发现的

项目 -> 属性 ->

配置属性 -> 链接器 ->系统

并将SubsystemWindows更改为Console,因为据说Visual Studio有时会与链接"混淆"。

任何意见将不胜感激。

注意:上面的代码是我正在处理的代码的"工作示例"(类似的逻辑但不编译 - 给出相同的错误)。

您没有定义那些缺少的符号。您只在头文件中声明了它们。您仍然需要在.cpp文件中定义它们而不使用 extern 关键字,例如

UCHAR DLL_InitData[0x2319];

(它仍然需要在外部"C"中)