Уже определено в * .obj

0

Я выполняю некоторые функции, чтобы облегчить создание крючков. Я хочу оставить эти функции в файле и включить его, когда вам это нужно.

Я не знаю, работает ли это, но это не проблема. Когда я компилирую, я получаю эту ошибку. Я считаю, что ошибочно импортировать.

Ошибка:

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);
}
  • 0
    Где объявлен tpAddr . Смотрите использование extern
  • 2
    Почему вы #, включая .cpp файл?
Показать ещё 7 комментариев
Теги:
visual-c++
assembly

1 ответ

2

Для лучшего понимания:

Скорее всего, вы получили ошибки с множественным определением, потому что вы оба #include и связывали с одним и тем же файлом.

Стандартный способ исправить это состоит в том, чтобы разделить ваш интерфейс и реализацию, помещая объявления в защищенный заголовочный файл, который вы #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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню