[Assault Cube] Проблемы с созданием тригербота (CodeCave)

Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2016
Сообщения
28
Реакции[?]
3
Поинты[?]
0
Не могу сделать кодкейв 3 дня бошку себе ебу с этим и не понимаю в чем проблема то краши то еще что главная проблема не могу понять логику работы самого кодейва но чтобы был хороший старт для этого надо сделать что то что работает так вот что мне от вас требуется если вы хотите мне помочь
1. Хорошие зарубежные видосы
2. Хорошие русские видосы если таковые имеются
3. Объяснить почему ошибок много при сборке проекта и есть ли смысл использовать pragma warning ( disable : ) ( не знаю сработает ли оно тут вообще или нет не до конца понимаю работу этой функции но так или иначе хотелось бы избежать использования подобных штук )
4. Так же по возможности какую нибудь литературу
5. Разобрать мой сурс
6. Либо же скинуть свой чтобы я по нему что либо сделал

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

дополню в игре все адреса статические так что с адресами траблов точно не может быть если я конечно не упал ебалом в клавиатуру лишний раз

При компиляции такие ошибки

AssaultCube\AssaultCube\main.cpp(103,27): error C2488: 'cavedata::caveFunc': 'naked' can only be applied to non-member function definitions
AssaultCube\AssaultCube\main.cpp(106,1): error C2415: improper operand type
AssaultCube\AssaultCube\main.cpp(110,1): error C2400: inline assembler syntax error in 'opcode'; found '('
AssaultCube\AssaultCube\main.cpp(111,1): error C2400: inline assembler syntax error in 'opcode'; found '.'
AssaultCube\AssaultCube\main.cpp(112,1): error C2400: inline assembler syntax error in 'opcode'; found '.'
AssaultCube\AssaultCube\main.cpp(113,1): error C2400: inline assembler syntax error in 'opcode'; found '('
AssaultCube\AssaultCube\main.cpp(115,1): error C2181: illegal else without matching if
AssaultCube\AssaultCube\main.cpp(116,5): error C2065: 'input': undeclared identifier
AssaultCube\AssaultCube\main.cpp(117,5): error C2146: syntax error: missing ';' before identifier 'input'
AssaultCube\AssaultCube\main.cpp(117,5): error C2065: 'input': undeclared identifier
AssaultCube\AssaultCube\main.cpp(118,5): error C2146: syntax error: missing ';' before identifier 'SendInput'
AssaultCube\AssaultCube\main.cpp(118,19): error C2065: 'input': undeclared identifier
AssaultCube\AssaultCube\main.cpp(119,4): error C2143: syntax error: missing ';' before '}'
AssaultCube\AssaultCube\main.cpp(123,1): error C2415: improper operand type
AssaultCube\AssaultCube\main.cpp(126,2): error C2059: syntax error: '}'
AssaultCube\AssaultCube\main.cpp(126,1): error C2143: syntax error: missing ';' before '}'
AssaultCube\AssaultCube\main.cpp(131,2): error C2143: syntax error: missing ';' before '{'
AssaultCube\AssaultCube\main.cpp(131,2): error C2447: '{': missing function header (old-style formal list?)

СУРС лишний скорее всего именно ошибки в том что просто нет реализации в мейне, но хотелось бы почитать как бы именно вы реализовали это
По возможности напишите пожалуйста как бы вы реализовали перехват функции прицела , нужен ли вообще для этого именно кодкейв? и можно ли как то иначе?. ( Но хотелось бы именно кодкейвом интересная штука ) вот как выглядит в иде эта функция

Screenshot_117.png



SOURCE:

C++:
#define _CRT_SECURE_NO_WARNINGS

#include "inc.h"


using namespace std;

typedef int (__cdecl* __edi_val)(HANDLE hProc, DWORD, DWORD, UINT);

HANDLE hProc;
DWORD pId;


DWORD attachProc(const char* procName)
{

    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof(pEntry);

    HANDLE hSnapProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


    while (Process32Next(hSnapProc, &pEntry))
    {
        if (!strcmp((char*)pEntry.szExeFile, procName))
        {
            hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pEntry.th32ProcessID);
            cout << "hProc: " << hProc << endl;
            pId = pEntry.th32ProcessID;
            CloseHandle(hSnapProc);
            return pId;
        }
    }

    
}


