Эзотерическое программирование ч. 1.5 Whitemagic — библиотека написанная в конце 2009 года, пользователем портала gamedeception.net Apoc'ом. В основе фреймворка лежит код другой библиотеки пользователя этого-же портала — Shynd'а. Благодаря этим «адептам тайных знаний» мы имеем инструмент способный:
Читать и редактировать память.
Получать указатели на функции по их индексу в vtable
Использовать паттерн менеджер, для быстрого поиска кода по его сигнатуре
Использовать менеджер патчей, позволяющий элегантно применять патчи, и так же элегантно их отменять
И последняя в очереди, но не последняя по значимости фича — это Detour менеджер, позволяющий буквально играючи ставить хуки на функции, или так же легко их снимать.
Исходники лежат на гитхабе
[Ссылки могут видеть только зарегистрированные пользователи. ]
Следующая статья будет об использовании белой магии и хуке D3DEndScene, для рисования в окне приложения.
Затравочка:
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
PS Понятия не имею когда будет написана следующая часть, ибо я столкнулся с немыслимой задачей — описанием интерфейса универсального инжектора, ну не люблю я писать код формочек.
PPS Эх, слишком короткий пост получился, мне стыдно :shame:
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 20.02.2013 в 00:26.
dxvtable можно вытащить из экземпляра класса Device используя SlimDX или расковыряв класс System.Window.Form
Второй вариант для хука пойдет, но вот на счет рисования не уверен, ибо надо будет получить девайс из указателя, а без slimdx это вряд ли получится.
Дальше нужно создать делегат
Код:
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate int EndSceneDelegate(IntPtr device);
Теперь когда мы имеем делегат мы можем ставить хук
Код:
Magic.Instance.Detours.CreateAndApply(_endScene , new EndSceneDelegate(EndSceneHook), "EndScene");
Курсивом выделен метод на который ставится хук, а жирным выделен обработчик хука
Остается только в методе обработчике вызвать оригинальную функцию
Код:
private static int EndSceneHook(IntPtr device)
{
//В этом методе можно начинать рисовать, но я пробрасываю событие дальше, что бы не захламлять код
// Рисовать нужно в Device d = Device.FromPointer(device);
lock (_frameLock)
{
if (OnFrame != null)
OnFrame(null, new D3DEventArgs(device));
}
return (int)Magic.Instance.Detours["EndScene"].CallOriginal(device);
}
алсо, пытался в ла2 хукнуть AddNetworkQueue, но пока что не вышло, там нужно править регистры. Вообще надо будет попробовать побайтно записать функцию где ни будь в памяти и зарегистрировать на нее делегат