- 13
- 7
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здесь не будет миллион строк так что поехали!
Нам нужно:
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
Hook.h
Classes.h
Вот и всё, скомпилируйте код :)
Нам нужно:
- 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);
}
};
Вот и всё, скомпилируйте код :)