gpt4 book ai didi

c++ - 已在 *.obj 中定义

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:13 26 4
gpt4 key购买 nike

我正在做一些函数来帮助制作钩子(Hook)。我想将这些功能留在一个文件中,并在需要时包含它。

我不知道它是否有效,但这不是问题所在。当我编译时,我得到这个错误。我认为导入是错误的。

错误:

1>noxHook.obj : error LNK2005: "unsigned long tpAddr" (?tpAddr@@3KA) already defined in Hook.obj
1>noxHook.obj : error LNK2005: "void __cdecl StopHook(struct cHook)" (?StopHook@@YAXUcHook@@@Z) already defined in Hook.obj
1>noxHook.obj : error LNK2005: "void __cdecl StartHook(struct cHook)" (?StartHook@@YAXUcHook@@@Z) already defined in Hook.obj
1>noxHook.obj : error LNK2005: "struct cHook __cdecl SetupHook(unsigned long,void *,void * *)" (?SetupHook@@YA?AUcHook@@KPAXPAPAX@Z) already defined in Hook.obj
1>noxHook.obj : error LNK2005: "void __cdecl tpHook(void)" (?tpHook@@YAXXZ) already defined in Hook.obj
1>C:\Users\JorgeFranzon\Documents\Visual Studio 2008\Projects\Hook\Release\Hook.dll : fatal error LNK1169: one or more multiply defined symbols found

Hook .cpp:

#include "noxHook.cpp"


int(*tFunc)(int a, int b) = NULL;

int hkFunc(int a, int b)
{
printf("\n Hook: Original parameters: %d and %d\n", a, b);
return tFunc(98, 99);
}

void Main()
{
struct cHook hk1 = SetupHook(0x4016B0, hkFunc, &(PVOID&)tFunc);
StartHook(hk1);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
Main();
break;
}
return TRUE;
}

noxHook.cpp:

#include <windows.h>
#include <stdio.h>

#define Naked __declspec( naked )

extern DWORD tpAddr = 0;

struct cHook
{
BYTE newBytes[6];;
BYTE oldBytes[6];
DWORD fromAddr;
LPVOID toAddr;
};

Naked void tpHook()
{
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;

__asm PUSH tpAddr;
__asm RET;
}

struct cHook SetupHook(DWORD fromAddr, LPVOID toAddr, LPVOID *oAddr)
{
struct cHook tmpHook;
tmpHook.fromAddr = fromAddr;
tmpHook.toAddr = toAddr;

DWORD oldProt;
VirtualProtect((void*)fromAddr, 6, PAGE_EXECUTE_READWRITE, &oldProt);

tmpHook.newBytes[0] = 0x68;
memcpy(&tmpHook.newBytes[1], &toAddr, 4);
tmpHook.newBytes[5] = 0xC3;

memcpy(&tmpHook.oldBytes[0], &fromAddr, 6);

tpAddr = fromAddr + 6;
memcpy(&tpHook, &tmpHook.oldBytes[0], 6);

*oAddr = tpHook;


return tmpHook;
}

void StartHook(struct cHook tmpHook)
{
memcpy((void*)tmpHook.fromAddr, (void*)&tmpHook.newBytes, 6);
}

void StopHook(struct cHook tmpHook)
{
memcpy((void*)tmpHook.fromAddr, tmpHook.oldBytes, 6);
}

最佳答案

为了更好的理解:

您很可能会遇到多重定义错误,因为您同时针对同一文件#include并进行链接。

解决这个问题的标准方法是拆分接口(interface)和实现,将声明放在#include定义 到您编译和链接的 .cpp 文件中。

对于您的示例,这可能看起来像:

钩子(Hook).cpp

#include "noxHook.hpp"


int(*tFunc)(int a, int b) = NULL;

int hkFunc(int a, int b)
{
printf("\n Hook: Original parameters: %d and %d\n", a, b);
return tFunc(98, 99);
}

void Main()
{
struct cHook hk1 = SetupHook(0x4016B0, hkFunc, &(PVOID&)tFunc);
StartHook(hk1);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
Main();
break;
}
return TRUE;
}

noxHook.cpp

#include <stdio.h>
#include "noxHook.hpp"

extern DWORD tpAddr = 0;

Naked void tpHook()
{
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;
__asm NOP;

__asm PUSH tpAddr;
__asm RET;
}

struct cHook SetupHook(DWORD fromAddr, LPVOID toAddr, LPVOID *oAddr)
{
struct cHook tmpHook;
tmpHook.fromAddr = fromAddr;
tmpHook.toAddr = toAddr;

DWORD oldProt;
VirtualProtect((void*)fromAddr, 6, PAGE_EXECUTE_READWRITE, &oldProt);

tmpHook.newBytes[0] = 0x68;
memcpy(&tmpHook.newBytes[1], &toAddr, 4);
tmpHook.newBytes[5] = 0xC3;

memcpy(&tmpHook.oldBytes[0], &fromAddr, 6);

tpAddr = fromAddr + 6;
memcpy(&tpHook, &tmpHook.oldBytes[0], 6);

*oAddr = tpHook;


return tmpHook;
}

void StartHook(struct cHook tmpHook)
{
memcpy((void*)tmpHook.fromAddr, (void*)&tmpHook.newBytes, 6);
}

void StopHook(struct cHook tmpHook)
{
memcpy((void*)tmpHook.fromAddr, tmpHook.oldBytes, 6);
}

noxHook.hpp

#include <windows.h>

#define Naked __declspec( naked )

struct cHook
{
BYTE newBytes[6];;
BYTE oldBytes[6];
DWORD fromAddr;
LPVOID toAddr;
};

Naked void tpHook();
struct cHook SetupHook(DWORD fromAddr, LPVOID toAddr, LPVOID *oAddr);
void StartHook(struct cHook tmpHook);
void StopHook(struct cHook tmpHook);

关于c++ - 已在 *.obj 中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com