?

Log in

No account? Create an account

Previous Entry | Next Entry

Этот текст можно считать своего рода продолжением моей заметки о создании библиотеки-враппера. Я люблю хуки/инжекты в сторонние процессы. Это всегда весело и интересно :) Для чего это может понадобиться я уже перечислял в предыдущей заметке. По ходу дела мы рассмотрим работу некоторых коммерческих продуктов использующих соответствующие техники для внедрения в сторонние приложения.
Немного о хуках.

Каждый из вариантов внедрения (инжекта и хуков) в сторонние процессы в windows имеет свои плюсы и минусы. Основным недостатком враппера является то, что этот механизм представляет из себя по сути load time решение. А что если мы хотим внедрить свой код в уже работающее приложение? Наиболее простым способом в данном случае будет использование возможностей функции SetWindowsHookEx. С ее помощью (например, используя хук WH_CBT) мы можем легко внедрить в сторонний процесс свою DLL. Здесь не следует забывать о разрядности - для 32 разрядных и 64 разрядных приложений такая DLL будет своя.
Следующий шаг - перехват методов COM интерфейсов DirectX. В случае библиотеки-враппера у нас есть вся "история" вызовов API - любой вызов из директории импорта или методов проходит сначала через нашу библиотеку. А как быть, когда приложение вероятнее всего уже проинициализировало все нужные ему основные интерфейсы? Как вы понимаете в директории импортов приложения отсутствуют методы COM интерфейсов. По понятным причинам. Возвращаемся к внутреннему устройству COM интерфейса - если сам по себе интерфейс есть абстрактный класс, то у него есть vtable - таблица (или, если угодно, массив), содержащая указатели методов интерфейса. А теперь самое главное. В рамках одного процесса содержимое этой таблицы не меняется. Рассмотрим на примере Direct3D 9 что именно я имею ввиду. Вызов Direct3DCreate9 возвращает указатель на интерфейс IDirect3D9. Разименовав указатель мы по сути получим еще один указатель. Он указывает на массив методов, собственно на нужный нам vtable. При этом независимо от того, где бы в рамках одного и того же процесса (ASLR нам здесь не помеха) мы не выполнили Direct3DCreate9, содержимое vtable будет одним и тем же.

Proof of concept.

В качестве подтверждения было написано небольшое приложение, которое инжектировало в 32 разрядный процесс мою библиотеку. Получив управление библиотека проверяет, использует ли приложение Direct3D 9. Если соответствующий модуль (в данном случае d3d9.dll) загружен, в библиотеке создаются "липовые" IDirect3D9 и IDirect3DDevice9. Создаются только для того, чтобы получить указатели на их vtable. Вот пример информации, получаемой от библиотеки:

