Делать memcpy самостоятельно? - PullRequest
0 голосов
/ 06 мая 2018

Итак, я удивился, почему я не могу сделать memcpy для себя. Это код, который работает и дает мне правильный результат:

unsigned int VTableAddress = FindPattern( VTABLE_PATTERN, VTABLE_MASK );

unsigned int *p_VTable = NULL;

WriteMemory( &p_VTable, ( void* ) ( VTableAddress + 2 ), 4 );

//....

void D3DX9Interface::WriteMemory( void *address, void *bytes, int byteSize )
{
    DWORD NewProtection;

    VirtualProtect( address, byteSize, PAGE_EXECUTE_READWRITE, &NewProtection );
    memcpy( address, bytes, byteSize );
    VirtualProtect( address, byteSize, NewProtection, &NewProtection );
}

Так что, насколько я понимаю, WriteMemory в основном устанавливает защиту от чтения / записи для адреса памяти, а затем просто копирует байты в адрес. Чтобы понять, как все работает, я попробовал сам с этим кодом:

//Get the address of the vtable
unsigned int VTableAddress = FindPattern( VTABLE_PATTERN, VTABLE_MASK );

unsigned int *p_VTable = NULL;

CopyWithRWPrivileges( p_VTable, (unsigned int*)( VTableAddress + 2 ) );

//...

void D3DX9Interface::CopyWithRWPrivileges( unsigned int *p_Destination, unsigned int *p_Source )
{
    DWORD Protection( 0 );

    VirtualProtect( reinterpret_cast< LPVOID >( p_Destination ), 4, PAGE_EXECUTE_READWRITE, &Protection );

    p_Destination = p_Source;

    VirtualProtect( reinterpret_cast< LPVOID >( p_Destination ), 4, Protection, &Protection );
}

Но по какой-то причине последний код возвращает мне нулевой указатель. Но почему?

1 Ответ

0 голосов
/ 06 мая 2018

Хорошо, с помощью UnholySheep я нашел решение для моей проблемы. Итак, во-первых, указатель копируется, а не передается как ссылка-указатель. И, во-вторых, p_Source также должен обрабатываться как указатель, поэтому с этим кодом он работает:

void D3DX9Interface::CopyWithRWPrivileges( unsigned int *&p_Destination, unsigned int *p_Source )
{
    DWORD Protection( 0 );

    VirtualProtect( reinterpret_cast< LPVOID >( p_Destination ), 4, PAGE_EXECUTE_READWRITE, &Protection );

    p_Destination = *(unsigned int**) p_Source;

    VirtualProtect( reinterpret_cast< LPVOID >( p_Destination ), 4, Protection, &Protection );
}
...