Подключение DirectX EndScene из внедренной DLL

Вы должны использовать MySQLi, ниже код работает хорошо

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------\n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>
30
задан AstroCB 30 August 2014 в 21:10
поделиться

2 ответа

Вы устанавливаете системный широкий крюк. (SetWindowsHookEx) После этого вы загружаетесь в каждый процесс.

Теперь, когда вызывается хук, вы ищете загруженный d3d9.dll.

Если он загружен, вы создаете временный объект D3D9, и идете по фабрике, чтобы получить адрес метода EndScene.

Затем вы можете исправить вызов EndScene своим собственным методом. (Замените первую инструкцию в EndScene вызовом своего метода.

После этого нужно исправить обратный вызов, чтобы вызвать оригинальный метод EndScene. А затем переустановить патч.

Так делает FRAPS. (Link)


Адрес функции можно найти на флешке интерфейса.

Таким образом, вы можете сделать следующее (Псевдокод):

IDirect3DDevice9* pTempDev = ...;
const int EndSceneIndex = 26 (?);

typedef HRESULT (IDirect3DDevice9::* EndSceneFunc)( void );

BYTE* pVtable = reinterpret_cast<void*>( pTempDev );
EndSceneFunc = pVtable + sizeof(void*) * EndSceneIndex;

EndSceneFunc теперь содержит указатель на саму функцию. Теперь мы можем либо заплатить все сайты вызовов, либо заплатить саму функцию.

Остерегайтесь, что всё это зависит от знания реализации COM-интерфейсов в Windows. Но это работает на всех версиях Windows (либо 32, либо 64, а не на обеих одновременно)

.
15
ответ дан 27 November 2019 в 22:49
поделиться

Немного старый вопрос, я знаю - но если кому-то интересно сделать это с помощью C#, вот мой пример по подключению API Direct3D 9 с помощью C#. Здесь используется EasyHook - сборка .NET с открытым исходным кодом, которая позволяет вам "безопасно" устанавливать крючки из управляемого кода в неуправляемые функции. (Примечание: EasyHook решает все проблемы, связанные с внедрением DLL - например, CREATE_SUSPENDED, ACL, 32 vs 64-bit и т.д.)

Я использую аналогичный подход VTable, упомянутый Кристофером, с помощью небольшой вспомогательной библиотеки C++ для динамического определения адреса функций IDirect3DDevice9, которые нужно подключить. Это делается путем создания временного хэндла окна и создания отбрасываемого IDirect3Device9 в инжектированной сборке, а затем подключением нужных функций. Это позволяет вашему приложению подключить уже запущенную цель (Обновление: обратите внимание, что это возможно и в C# - см. комментарии на странице по ссылке).

Обновление: есть также обновленная версия для подключения Direct3D 9, 10 и 11, по-прежнему использующая EasyHook и SharpDX вместо SlimDX

.
4
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: