admin管理员组

文章数量:1531251

2024年7月2日发(作者:)

MicrocomputerApplicationsVo1.31,No.7,2015 

文章编号:1007—757X(2015)07—0022-05 

研究与设计 微型电脑应用2015年第31卷第7期 

DirectX 10图形应用程序截获技术的研究 

李一天 

摘要:DirectX是主流图形API,在多媒体、娱乐等领域得到广泛应用。为实现图形表面的跨进程共享,从DirectX 10开 

始使用DirectX图形基础架构(DXGI)对图形硬件进行底层管理。DXGI带来性能提升的同时也给图形应用程序的截获 

工作带来困难。为完成DirectX 10程序的拦截,需要同时截获多个图形库的函数。针对此问题,完善DLL替换+Detours 

的图形应用程序截获框架,克服现有截获技术的缺陷,完成DirectX 10程序的截获工作,并解决因DXGI、D3D10图形库 

间依赖关系产生的进程死锁问题。最后,基于该截获框架,开发出一套单机驱动的多投影显示系统,DirectX 10程序不需 

做任何修改就能多投影显示。实验结果表明,使用所提出的截获技术后图形应用程序画面流畅,运行稳定。 

关键词:函数截获;Detours;多投影显示 

中图分类号:TP393 文献标志码:A 

0引言 

图形应用程序主要使用两种图形库:Direct3D图形库和 

OpenGL图形库。Direct3D由微软开发,在微软平台 

(Windows和Xbox)上提供图形应用程序开发接口。 

OpenGL定义了一套跨平台、跨语言的图形应用程序编程接 

口。由于多数图形应用程序可以在Windows平台上使用 

1相关截获技术 

Windows API拦截(Hook)的机制有2种,分为内核级 

的拦截和用户级的拦截『4_。内核级的拦截主要是通过一个内 

核模式的驱动程序来实现,它的功能强大,能捕捉到系统活 

动的任何细节,但实现难度也较大。而用户级的拦截则通常 

是在普通的DLL中实现整个API的拦截工作,本文讨论的 

即为用户级拦截。在Windows平台下拦截API函数一般有 

以下3种方法: 

(1)修改函数IAT(Import Address Table)表和ET 

(Export Table)表 

Direct3D运行,本文的讨论限定在Windows平台上,并以 

Direct3D为主。 

目前大多数操作系统以用户态动态链接库(Dynamic 

Linking Library,或DLL)的形式向应用程序提供大多数系 

统服务。对于图形服务而言,操作系统通过用户态的动态链 

接图形库(opengl32.d1l或d3d9.dl1)向应用程序提供图形绘 

制及显卡资源管理功能。 

在Window 32操作系统中,可执行文件是基于Microsoft 

设计的PE(Protable Executable)格式l2】,如图1所示: 

∞s遥符点 

pE装裁域 

Y.Mao提出DLL替换+Detours的截获技术_1],在不修 

改应用程序源代码和二进制镜像的前提下,可以截获D3D9 

代码毅 

初始化数据 

图形库所有函数。从DirectX 10开始,DirectX使用DirectX 

Graphics Infrastructure(DXGI)对图形硬件进行底层管理_zJ口 

为完成对DirectX 10图形应用程序的拦截,需要同时截获多 

j禽入竭数的敬攒信息 

输出蠡数的数摧信息 

个图形库的函数,加大了截获难度。例如,若想截获图形应 

用程序的帧缓存更新(Present)以及绘制函数(Draw),我 

图1可执行模块的PE结构 

们必须同时完成对dxgi.dll和d3dl0.dll动态链接库的截获工 

作。 

综合以上情况,本文深入研究图形应用程序的截获技术 

以及DirectX 10多媒体绘制引擎的工作机理,设计DirectX 

10图形应用程序的截获框架,在不修改应用程序源代码和 

二进制镜像的前提下,完成DirectX 10图形应用程序的函数 

截获。 

为了测试截获技术的性能以及适用性,基于该截获框架, 

我们利用已有的多投影显示的几何校正、边缘融合算法[3],开 

每个PE文件的文件头都包含了该模块的输入函数入口 

地址表和输出函数入口地址表【5JI即IAT表和ET表。只要 

把输入表中目标API函数的地址改为替代函数的地址,那么 

当可执行模块调用该API函数时就会变成对替代函数的调 

用,从而实现API函数的拦截。这种方法比较容易实现,应 

用也很广泛。该方法缺点在于无法截获来自模块内部的函数 

调用。 

