Другое Coding VMT hook for x64 bit Warface

2yxxx

Потрачен
Автор темы
13
7
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здесь не будет миллион строк так что поехали!

Нам нужно:
  • Warface 64 bit
  • x64dbg(Scylla)
  • IDA 64 bit

1. Как дампить x64 WF:
Клик

2. Перейдём в IDA PRO
Поиск SSystemGlobalEnvironment:
https://pp.userapi.com/c858436/v8584...IOYv1LB-Lo.jpg
https://pp.userapi.com/c858436/v8584...Ys9JBNCB14.jpg


Поиск IRenderer:
https://pp.userapi.com/c858436/v8584...iY4SFz-9LI.jpg
https://pp.userapi.com/c858436/v8584...9Hkhn-ag9o.jpg


Поиск GetDirectDevice:
Перейдите в "Imports" (View->Open subviews->Imports)
https://pp.userapi.com/c858436/v8584...xP-tkdNAD4.jpg
Нажмите "X" на j_D3DXCreateTexture (второй по счёту)
https://pp.userapi.com/c858436/v8584...lIiupIm5MY.jpg

Нужные адреса мы нашли перейдём к кодингу!

Main.cpp
C++:
typedef __int64(WINAPI* EndSceenFn)(IDirect3DDevice9*, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*);
EndSceenFn pEndSceen;

VMTHookManager* VmtHook = new VMTHookManager;

HRESULT WINAPI myEndSceen(IDirect3DDevice9* m_pDevice, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion)
{
    //PUT
    //YOUR
    //CODE
    return pEndSceen(m_pDevice, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion);
}

BOOL WINAPI DllMain(HMODULE hModule, DWORD64 dwReason, LPVOID)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
        VmtHook->bInitialize((PDWORD64*)SSystemGlobalEnvironment::Singleton()->GetIRenderer()->GetDirectDevice());
        pEndSceen = (EndSceenFn)VmtHook->dwHookMethod((DWORD64)myEndSceen, 17);
        break;

    case DLL_PROCESS_DETACH:
        FreeLibraryAndExitThread(hModule, 0);
        break;
    }
}

Hook.h
C++:
#ifdef _WIN64
#define _pdword        PDWORD64
#define _dword        DWORD64
#else
#define _pdword        PDWORD
#define _dword        DWORD
#endif

class VMTHookManager
{
public:
    VMTHookManager(void)
    {
        memset(this, 0, sizeof(VMTHookManager));
    }
    VMTHookManager(_pdword* ppdwClassBase)
    {
        bInitialize(ppdwClassBase);
    }
    ~VMTHookManager(void)
    {
        UnHook();
    }
    bool bInitialize(_pdword* ppdwClassBase)
    {
        m_ppdwClassBase = ppdwClassBase;
        m_pdwOldVMT = *ppdwClassBase;
        m_dwVMTSize = dwGetVMTCount(*ppdwClassBase);
        m_pdwNewVMT = new _dword[m_dwVMTSize];
        memcpy(m_pdwNewVMT, m_pdwOldVMT, sizeof(_dword) * m_dwVMTSize);
        *ppdwClassBase = m_pdwNewVMT;
        return true;
    }
    bool bInitialize(_pdword** pppdwClassBase)
    {
        return bInitialize(*pppdwClassBase);
    }
    void UnHook(void)
    {
        if (m_ppdwClassBase)
        {
            *m_ppdwClassBase = m_pdwOldVMT;
        }
    }
    void ReHook(void)
    {
        if (m_ppdwClassBase)
        {
            *m_ppdwClassBase = m_pdwNewVMT;
        }
    }
    int iGetFuncCount(void)
    {
        return (int)m_dwVMTSize;
    }
    _dword dwGetMethodAddress(int Index)
    {
        if (Index >= 0 && Index <= (int)m_dwVMTSize && m_pdwOldVMT != NULL)
        {
            return m_pdwOldVMT[Index];
        }
        return NULL;
    }
    _pdword pdwGetOldVMT(void)
    {
        return m_pdwOldVMT;
    }
    _dword dwHookMethod(_dword dwNewFunc, unsigned int iIndex)
    {
        if (m_pdwNewVMT && m_pdwOldVMT && iIndex <= m_dwVMTSize && iIndex >= 0)
        {
            m_pdwNewVMT[iIndex] = dwNewFunc;
            return m_pdwOldVMT[iIndex];
        }

        return NULL;
    }
private:
    _dword dwGetVMTCount(_pdword pdwVMT)
    {
        _dword dwIndex = 0;

        for (dwIndex = 0; pdwVMT[dwIndex]; dwIndex++)
        {
            if (IsBadCodePtr((FARPROC)pdwVMT[dwIndex]))
            {
                break;
            }
        }
        return dwIndex;
    }
    _pdword* m_ppdwClassBase;
    _pdword    m_pdwNewVMT, m_pdwOldVMT;
    _dword    m_dwVMTSize;
};

Classes.h
C++:
class SSystemGlobalEnvironment;
class IRenderer;

class SSystemGlobalEnvironment
{
public:
    IRenderer* GetIRenderer() { return (IRenderer*) * (DWORD64*)((DWORD64)this + 0x48); }

    static SSystemGlobalEnvironment* Singleton()
    {
        return *(SSystemGlobalEnvironment * *)0x141BD0B10;
    }
};

class IRenderer
{
public:
    DWORD64* GetDirectDevice()
    {
        return (DWORD64*) * (DWORD64*)((DWORD64)this + 0xA6E8);
    }
};

Вот и всё, скомпилируйте код :)
 

rraggerr

проверенный какой-то
1,626
849
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как искать адреса в иде сказал, а где скачать саму иду не сказал..............(без смс и регистраций)
 
  • Bug
Реакции: whyhardlyz

2yxxx

Потрачен
Автор темы
13
7
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как искать адреса в иде сказал, а где скачать саму иду не сказал..............(без смс и регистраций)

Чувак я не Гугл, нужные программы вы можете найти сами, ведь данный туториал не рассчитан на овощей, которые ни разу не сталкивались с написанием читов на Warface.
 

rraggerr

проверенный какой-то
1,626
849
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Чувак я не Гугл, нужные программы вы можете найти сами, ведь данный туториал не рассчитан на овощей, которые ни разу не сталкивались с написанием читов на Warface.
если чел не овощ, то он бы и без твоего гайда научился это делать