DWORD getModuleBase(DWORD pId, const char* pName)
{
    
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(MODULEENTRY32);

    HANDLE hSnapModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32, pId);

    if (hSnapModule == INVALID_HANDLE_VALUE)
    {
        cout << "Failed to get snap of module " << endl;
        return false;
    }


    while (Module32Next(hSnapModule, &mEntry))
    {
        if (!strcmp((char*)mEntry.szModule, pName))
        {
            cout << "hSnapModule:    " << hSnapModule << endl;
            CloseHandle(hSnapModule);
            return (DWORD)mEntry.modBaseAddr;
        }
    }
}


DWORD CalcPtr(HANDLE hProc, DWORD ptr, vector <unsigned int> offsets)
{
    DWORD addr = ptr;

    for (unsigned int i = 0; i < offsets.size(); i++)
    {
        ReadProcessMemory(hProc, (LPVOID)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

template <class data_type>
data_type wpm(data_type addr, DWORD value)
{
    WriteProcessMemory(hProc, (LPVOID)addr, &value, sizeof(data_type), 0);
}

template<class data_type>
data_type rpm(data_type address)
{
    data_type buffer;
    ReadProcessMemory(hProc, (LPVOID)address, &buffer, sizeof(data_type), 0);
    return buffer;
}


class cavedata
{
public:

    DWORD ori_call_address = 0x4607C0;
    DWORD ori_jump_address = 0x0040ADA2;
    DWORD edi_val = 0;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;

    __declspec(naked) DWORD  caveFunc()
    {
        __asm {
            call ori_call_address
            pushad
            mov edi_value, eax

            if (edi_value != 0) {
                input.type = INPUT_MOUSE;
                input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
                SendInput(1, &input, sizeof(INPUT));
            }
            else {
                input.type = INPUT_MOUSE;
                input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
                SendInput(1, &input, sizeof(INPUT));
            }

            _asm {
                popad
                jmp ori_jump_address
            }
        }
    }

};

    DWORD __cdecl RemoteThread(cavedata* cData)
    {
        __edi_val TriggerVal = (__edi_val)cData->caveFunc();
        TriggerVal(NULL, cData->ori_call_address, cData->ori_jump_address, MB_ICONINFORMATION);
        return EXIT_SUCCESS;
    }

    int main()
    {


        DWORD pId = attachProc("ac_client.exe");

        DWORD mBase = getModuleBase(pId, "ac_client.exe");

        cout << hex << "Pid " << pId << endl;


        cout << hex << "Mbase " << mBase << endl;

        vector <unsigned int> oHPoff = { 0xF8 };

        DWORD hpBase = 0x00109B74;

        DWORD basehpaddr = mBase + hpBase;
        DWORD baseaddr = CalcPtr(hProc, basehpaddr, oHPoff);



    }

Дополнение: 1. менял языковой стандарт с 14 по последнюю Screenshot_115.png

2. Пихал crt хуйню в препроцессор Screenshot_116.png

3. Копипастил дохуя кода из других видосов но видимо не смог адаптировать

и немного о том как я вообще что то узнаю ведь я онли копипаст и говорить мне смысла нет даже один хуй ебанат
скажу сразу что я просто ищу готовое решение дальше уже по нему пытаюсь узнать логику работы этого всего ведь если изучать то что не работает ну такое себе сами понимаете поэтому мне надо что то что работает после чего уже буду лезть в тонкости базы если так можно выразиться xD но нужен начальный толчок хотя бы, спасибо за выслушивание моего сочинения просто накипело конкретно так
 
Пользователь
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
98
Реакции[?]
46
Поинты[?]
0
Попробуй вот этот код
C++:
#include <Windows.h>

DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;

INPUT input = { 0 };
DWORD edi_value = 0;

// Our codecave that program execution will jump to. The declspec naked attribute tells the compiler to not add any function
// headers around the assembled code
__declspec(naked) void codecave() {
    // Asm blocks allow you to write pure assembly
    // In this case, we use it to call the function we hooked and save all the registers
    // After we make the call, we move its return value in eax into a variable
    __asm {
        call ori_call_address
        pushad
        mov edi_value, eax
    }

    // If the result of the call is not zero, then we are looking at a player
    // Create a mouse event to simulate the left mouse button being pressed down and send it to the game
    // Otherwise, raise the mouse button up so we stop firing
    if (edi_value != 0) {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
    }
    else {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(INPUT));
    }

    // Restore the registers and jump back to original code
    _asm {
        popad
        jmp ori_jump_address
    }
}

// When our DLL is attached, unprotect the memory at the code we wish to write at
// Then set the first opcode to E9, or jump
// Caculate the location using the formula: new_location - original_location+5
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    DWORD old_protect;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;

    if (fdwReason == DLL_PROCESS_ATTACH) {
        VirtualProtect((void*)hook_location, 5, PAGE_EXECUTE_READWRITE, &old_protect);
        *hook_location = 0xE9;
        *(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
    }

    return true;
}
Отпиши если что.
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2016
Сообщения
28
Реакции[?]
3
Поинты[?]
0
Попробуй вот этот код
C++:
#include <Windows.h>

DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;

INPUT input = { 0 };
DWORD edi_value = 0;

// Our codecave that program execution will jump to. The declspec naked attribute tells the compiler to not add any function
// headers around the assembled code
__declspec(naked) void codecave() {
    // Asm blocks allow you to write pure assembly
    // In this case, we use it to call the function we hooked and save all the registers
    // After we make the call, we move its return value in eax into a variable
    __asm {
        call ori_call_address
        pushad
        mov edi_value, eax
    }

    // If the result of the call is not zero, then we are looking at a player
    // Create a mouse event to simulate the left mouse button being pressed down and send it to the game
    // Otherwise, raise the mouse button up so we stop firing
    if (edi_value != 0) {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
    }
    else {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(INPUT));
    }

    // Restore the registers and jump back to original code
    _asm {
        popad
        jmp ori_jump_address
    }
}

// When our DLL is attached, unprotect the memory at the code we wish to write at
// Then set the first opcode to E9, or jump
// Caculate the location using the formula: new_location - original_location+5
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    DWORD old_protect;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;

    if (fdwReason == DLL_PROCESS_ATTACH) {
        VirtualProtect((void*)hook_location, 5, PAGE_EXECUTE_READWRITE, &old_protect);
        *hook_location = 0xE9;
        *(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
    }

    return true;
}
Отпиши если что.
У меня консольное приложение но я просто щас это припишу в аттач процесс
 
Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
1632333371736.png
а ты зачем пихаешь в асм блок с++ код........
да и еще в naked функции, которая должна состоять только из асм..........

а ну и еще
error C2488: 'cavedata::caveFunc': 'naked' can only be applied to non-member function definitions
так нельзя делать..
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2016
Сообщения
28
Реакции[?]
3
Поинты[?]
0
Попробуй вот этот код
C++:
#include <Windows.h>

DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;

INPUT input = { 0 };
DWORD edi_value = 0;

// Our codecave that program execution will jump to. The declspec naked attribute tells the compiler to not add any function
// headers around the assembled code
__declspec(naked) void codecave() {
    // Asm blocks allow you to write pure assembly
    // In this case, we use it to call the function we hooked and save all the registers
    // After we make the call, we move its return value in eax into a variable
    __asm {
        call ori_call_address
        pushad
        mov edi_value, eax
    }

    // If the result of the call is not zero, then we are looking at a player
    // Create a mouse event to simulate the left mouse button being pressed down and send it to the game
    // Otherwise, raise the mouse button up so we stop firing
    if (edi_value != 0) {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
    }
    else {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(INPUT));
    }

    // Restore the registers and jump back to original code
    _asm {
        popad
        jmp ori_jump_address
    }
}

