Эзотерическое программирование ч.2 via EndScene Hook
В предыдущих статьях я показал один из способов внедрения управляемой сборки в адресное пространство неуправляемого приложения, а так же упоминал о некой библиотеки называемой [Ссылки могут видеть только зарегистрированные пользователи. ], на этот раз я постараюсь описать процесс хука используя полученные ранее знания.
Для начала нам потребуется SlimDX с [Ссылки могут видеть только зарегистрированные пользователи. ], а так же [Ссылки могут видеть только зарегистрированные пользователи. ] из моего репозитория.
Теперь берем небольшой класс который поможет нам в дальнейшем
Код:
using System;
using System.Runtime.InteropServices;
using SlimDX.Direct3D9;
using WhiteMagic;
namespace D3DHook
{
public static class Helper
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int Direct3D9EndScene(IntPtr device); //Создали делегат с подходящей сигнатурой
private static readonly object _frameLock = new object();
public static event EventHandler<D3DEventArgs> OnFrame; //Событие кторое будет срабатывать при каждом срабатывании хука
private static Direct3D9EndScene _endSceneDelegate; //Экземпляр делегата, он будет вызывать оригинальную функцию
private static IntPtr EndScenePointer = IntPtr.Zero; //Указатель на оригинальную функцию
const int VMT_ENDSCENE = 42; //Смещение в VMTable
public static void Initialize()
{
using (var d3d = new Direct3D())
{
using (var tmpDevice = new Device(d3d, 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters() { BackBufferWidth = 1, BackBufferHeight = 1 }))
{
EndScenePointer = Magic.Instance.GetObjectVtableFunction(tmpDevice.ComPointer, VMT_ENDSCENE); //Получаем указатель на оригинальную функцию
}
}
_endSceneDelegate = Magic.Instance.RegisterDelegate<Direct3D9EndScene>(EndScenePointer); //Получаем делегат из указателя
Magic.Instance.Detours.CreateAndApply(_endSceneDelegate, new Direct3D9EndScene(EndSceneHook), "D9EndScene"); //Создаем и применяем хук
}
public static void Dispose()
{
Magic.Instance.Detours["D9EndScene"].Dispose();
}
private static int EndSceneHook(IntPtr device) //Обработчик хука прокидывает событие дальше, передавая указатель на устройство
{
lock (_frameLock)
{
if (OnFrame != null)
OnFrame(null, new D3DEventArgs(device));
}
return (int)Magic.Instance.Detours["D9EndScene"].CallOriginal(device); //Вызов оригинальной функции
}
}
public class D3DEventArgs : EventArgs
{
public IntPtr Device;
public D3DEventArgs(IntPtr device)
{
this.Device = device;
}
}
}
В принципе этого достаточно для реализации хука, теперь можно написать простое приложение
Код:
using System;
using System.Drawing;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D9;
namespace D3DHook
{
public partial class Form1 : Form
{
private string _input = string.Empty;
public Form1()
{
InitializeComponent();
Helper.Initialize();
Helper.OnFrame += client_Frame;
}
private void client_Frame(object sender, D3DEventArgs e)
{
if (string.IsNullOrEmpty(_input)) return;
using (Device device = Device.FromPointer(e.Device))
{
using (var font = new SlimDX.Direct3D9.Font(device, 30, 0, FontWeight.Bold, 0, false, CharacterSet.Default,
Precision.TrueType, FontQuality.Antialiased, PitchAndFamily.DontCare, "Arial"))
{
font.DrawString(null, _input, new Rectangle(10, 10, 500, 30), DrawTextFormat.Top | DrawTextFormat.Left, new Color4(Color.Red));
}
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Helper.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
_input = textBox1.Text;
}
}
}
Компилируете его как x86 приложение, и инжектите как было описано в первой части, или можете воспользоваться инжектором приложенным ниже
Исходники проекта [Ссылки могут видеть только зарегистрированные пользователи. ]
Инжектор [Ссылки могут видеть только зарегистрированные пользователи. ]
инжектор+пример [Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
upd1: поправил код обработчика client_Frame, убран ненужный объект Sprite fontSprite
________________
Talk is cheap. Show me the code
— Linus Torvalds
Последний раз редактировалось Yukikaze; 19.08.2013 в 00:00.
Re: Эзотерическое программирование ч.2 via EndScene Hook
знаю темка старая, но все же. писал на похожей библиотеке SharpDX , и вот интересен вопрос, возможно ли сделать без лишних инжекторов, просто чтобы программа сама себя использовала так сказать
Re: Эзотерическое программирование ч.2 via EndScene Hook
Цитата:
Зачем хукать функцию, если можно рисовать на окне поверх другого окна.
так можно было бы и через Label выводить обычный, и позицию формы делать по координатам нужного окна
Цитата:
Если только программа сама будет инжектором, могу поделится сорсами инжектора
а я сижу через ILSpy ковыряю ))
P.S. Я только начал ковыряться в Direct на C# , с чего будет лучше начать? есть ли преимущество у SharpDX перед SlimDX если знаете? а то туториалов на него не найти
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Последний раз редактировалось Ginrey; 25.07.2014 в 12:22.
Re: Эзотерическое программирование ч.2 via EndScene Hook
а где тогда можно почитать про его функции и их использование, а то их куча, а как пользоваться фиг найдешь, нашел только малую часть
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Re: Эзотерическое программирование ч.2 via EndScene Hook
попробовал используя SharpDX повторить ваш код, а точнее просто вырезал из вашего кода все использования SlimDX и поставил функции из SharpDX , при попытке инжекта окно игры просто зависает
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2