DLL 注入编译 "unresolved external symbol" Visual Studio C++
DLL Injection Compilation "unresolved external symbol" Visual Studio C++
我正在为DLL文件编写代码以注入到另一个系统的进程。但是,我在编译时收到以下错误
LNK2001, unresolved external symbol _DLL_TEXT
LNK2001, unresolved external symbol _DLL_InitData
现在我知道此错误意味着我的代码中未定义DLL_TEXT
和DLL_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_TEXT
和DLL_InitData
是在头文件中定义的,并且头文件已正确包含。我什至尝试了以下修复程序,这是我在一个旧的堆栈溢出问题中发现的
配置属性 -> 链接器 ->系统
并将Subsystem
从Windows
更改为Console
,因为据说Visual Studio有时会与链接"混淆"。
任何意见将不胜感激。
注意:上面的代码是我正在处理的代码的"工作示例"(类似的逻辑但不编译 - 给出相同的错误)。
您没有定义那些缺少的符号。您只在头文件中声明了它们。您仍然需要在.cpp文件中定义它们而不使用 extern 关键字,例如
UCHAR DLL_InitData[0x2319];
(它仍然需要在外部"C"中)
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio 2019:插入多个C++风格的单行注释
- Visual Studio Code "undefined reference to `WinMain@16'"
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- Visual Studio中的函数声明和函数定义问题
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- Visual Studio mkl_link_tool.exe链接错误
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 不同的Visual Studio版本中缺少.dll
- 用Visual Studio在C++中嵌入Julia
- Visual Studio 2017循环自动向量化问题
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- Visual Studio在尝试读取resource.txt文件时崩溃
- Visual Studio 2017 不允许我创建 C++ 专用模板