// When our DLL is attached, unprotect the memory at the code we wish to write at
// Then set the first opcode to E9, or jump
// Caculate the location using the formula: new_location - original_location+5
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    DWORD old_protect;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;

    if (fdwReason == DLL_PROCESS_ATTACH) {
        VirtualProtect((void*)hook_location, 5, PAGE_EXECUTE_READWRITE, &old_protect);
        *hook_location = 0xE9;
        *(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
    }

    return true;
}
Отпиши если что.
Screenshot_118.png
Посмотреть вложение 172932
а ты зачем пихаешь в асм блок с++ код........
да и еще в naked функции, которая должна состоять только из асм..........
с ассемблером в c++ не работал еще делал по гайдам плохо знаком с такими словами как naked и подобное щас перепишу попробую иначе
Посмотреть вложение 172932
а ты зачем пихаешь в асм блок с++ код........
да и еще в naked функции, которая должна состоять только из асм..........

а ну и еще

так нельзя делать..
Теперь всё гуд но есть проблемы с доступом записи в памятьScreenshot_119.png

фулл сурс
C++:
#include "inc.h"



using namespace std;


HANDLE hProc;
DWORD pId;





DWORD getModuleBase(DWORD pId, const char* pName)
{
    
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(MODULEENTRY32);

    HANDLE hSnapModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32, pId);

    if (hSnapModule == INVALID_HANDLE_VALUE)
    {
        cout << "Failed to get snap of module " << endl;
        return false;
    }


    while (Module32Next(hSnapModule, &mEntry))
    {
        if (!strcmp((char*)mEntry.szModule, pName))
        {
            cout << "hSnapModule:    " << hSnapModule << endl;
            CloseHandle(hSnapModule);
            return (DWORD)mEntry.modBaseAddr;
        }
    }
}