(2)修改API函数的入口指针 

程序的执行都是在内存中完成的,系统动态链接库 

发出一套单机驱动的多投影显示系统。该系统对DirectX 10 

(DLL)在程序运行时被动态地载入内存中。而每个API 

函数在DLL中都有自己固定的地址,只需要使用Win32 API 

函数GetProcAddress就可以得到需要拦截的API函数的入口 

程序是透明的,程序源码不需做任何修改就能多投影显示。 

实验结果表明,使用本文的截获技术后图形应用程序的画面 

流畅,运行稳定。 

地址。这种方法需要注意的是,在替换目标API函数之前, 

需要先保留API函数入口地址处的前几个指令字节。然后用 

作者简介:李一天(1990.),男,安徽省人,复旦大学,软件学院 硕士研究生,研究方向:计算机图形学,人机交互技术,上海,201203 

・22・ 

Micr0c0mputer Applications Vo1.31,No.7,2015 研究与设计 微型电脑应用2015年第31卷第7期 

JMP指令或1NT指令,直接或间接地跳转到替代函数的代 

码入口地址。在替代函数生命域结束前恢复目标API的前几 

个指令字节,保证其原来的程序正常运行。该方法缺点在于 

无法截获重定向前对目标函数的调用。 

并使用Detours替换orgd3d9.dU的绘制函数的前5个字节, 

将其重定向到d3d9.d1l中的绘制函数,完成对绘制函数的截 

获工作。 

2.2截获框架的拓展 

