Я пытаюсь написать шаблон поиска для созданного мной тестового приложения, использующего Directx9, но у меня возникают некоторые проблемы с поиском правильного шаблона запуска.Указатель, который я пытаюсь найти, - это указатель устройства IDIRECT3D9.
unsigned long dwStartAddress = 0x14008613F, dwLen = ( 0x14008613F - 0x14008615D );
bool bDataCompare(const unsigned char* pData, const unsigned char* bMask, const char* szMask)
{
for (; *szMask; ++szMask, ++pData, ++bMask)
if (*szMask == 'x' && *pData != *bMask)
return false;
return (*szMask) == 0;
}
unsigned long dwFindPattern(unsigned char *bMask, char * szMask, unsigned long dw_Address = dwStartAddress, unsigned long dw_Len = dwLen)
{
for (unsigned long i = 0; i < dw_Len; i++)
if (bDataCompare((unsigned char*)(dw_Address + i), bMask, szMask))
return (unsigned long)(dw_Address + i);
return 0;
}
Я копал файл d3d9.h и посмотрел примеры проектов для Microsoft DirectX SDK (август 2009 г.), найденные здесь.https://www.microsoft.com/en-us/download/details.aspx?id=23549
Согласно https://msdn.microsoft.com/en-us/library/windows/desktop/bb219676(v=vs.85).aspx Direct3DCreate9Ex проверяет, поддерживаются ли функции D3Dx9ex.
Согласно https://msdn.microsoft.com/en-us/library/windows/desktop/bb174313(v=vs.85).aspx Direct3DCreate9 :: CreateDevice возвращает указатель
ниже я делаю предположение, что могу начать сканирование моего адреса с 0x14008613F и завершить с (0x14008613F - 0x14008615D)
Также я делаюпредположение, что
jnz short loc_14008615E
mov [rbx+0E8h], eax
- это местоположение указателя моего устройства, которое я ищу.с
[rbx+0E8h]
указателем, возвращаемым из Direct3DCreate9 :: CreateDevice
Надеюсь, я получил достаточно информации об этом, так как это моя первая попытка любых реальных манипуляций с памятью.
Редактировать: важна моя подпись и маска:
DWORD m_dwaddy = dwFindPattern((PBYTE)"\x00\x48\x8B\xF8", (char *)"?xxx");