DWORD CalcPtr(HANDLE hProc, DWORD ptr, vector <unsigned int> offsets)
{
    DWORD addr = ptr;

    for (unsigned int i = 0; i < offsets.size(); i++)
    {
        ReadProcessMemory(hProc, (LPVOID)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

template <class data_type>
data_type wpm(data_type addr, DWORD value)
{
    WriteProcessMemory(hProc, (LPVOID)addr, &value, sizeof(data_type), 0);
}

template<class data_type>
data_type rpm(data_type address)
{
    data_type buffer;
    ReadProcessMemory(hProc, (LPVOID)address, &buffer, sizeof(data_type), 0);
    return buffer;
}


DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;

INPUT input = { 0 };
DWORD edi_value = 0;

// Our codecave that program execution will jump to. The declspec naked attribute tells the compiler to not add any function
// headers around the assembled code
void __cdecl  codecave() {
    // Asm blocks allow you to write pure assembly
    // In this case, we use it to call the function we hooked and save all the registers
    // After we make the call, we move its return value in eax into a variable
    __asm {
        call ori_call_address
        pushad
        mov edi_value, eax
    }

    // If the result of the call is not zero, then we are looking at a player
    // Create a mouse event to simulate the left mouse button being pressed down and send it to the game
    // Otherwise, raise the mouse button up so we stop firing
    if (edi_value != 0) {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
    }
    else {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(INPUT));
    }

    // Restore the registers and jump back to original code
    _asm {
        popad
        jmp ori_jump_address
    }
}

// When our DLL is attached, unprotect the memory at the code we wish to write at
// Then set the first opcode to E9, or jump
// Caculate the location using the formula: new_location - original_location+5


DWORD attachProc(const char* procName)
{
    DWORD old_protect;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof(pEntry);

    HANDLE hSnapProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


    while (Process32Next(hSnapProc, &pEntry))
    {
        if (!strcmp((char*)pEntry.szExeFile, procName))
        {
            hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pEntry.th32ProcessID);
            VirtualProtect((void*)hook_location, 5, PAGE_EXECUTE_READWRITE, &old_protect);
            *hook_location = 0xE9;
            *(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
            pId = pEntry.th32ProcessID;
            CloseHandle(hSnapProc);
            return pId;
        }
    }


}

    int main()
    {


        DWORD pId = attachProc("ac_client.exe");

        DWORD mBase = getModuleBase(pId, "ac_client.exe");

        cout << hex << "Pid " << pId << endl;


        cout << hex << "Mbase " << mBase << endl;

        vector <unsigned int> oHPoff = { 0xF8 };

        DWORD hpBase = 0x00109B74;

        DWORD basehpaddr = mBase + hpBase;
        DWORD baseaddr = CalcPtr(hProc, basehpaddr, oHPoff);
        
    

        

    }
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
26 Окт 2017
Сообщения
519
Реакции[?]
95
Поинты[?]
2K
Посмотреть вложение 172933

с ассемблером в c++ не работал еще делал по гайдам плохо знаком с такими словами как naked и подобное щас перепишу попробую иначе


Теперь всё гуд но есть проблемы с доступом записи в памятьПосмотреть вложение 172936

фулл сурс
C++:
#include "inc.h"



using namespace std;


HANDLE hProc;
DWORD pId;





DWORD getModuleBase(DWORD pId, const char* pName)
{
  
    MODULEENTRY32 mEntry;
    mEntry.dwSize = sizeof(MODULEENTRY32);

    HANDLE hSnapModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32, pId);

    if (hSnapModule == INVALID_HANDLE_VALUE)
    {
        cout << "Failed to get snap of module " << endl;
        return false;
    }


    while (Module32Next(hSnapModule, &mEntry))
    {
        if (!strcmp((char*)mEntry.szModule, pName))
        {
            cout << "hSnapModule:    " << hSnapModule << endl;
            CloseHandle(hSnapModule);
            return (DWORD)mEntry.modBaseAddr;
        }
    }
}


DWORD CalcPtr(HANDLE hProc, DWORD ptr, vector <unsigned int> offsets)
{
    DWORD addr = ptr;

    for (unsigned int i = 0; i < offsets.size(); i++)
    {
        ReadProcessMemory(hProc, (LPVOID)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

template <class data_type>
data_type wpm(data_type addr, DWORD value)
{
    WriteProcessMemory(hProc, (LPVOID)addr, &value, sizeof(data_type), 0);
}

template<class data_type>
data_type rpm(data_type address)
{
    data_type buffer;
    ReadProcessMemory(hProc, (LPVOID)address, &buffer, sizeof(data_type), 0);
    return buffer;
}


DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;

INPUT input = { 0 };
DWORD edi_value = 0;

// Our codecave that program execution will jump to. The declspec naked attribute tells the compiler to not add any function
// headers around the assembled code
void __cdecl  codecave() {
    // Asm blocks allow you to write pure assembly
    // In this case, we use it to call the function we hooked and save all the registers
    // After we make the call, we move its return value in eax into a variable
    __asm {
        call ori_call_address
        pushad
        mov edi_value, eax
    }

    // If the result of the call is not zero, then we are looking at a player
    // Create a mouse event to simulate the left mouse button being pressed down and send it to the game
    // Otherwise, raise the mouse button up so we stop firing
    if (edi_value != 0) {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &input, sizeof(INPUT));
    }
    else {
        input.type = INPUT_MOUSE;
        input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
        SendInput(1, &input, sizeof(INPUT));
    }

    // Restore the registers and jump back to original code
    _asm {
        popad
        jmp ori_jump_address
    }
}

// When our DLL is attached, unprotect the memory at the code we wish to write at
// Then set the first opcode to E9, or jump
// Caculate the location using the formula: new_location - original_location+5


DWORD attachProc(const char* procName)
{
    DWORD old_protect;
    unsigned char* hook_location = (unsigned char*)0x0040AD9D;
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof(pEntry);

    HANDLE hSnapProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);


    while (Process32Next(hSnapProc, &pEntry))
    {
        if (!strcmp((char*)pEntry.szExeFile, procName))
        {
            hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pEntry.th32ProcessID);
            VirtualProtect((void*)hook_location, 5, PAGE_EXECUTE_READWRITE, &old_protect);
            *hook_location = 0xE9;
            *(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
            pId = pEntry.th32ProcessID;
            CloseHandle(hSnapProc);
            return pId;
        }
    }


}

    int main()
    {


        DWORD pId = attachProc("ac_client.exe");

        DWORD mBase = getModuleBase(pId, "ac_client.exe");

        cout << hex << "Pid " << pId << endl;


        cout << hex << "Mbase " << mBase << endl;

        vector <unsigned int> oHPoff = { 0xF8 };

        DWORD hpBase = 0x00109B74;

        DWORD basehpaddr = mBase + hpBase;
        DWORD baseaddr = CalcPtr(hProc, basehpaddr, oHPoff);
      
  

      

    }
Пытаешься сделать интерналом экстернал способ не плохо ГЫ
C++:
*hook_location = 0xE9;
*(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
По меньшей мере необходимо выделить память в таргет приложении. После записать туда свою функцию хука codecave предварительно забив
DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;
в тело функции.
После уже WPM для записи прыжка на твой хук в начале таргет функции.
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2016
Сообщения
28
Реакции[?]
3
Поинты[?]
0
Пытаешься сделать интерналом экстернал способ не плохо ГЫ
C++:
*hook_location = 0xE9;
*(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
По меньшей мере необходимо выделить память в таргет приложении. После записать туда свою функцию хука codecave предварительно забив
DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;
в тело функции.
После уже WPM для записи прыжка на твой хук в начале таргет функции.
да именно xD, интерналом хочу
Пытаешься сделать интерналом экстернал способ не плохо ГЫ
C++:
*hook_location = 0xE9;
*(DWORD*)(hook_location + 1) = (DWORD)&codecave - ((DWORD)hook_location + 5);
По меньшей мере необходимо выделить память в таргет приложении. После записать туда свою функцию хука codecave предварительно забив
DWORD ori_call_address = 0x4607C0;
DWORD ori_jump_address = 0x0040ADA2;
в тело функции.
После уже WPM для записи прыжка на твой хук в начале таргет функции.
а как выделить память в таргет приложении?
 
Сверху Снизу