(3)动态链接库替换(DLL替换) 为了实现图形表面的跨进程共享,从Direct)(10开始使 

在Windows平台下,操作系统通过用户态的动态链接 

图形库向应用程序提供图形绘制及显卡资源管理功能,而应 

用程序是通过DLL的文件位置和文件名来加载DLL。DLL 

用DirectX图形基础架构,简称DXGI。DXGI提供了对图 

形硬件进行底层管理的功能如图3所示: 

替换使用一个与原始DLL相同导出函数的DLL(自定义 

DLL),截获应用程序对原始DLL的导出函数的调用。该 

方法不需要修改应用程序的源代码,且由于函数截获在应用 

程序运行前生效,应用程序在运行过程中对原始DLL导出 

函数的所有调用均可被截获。 

该方法的缺点是对于提供面向对象的接口,DLL替换 

只能以对象为单位进行截获,即为了截获某个对象的成员方 

法,必须截获该对象的创建方法,及该对象的所有公共成员, 

图3 DirectX图形基础架构 

因此开发截获库时工作量大。而且与系统兼容性差,图形库 

升级后,自定义DLL通常需要重新编写。 

2图形应用程序截获框架 

从DirectX10开始用DXG1对图形硬件进行底层管理f6J。 

使得不同D3D的API之间也能共享资源。DXGI的主 

要功能包括,枚举显示设备、创建管理交换链以及全屏模式 

的切换等【 。 

DXGI带来性能提升的同时,也给图形应用程序的截获 

工作带来困难。像交换链的创建、全屏模式切换等函数都是 

在DXGI图形库中定义的。为完成DirectX 10图形应用程序 

为完成图形应用程序的拦截,需要同时截获多个图形库的函 

数,加大了截获难度。针对此问题,本文完善DLL+Detours 

截获框架,完成对DXGI图形库、D3D10图形库中目标函 

的函数截获,多数情况下我们需要同时截获多个图形库。例 

如,若想截获图形应用程序的帧缓存更新以及绘制函数,我 

们必须同时完成对dxgi.dll和d3dl0.d11动态链接库的截获工 

作。 

数的截获工作,并解决因DXGI、D3D10图形库问依赖关系 

产生的进程死锁问题。 

2.1 DLL替换+Detours的截获框架 

针对此问题,本文对DLL替换+Detours的截获框架进 

行拓展,在不修改应用程序源代码和二进制镜像的前提下, 

Y.Mao提出DLL替换+Detours的截获技术[ ,在不修 

改应用程序源代码和二进制镜像的前提下,可以截获D3D9 

图形库所有函数。Detours是微软开发的一个函数库,以函 

数为单位进行截获,可以克服DLL替换的诸多缺点。Detours 

以函数为单位进行截获,截获时只需要知道目标函数在内存 

中的地址。根据该地址,Detours在运行时替换目标函数的 

截获dxgi.dll以及d3dl0.d1l中所有的函数。 

对DirectX 10图形应用程序的截获过程,如图4所示: 

斑掰程垮龆载 加蟪dxgi dt 

^dll 

B l 

屯d封 

Bdll 

d¨ 

e.dII 

前5个字节,将目标函数重定向到用户自定义的函数I8]。替 

换后DLL内部和外部对目标函数的所有调用将被截获。 

对DirectX 9应用程序绘制函数的截获过程,如图2所 

不: 

藏耀积F#加靛 加载d3d9 dt 

盘定j £.dl1 搬虢orgdxg[柑 自定义dxg1

dll 

I务 韧鳓化螭截I 细裁d3dl0

dl1

l DLL耕嫱化两投l 

 

orgdxgi.dl1 

I帻缓存楚耩函数I 

d3dl0.d1l 

I 绘制荫教 I 

图4 Direct3D 10函数截获框架 

Adll 

B I 

^. l 

B.d¨ 

^d 

BdH 

这里我们自定义DXGI动态链接库,在自定义dxgi.dll 

的初始化函数中加载D3D10图形库(d3dl0.dl1),并使用 

Detours完成对dxgi.dll以及d3dl0.dU目标函数的截获工作。 

自定义d3dg.dl1 加蛾 自定义鹕d9 dIl 

I D 婚他 l Orgd3d9 dl I DLL栅姥他两靛I 

} 绘制^曦散 l l 绐剐谴散 I 

Org以d9 dlt 

这里需要特别注意DLL间的加载顺序。在多线程环境 

下,DllMain里的代码容易引发线程死锁[ 。系统在装载DLL 

的时候会自动产生一个Loader Lock,避免多个DLL同时被 

l 蹬制醋毂 I 

图2 Direct3D 9绘制函数截获过程 

装载。LoaderLock从LoadLibrary函数调用的开始就自动加 

锁,直到DllMain退出为止。此时若DLL存在依赖关系, 

极易发生进程死锁。 

自定义动态链接库d3d9.dll具有与原始d3d9.dll相同的 

导出函数及文件名。我们将自定义d3d9.dll拷贝到与原始 

d3d9.dll同一文件夹下,同时将原始d3d9.d1l重命名为 

orgd3d9.dll。自定义d3d9.dll载入内存后程序自动调用其 

DLL初始化函数。此时我们加载原始的图形库(orgd3d9.dl1), 

例如,我们自定义D3D10图形库(d3dl0.dl1),在自 

定义的d3dl0.dl1中加载原始d3dl0.dll以及dxgi.dll,进而截 

获目标函数。系统在装载自定义d3dl0.dll时,自动加锁产 

・23・ 

MicrocomputerApplications Vo1.31,No.7,2015 研究与设计 微型电脑应用2015年第31卷第7期 

5总结 

本文完善DLL替换+Detours的截获框架,在不修改图 

ndows API—Technics of Hooking 

[4] 

Father H.Hooking Wi

API Functions On Windows[J].Assembly Programming 

Journal,2004,2f2). 

rek M.Peering Inside the PE:A Tour of the Win32 

[5] 

Piet

形应用程序源代码的情况下完成对DirectX 10库函数的截 

获工作。基于该框架,利用已有的多投影显示的几何校正、 

边缘融合算法,开发出一套单机驱动的多投影显示系统, 

Protable Executable File Format[J].Microsofl Systems 

Journa1.1994.9:27—30. 

DirectX 10图形应用程序不用做任何修改就能多投影显示。 

实验结果表明,该截获技术对图形应用程序的性能影响小, 

程序画面流畅,运行稳定。未来我们将研究DirectX 1 1图形 

应用程序的截获技术。 

n32 Portable Executable File Format.[EB/OL1. 

[6] 

Wi

https://msdn.microsoft.co m/en—us/library/ms809762.aspx 

2015.04. 

Library Best Practices[EB/OL1. 

【7] 

Dynamic—Link 

https://msdn.microsoft.corrden—us/library/windows 

参考文献 

毛燕东.面向单机驱动的多通道投影系统的图形应用程 

序移植与绘制技术[D].上海:复旦大学,2009:24-28. 

[2] 

DXGI Overview[EB/OE1.htt0s://msdn.microsoft.com/en 

us/library/bb205075一(vs.85).aspx.2015.04. 

[3] 

Jiang Z.Mao Y Qin B.et a1.A high resolution video 

display system by seamlessly tiling multiple projectors[C] 

/desktop/dn633971(v=vs.85).aspx,2015,03. 

 G.and Brubacher D.Detours:Binary interception of 

[8] 

Hunt

win32 functions[C].Proceedings of the 3rd USENIX 

Windows NT Symposium.1999:12—13. 

en C.and Michae1 L.Scott.Intercepting and 

[9】 

Hunt.Gal

Instrumenting COM Applications[C].Proceedings of the 

Fiflh Conference on Object.Oriented Technologies and 

Systems(COOTS’99).1999:45—5 6. 

(收稿日期:2015.04.17) 

6事c c c6 

IEEE Intemational Conference on Multimedia and Expo. 

2007:2070.2073. 

c c6 c6事c6 c c6莽c6 £ c6 c6 c £ c6 c6 c c6 c c c c6事c6事c6事c c6 c6 c6事c c c6 c6 c c c 

(上接第21页) 

图3(b)的复原结果。从图中可知,本文复原算法的 

重构效果更好,其保持了更加精细的边缘结构,见帽子边缘 

与头发,如图3(e);A算法的复原质量同样较好,见图3 

(d),但是视觉满意度度稍微略低于本文算法。而B算法的 

修复结果见图3(c),难以兼顾精细边缘与纹理。从图3(f) 

也可以看到,本文算法得到的复原图像梯度分布与真实图像 

更力口贴近。 

[6】 

徐焕宇,孙权森,李大禹.基于投影的稀疏表示与非局部 

正则化图像复原方法[J].电子学报,2014,42(7):1299—13 

04. 

[7] 

Liqian Wang,Liang Xiao,Jun Zhang.New image 

restoration method associated with tartlets shrinkage and 

4总结 

本文通过将权重因子与局部自回归约束融入到传统的 

高斯先验中,并结合SAR先验,建立了局部加权高斯.SAR 

联合先验模型,借助Bayesian推理,修复被损坏的图像。最 

weighted anisotropic total variation[J].Sinalg Processing, 

2013,93(4):661—670. 

[8] 

吴超,王勇,田洪伟.基于盲压缩感知模型的图像重构方 

法[-J].系统工程与电子技术,2014,36(6):1050—1055. 

 JF.Dong B.Osher S.Image restoration:Total 

[9] 

Cai

variation,wavelet frames,and beyond[J].Journal of the 

American Mathematical,2012,25(17):1033-1041. 

[10] Yuan Q.Zhang L.Shen H.Hyperspectral image 

denoising employing a spectral—spatial adaptive total 

终提出了局部加权高斯一SAP,联合先验模型的图像复原算法 

variation model[J].Geoscience and Remote Sensing, 

2012.50(101:3660—3667. 

Villenaa S.Vegaa M.Babacan S.D.Bayesian combination 

测试结果显示:与当前图像复原算法相比,局部加权高斯一 

SAR联合先验模型的复原视觉效果更好,其梯度分布吻合 

程度最好。 

of sparse and non—sparse priors in image super 

参考文献 

柬代群,朱浩,盛惠兴.一种基于视觉特性的彩色图像增 

强算法[JJ.计算机与现代化,2014,34(2):161—165. 

0 Minimization for wavelet 

[2] 

Zhang Y Dong B.Lu Z.1

resolution[J].Digital Signal Processing,2013,23(10): 

530.541. 

D.Molina R.Katsaggelos A.Variational 

[12] 

Babacan S.

Bayesian super resolution[J].IEEE Trans.Image Process, 

2011,20(4):984-999. 

frame based image restoration『J].Mathematics of 

Computation.82(20):995.1015. 

[3] 

李俊英,肖升.结合局部与非局部的图像复原方法[J].计 

算机应用研究,2014,32(5):56—60. 

et M.Historical document image 

[4】 

Hedjam R.Cheri

restoration using multispectral imaging system[J].Pa ̄em 

 M.WangZ.SSIM—inspired image 

[13] 

Rehman A.Rostami

restoration using sparse representation[J].Journal on 

Advances in Signal Processing,2012,20(1):1—12. 

k AC.No—reference image blur assessment 

[14] 

Chen MJ.Bovi

using multiscale gradient[J].Journal on image and video 

Recognition,2013,46f81:2297.23 12. 

ao L.Zhang J.New image restoration method 

[5] 

Wang L.Xi

processing,201l,l9(7):356—368. 

[15] 周景超,戴汝为,肖柏华.图像质量评价综述[J].计算机科 

学,2008,35(7):1-4. 

(收稿日期:2015.03.13) 

associated with te仃olets shrinkage and weighted 

anisotropic total variation[J].Signal processing,2013, 

93(4):661.670。 

・26・ 

本文标签: 截获函数应用程序图形