Windows 2000 と XP で違う GDI 周りの処理
win32k.sys の HeapVidMemAllocAligned や VidMemFree の動作を見てて気づいたのだけど、XPと2000でgdi32 周りの処理が全然違うことが判明
Windows 2000が自前でこれらの関数を処理してるのに対して、XPは
dxg.sys と言うドライバをロードして、そこからドライバの関数ポインタに直接飛んでいる
call jmp_Dxapi.sys!_DxApiGetVersion@0 push SWCBF99F924_drivers_dxg_sys call EngLoadImage test eax,eax mov [LBF9B2BCC],eax jz LBF8A3B7C push SSZBF99F90C_DxDdStartupDxGraphics push eax call EngFindImageProcAddress push SSZBF99F8F4_DxDdCleanupDxGraphics push [LBF9B2BCC] mov [LBF9B2BD0],eax call EngFindImageProcAddress mov ecx,[LBF9B2BD0] test ecx,ecx mov [LBF9B2BD4],eax jz LBF8A3B83 test eax,eax jz LBF8A3B83 push [ebp+1Ch] mov eax,[LBF9A85E8] push LBF9B2BD8 mov [ebp-08h],eax lea eax,[ebp-18h] push eax push 0000000Ch lea eax,[ebp-0Ch] push eax push 0000000Ch mov dword ptr [ebp-0Ch],00050001h mov dword ptr [ebp-04h],LBF9A8490 call ecx mov esi,eax test esi,esi jl LBF8A3B88 mov eax,[ebp-10h] mov [LBF9B2BC8],eax xor eax,eax |
詳しく解説すると
dxg.sys の DxDdStartupDxGraphics を呼び出すと、関数ポインタの構造体のアドレスが返って来て、
アドレス+ 関数番号 x4 をコールすると利用できるようになってるようだ ・ω・
NtGdiDdAddAttachedSurface
NtGdiDdColorControl
NtGdiDdWaitForVerticalBlank
NtGdiDvpCanCreateVideoPort
NtGdiDvpColorControl
NtGdiDvpCreateVideoPort
NtGdiDvpDestroyVideoPort
NtGdiDvpFlipVideoPort
NtGdiDvpGetVideoPortBandwidth
NtGdiDvpGetVideoPortField
NtGdiDvpGetVideoPortFlipStatus
NtGdiDvpGetVideoPortInputFormats
NtGdiDvpGetVideoPortLine
NtGdiDvpGetVideoPortOutputFormats
NtGdiDvpGetVideoPortConnectInfo
NtGdiDvpGetVideoSignalStatus
NtGdiDvpUpdateVideoPort
NtGdiDvpWaitForVideoPortSync
NtGdiDvpAcquireNotification
NtGdiDvpReleaseNotification
NtGdiDxgGenericThunk
辺りがざっくりドライバに飛んでて面白い・ω・
実際のコード
LBF93D010: (NtGdiDvpGetVideoPortField) mov edi,edi push ebp mov ebp,esp mov eax,[LBF9B2BC8] pop ebp jmp [eax+000001FCh] nop nop nop nop nop LBF93D026: (NtGdiDvpGetVideoPortFlipStatus) mov edi,edi push ebp mov ebp,esp mov eax,[LBF9B2BC8] pop ebp jmp [eax+00000204h] Align 4 LBF93D03C: (NtGdiDvpGetVideoPortInputFormats) mov edi,edi push ebp mov ebp,esp mov eax,[LBF9B2BC8] pop ebp jmp [eax+0000020Ch] |
こんな感じ
一応解説しておくと、 gdi32.dll が win32k.sys のラッパーみたいになっている ・ω・
Comments