[7560] [0x00001d88:0x000011bc][CheckAPI] GetModuleFileName()=D:\Projects\gxh00k\small_d3d9.exe
[7560] [0x00001d88:0x000011bc][CheckAPI] Command line: "D:\Projects\gxh00k\small_d3d9.exe"
[7560] [0x00001d88:0x000011bc][CheckAPI] HWND 0x002c02ec
[7560] [0x00001d88:0x000011bc][CheckAPI] Window title: 'Small Direct3D9'
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] Direct3D9 created
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::QueryInterface 0x65a40409 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::AddRef 0x65a3a1e1 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::Release 0x65a39b61 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::RegisterSoftwareDevice 0x65a6ded8 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetAdapterCount 0x65a814c6 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetAdapterIdentifier 0x65a3f8b7 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetAdapterModeCount 0x65a71331 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::EnumAdapterModes 0x65a7201a (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetAdapterDisplayMode 0x65a42515 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CheckDeviceType 0x65a38d36 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CheckDeviceFormat 0x65a2930a (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CheckDeviceMultiSampleType 0x65a39179 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CheckDepthStencilMatch 0x65a4d154 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CheckDeviceFormatConversion 0x65ac8466 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetDeviceCaps 0x65a2df44 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::GetAdapterMonitor 0x65a40986 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] IDirect3D9::CreateDevice 0x65a42e0e (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] Direct3D9 Device created
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::QueryInterface 0x65a26f19 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::AddRef 0x65a26992 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::Release 0x65a26969 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::TestCooperativeLevel 0x65a42587 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetAvailableTextureMem 0x65adc6ad (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::EvictManagedResources 0x65b19c8f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetDirect3D 0x65a3b1c5 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetDeviceCaps 0x65a26ff8 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetDisplayMode 0x65a5d144 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetCreationParameters 0x65a4084e (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetCursorProperties 0x65adbb74 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetCursorPosition 0x65adc04d (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::ShowCursor 0x65a5def0 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateAdditionalSwapChain 0x65a3e9a0 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetSwapChain 0x65a39ac7 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetNumberOfSwapChains 0x65a693ca (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::Reset 0x65a7f251 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::Present 0x65a6a064 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetBackBuffer 0x65a81418 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetRasterStatus 0x65a3bfe9 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetDialogBoxMode 0x65adc139 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetGammaRamp 0x65adc3bf (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetGammaRamp 0x65adc4fd (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateTexture 0x65a55ddb (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateVolumeTexture 0x65adca68 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateCubeTexture 0x65a7cb2d (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateVertexBuffer 0x65a42d69 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateIndexBuffer 0x65a432e6 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateRenderTarget 0x65a70127 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateDepthStencilSurface 0x65adcd88 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::UpdateSurface 0x65ade0e0 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::UpdateTexture 0x65a546ab (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetRenderTargetData 0x65a6f3bd (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetFrontBufferData 0x65add037 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::StretchRect 0x65a5e108 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::ColorFill 0x65a3d507 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateOffscreenPlainSurface 0x65a6ffee (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetRenderTarget 0x65a69e53 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetRenderTarget 0x65a6a13c (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetDepthStencilSurface 0x65a7108f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetDepthStencilSurface 0x65a70f08 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::BeginScene 0x65a43889 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::EndScene 0x65a4279f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::Clear 0x65a2d821 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetTransform 0x65a2cfde (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetTransform 0x65b20dda (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::MultiplyTransform 0x65b19ddf (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetViewport 0x65b19ef7 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetViewport 0x65a6ebc1 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetMaterial 0x65b1a204 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetMaterial 0x65b21753 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetLight 0x65a53788 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetLight 0x65b21802 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::LightEnable 0x65a5388b (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetLightEnable 0x65b2194b (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetClipPlane 0x65b1b5c4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetClipPlane 0x65b2145f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetRenderState 0x65a6be81 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetRenderState 0x65b2099c (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateStateBlock 0x65a7d5ec (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::BeginStateBlock 0x65a6a418 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::EndStateBlock 0x65a6c093 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetClipStatus 0x65b20f6e (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetClipStatus 0x65b21018 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetTexture 0x65b1a8d8 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetTexture 0x65a409f5 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetTextureStageState 0x65b20b84 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetTextureStageState 0x65a40b63 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetSamplerState 0x65b20d02 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetSamplerState 0x65a40a9e (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::ValidateDevice 0x65a76544 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetPaletteEntries 0x65b1b1c7 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetPaletteEntries 0x65b1b501 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetCurrentTexturePalette 0x65b1afca (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetCurrentTexturePalette 0x65b1b126 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetScissorRect 0x65b1a021 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetScissorRect 0x65b1a148 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetSoftwareVertexProcessing 0x65b21526 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetSoftwareVertexProcessing 0x65b2097f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetNPatchMode 0x65a6ef2f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetNPatchMode 0x65a6ebaa (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawPrimitive 0x65a48de0 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawIndexedPrimitive 0x65a4b6b1 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawPrimitiveUP 0x65a6e894 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawIndexedPrimitiveUP 0x65b1ca36 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::ProcessVertices 0x65b225e4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateVertexDeclaration 0x65a4d3ef (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetVertexDeclaration 0x65a4d313 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetVertexDeclaration 0x65b17cd5 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetFVF 0x65b1bada (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetFVF 0x65b1bc10 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateVertexShader 0x65a65e6f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetVertexShader 0x65a6bb5e (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetVertexShader 0x65b24994 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetVertexShaderConstantF 0x65a7d239 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetVertexShaderConstantF 0x65b19346 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetVertexShaderConstantI 0x65b17da4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetVertexShaderConstantI 0x65b19533 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetVertexShaderConstantB 0x65b17f16 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetVertexShaderConstantB 0x65b19723 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetStreamSource 0x65a6f0f2 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetStreamSource 0x65b1b71a (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetStreamSourceFreq 0x65b1b811 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetStreamSourceFreq 0x65b1b951 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetIndices 0x65a6f1e3 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetIndices 0x65b1ba0c (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreatePixelShader 0x65a5fd6f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetPixelShader 0x65a6bc2a (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetPixelShader 0x65b24d89 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetPixelShaderConstantF 0x65a7d3b4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetPixelShaderConstantF 0x65b24e52 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetPixelShaderConstantI 0x65b181b4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetPixelShaderConstantI 0x65b24f94 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::SetPixelShaderConstantB 0x65b18326 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::GetPixelShaderConstantB 0x65b250e4 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawRectPatch 0x65b1c4e8 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DrawTriPatch 0x65b1c78f (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::DeletePatch 0x65b18498 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] IDirect3DDevice9::CreateQuery 0x65a44019 (C:\Windows\system32\d3d9.dll:0x65a20000)
[7560] [0x00001d88:0x000011bc][CheckDirect3DDevice9] Direct3D9 Device released, 1
[7560] [0x00001d88:0x000011bc][CheckDirect3D9] Direct3D9 released, 0


Как видно из листинга, библиотека показывает имя метода, его адрес, модуль которому принадлежит метод и базу модуля. Именно эту "утилитку" я использую для анализа хуков со стороны других приложений.

Совсем немного о реализации. Для создания IDirect3DDevice9 необходим HWND окна. Получить его можно воспользовавшись функцией EnumWindows, а конкретно в CALLBACK процедуре найти окно нашего процесса. Информацию о том, какому модулю принадлежит тот или иной адрес в виртуальном адресном пространстве можно получить через VirtualQuery и GetModuleFileName.

Анализ приложений.

Поговорим о собственно внедрении в процессы. Причем рассмотрим мы это на примере конкретных приложений. Хотя, полагаю, с перехватом методов уже и так более или менее все понятно. Я имею ввиду как именно все это можно реализовать. В качестве подопытных были выбраны следующие программные продукты: FRAPS, DxTory, Action!, D3DGear и бесплатный Open Broadcaster Software. Почти все эти приложения объединяет то, что они хотят много денег что так или иначе они "вмешиваются" в логику приложения. Их основной функционал - приложения умеют записывать и/или транслировать видео из игровых приложений. Но, как вы понимаете, сравнением функционала как такового я заниматься не буду (Лично мне хватает NVidia Shadowplay).

Дополнительно, для анализа было написано простейшее Direct3D9 приложение, кадр которого выглядит так:

void Frame(IDirect3DDevice9* pdevice)
{
    pdevice->Clear(0, nullptr, D3DCLEAR_TARGET, XMCOLOR(1.0f, 0.5f, 0.0f, 0.0f), 0.0f, 0);
    pdevice->Present(nullptr, nullptr, nullptr, nullptr);
}


Вызов IDirect3DDevice9::Present можно рассматривать как контрольную точку. Именно к моменту вызова этого метода кадр полностью сформирован. А значит перечисленные приложения должны перехватывать как минимум этот метод. Проверим.

Начнем со старичка FRAPS.

00000042    2.92754626    [5220] [0x00001464:0x000019ac][CheckDirect3DDevice9] IDirect3DDevice9::Present 0x727fa064 (C:\Windows\system32\d3d9.dll:0x727b0000)

Посмотрим, что же находится по адресу 0x727fa064:
fraps
Видите этот замечательный jmp fraps32.xxxxxxxx? FRAPS не стесняясь патчит код в d3d9.dll. Причем делает это не с первой инструкуции метода IDirect3DDevice9::Present.

Перейдем к DxTory. Ситуация аналогична FRAPS. Код метода так же поправлен:
dxtorypng
Следующий Action!.

Небольшая сноска. Изначально я использовал OllyDbg 2.01. Вел он себя крайне плохо. Возможно причина тому Direct3D. Так или иначе я перешел на замечательный x64dbg, который не смотря на свой альфа статус прекрасно работает. Однако затем случился новый казус - Mirillis action! начал благополучно крашить тестовое приложение :) Разбираться с проблемами программистов из Mirillis я не стал.

action
Как видно из скриншота Action! поступает аналогичным образом. Единственное, безусловный переход на код Action - первая же инструкция.

Продолжение следует.

Profile

vedmysh
0xDEFACED

Tags

Latest Month

December 2017
S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
Powered by LiveJournal.com
Sponsored by Cisco