在游戏中显示自己的文字和图形的方法

用Direct3D实现一个图片浏览器(支持多图层显示、图层拖动、旋转) Direct3D技术在图像处理、游戏开发等领域用得非常广泛,这里给大家讲解怎么用Direct3D API开发一个简单的图片浏览器。这个图片浏览器的功能有:图像显示,在视图区拖动图层、改变图层大小、图层旋转。先提醒一下,阅读该篇文章的读者最好具有一点D3D的开发基础,因为这篇文章不会讲Directshow的基础知识。如果你完全没有学过Direct3D,建议先学习一下一些Direct3D的入门教程(比... 阅读详情

Hook Directx:在游戏中显示自己的文字和图形的方法

这个方法出自我大概两年前的一个项目,现在经整理后贴出来和大家分享一下,利用该方法可以在一般的directx游戏里面绘制文本甚至图形对象.
其实思路上非常简单,大致是这样的:要在directx中绘制文字和各种图形对象,只要获得一个类型为LPDIRECT3DDEVICE9的设备对象指针.怎样获得这个指针呢?我的方法是首先hook掉Direct3DCreate9以获得类型为LPDIRECT3D9的Direct3D对象的接口指针,这个Direct3D对象有一个成员函数为 IDirect3D9::CreateDevice,设备对象指针就是在这个函数里面创建的.所以,只要根据Direct3D对象接口指针找到Direct3D对象的虚函数表,再根据虚函数表确定IDirect3D9::CreateDevice的内存地址,就可以hook这个函数,从而获得类型为LPDIRECT3DDEVICE9的设备对象指针,然后就可以随意绘制文字或者图形了.
还有一个要hook的地方,即IDirect3DDevice9::Present,这个函数用于交换当前后备缓存区,刷新窗口.要使得我们自己绘制的东西一直显示在屏幕上,比较好的处理方法是hook掉IDirect3DDevice9::Present,在程序真正调用这个函数前插入我们自己的绘制代码.只要根据设备对象指针找到设备对象的虚函数表,根据虚函数表找到IDirect3DDevice9::Present在内存中的地址就可以hook了.下面是对hook directx的详细说明.
首先是找到Direct3DCreate9的内存地址,然后把入口的5个字节修改为跳转指令.
 

   pC=GetProcAddress(GetModuleHandle("d3d9.dll"),"Direct3DCreate9");//获得内存地址
    DWORD oldpro=0;
    memcpy(d3dcen5bytes,pC,5);
    VirtualProtect(pC,5,PAGE_EXECUTE_READWRITE,&oldpro);
    *(BYTE*)pC=0xe9;//0xe9在汇编中是跳转指令操作码
    *(DWORD*)((BYTE*)pC+1)=(DWORD)hookedDirect3DCreate9-(DWORD)pC-5;//目标地址-原地址-5




这样,在程序运行到Direct3DCreate9时就会跳转到hookedDirect3DCreate9,在这个函数中,首先是还原Direct3DCreate9入口的5个字节,然后调用真正的Direct3DCreate9,如果函数调用成功,就会返回类型为LPDIRECT3D9的Direct3D对象指针,这正是我们所需要的,得到这个指针后,就可以根据Direct3D对象的虚函数表确定IDirect3D9::CreateDevice的内存地址,然后就可以把这个函数入口的5个字节修改成为跳转指令,跳到我们自己的函数中去. 有个地方值得注意的是,在directx的虚函数中把this指针作为第一个形参入栈了.例如说sdk中IDirect3D9::CreateDevice的函数说明是这样:

HRESULT CreateDevice(
  UINT Adapter,
  D3DDEVTYPE DeviceType,
  HWND hFocusWindow,
  DWORD BehaviorFlags,
  D3DPRESENT_PARAMETERS * pPresentationParameters,
  IDirect3DDevice9 ** ppReturnedDeviceInterface
);




而为了程序跳转到我们的代码执行完后保持栈的平衡,hookedDirect3DCreat9函数声明应该是这样:

HRESULT _stdcall hookedCreateDevice(
                                  LPDIRECT3D9 pDx9,
                                  UINT Adapter,
                                  D3DDEVTYPE DeviceType,
                                  HWND hFocusWindow,
                                  DWORD BehaviorFlags,
                                  D3DPRESENT_PARAMETERS * pPresentationParameters,
                                  IDirect3DDevice9 ** ppReturnedDeviceInterface

                                  );



其中的LPDIRECT3D9 pDx9就是this指针.

hookedDirect3DCreate9的关键代码如下:

pCdev=(void*)*(DWORD*)(*(DWORD*)m_pD3D+0x40);//获得IDirect3D9::CreateDevice的地址指针

        DWORD oldpro=0;
        memcpy(devcen5bytes,pCdev,5);//保存IDirect3D9::CreateDevice入口5个字节
        VirtualProtect(pCdev,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pCdev=0xe9;
        *(DWORD*)((BYTE*)pCdev+1)=(DWORD)hookedCreateDevice-(DWORD)pCdev-5;

在hookedCreateDevice中,首先还原原来的CreateDevice函数入口的5个字节,然后调用原来的函数, IDirect3D9::CreateDevice的最后一个参数是一个二重指针,如果函数调用成功,这个二重指针所指向的指针就是我们所需要的设备对象指针,由此找到设备对象的虚函数表,然后确定IDirect3DDevice9::Present的内存地址,然后又可以改掉入口的5个字节为跳转指令. hookedCreateDevice的关键代码如下:
pPre=(void*)*(DWORD*)(*(DWORD*)m_pDevice+0x44);//获得IDirect3DDevice9::Present的地址指针
        memcpy(pren5bytes,pPre,5);//保存IDirect3DDevice9::Present入口的5个字节
        DWORD oldpro=0;
        VirtualProtect(pPre,5,PAGE_EXECUTE_READWRITE,&oldpro);
        *(BYTE*)pPre=0xe9;
        *(DWORD*)((BYTE*)pPre+1)=(DWORD)hookedPresent-(DWORD)pPre-5;

实际上这几个函数的hook都是同样的道理,现在,当程序运行到IDirect3DDevice9::Present后又会跳转到hookedPresent,而我们自己的绘制代码就是放在hookedPresent里面.在执行完自己的绘制代码后再调用原来的IDirect3DDevice9::Present.我的hookedPresent的关键代码如下:
char strdraw[]="The drawing in directx game\nAuthor:RunJin\nEmail:pediy3000@hotmail.com";
            DrawMyText(pDxdevice,strdraw,sizeof strdraw-1);//绘制文本
            //在这里写入您的其它绘图代码


再来看看其中的DrawMyText,这个函数是我的绘制文本的函数:
BOOL _stdcall DrawMyText(LPDIRECT3DDEVICE9 pDxdevice,TCHAR* strText ,int nbuf)
{

    if(m_pD3D && pDxdevice){

        RECT myrect;
        myrect.top=150;  //文本块的y坐标
        myrect.left=0; //文本块的左坐标
        myrect.right=500+myrect.left;
        myrect.bottom=100+myrect.top;
        pDxdevice->BeginScene();//开始绘制

        D3DXFONT_DESCA lf;
        ZeroMemory(&lf, sizeof(D3DXFONT_DESCA));
        lf.Height = 24; //字体高度
        lf.Width = 12; // 字体宽度
        lf.Weight = 100; 
        lf.Italic = false;
        lf.CharSet = DEFAULT_CHARSET;
        strcpy(lf.FaceName, "Times New Roman"); // 字型
        ID3DXFont* font=NULL;
        if(D3D_OK!=D3DXCreateFontIndirect(pDxdevice, &lf, &font)) //创建字体对象
            return false;

        font->DrawText(
            NULL,
            strText, // 要绘制的文本
            nbuf, 
            &myrect, 
            DT_TOP | DT_LEFT, // 字符居左显示
            D3DCOLOR_ARGB(255,255,255,0)); 

        pDxdevice->EndScene();//结束绘制
        font->Release();//释放对象
    }
    return true;
}


后记: 代码是以前写的,因此文章就按照着代码来讲.然而现在看来,把函数入口点的5个字节改成跳转指令这种hook方法并不是那么好,其实可以直接改掉虚函数表中的函数指针,这样更加的安全保险.

Hook D3D实现内部上色-dx9 与 dx11的上色封装 【代码】Hook D3D实现内部上色-dx9 与 dx11的上色封装。 阅读详情

相关推荐

D3D8 hook 游戏屏幕写入文字

可以在D3D8的游戏中写入自己的文字。hook 了IDirect3DDevice8::EndScene 来实现屏幕写字。希望对这方面感兴趣的童鞋有所帮助。 该示例由PowerBasic编写,很容易读懂。

C++实现HOOK D3D绘制函数,实现透视,上色

只要是D3D游戏肯定会走D3D绘制函数,学会就能干掉所有D3D,实现透视。深刻理解HOOK的原理,理解D3Dhook原理,如何关闭Z缓冲,筛选人物模型,人物上色,注入器的写法,人物模型工具的写法。

纯源码 D3DHOOK绘制例子 简单易懂-易语言

纯源码 D3DHOOK绘制例子 简单易懂 逻辑清晰 适合学习D3DHOOK的朋友 相关的函数可以自行扩展 达到自己想要的效果 游戏里面也可以使用,Z缓冲可以达到穿透模型遮挡 另外附上CSGO注入代码( 某些程序HOOK了一些函数导致无法注入,我这里给出一个解决办法 ) 部分代码借鉴前辈,大牛勿喷. 如果对你有用,请给个好评呗 木木哒

Hook Directx:在游戏中显示自己的文字和图形的方法

<br />这个方法出自我大概两年前的一个项目,现在经整理后贴出来和大家分享一下,利用该方法可以在一般的directx游戏里面绘制文本甚至图形对象.<br />其实思路上非常简单,大致是这样的:要在directx中绘制文字和各种图形对象,只要获得一个类型为LPDIRECT3DDEVICE9的设备对象指针.怎样获得这个指针呢?我的方法是首先hook掉Direct3DCreate9以获得类型为LPDIRECT3D9的Direct3D对象的接口指针,这个Direct3D对象有一个成员函数为 IDirect3D9:

shenmingda的专栏 1万+

hook d3d写屏

hook d3d写屏

001-D3d9HOOK环境搭建及d3d文字输出-代码.zip_d3d9_d3d9 sdk_dnf台服 d3dHOOK_dx11

DXSDK_Feb10_DX11SDK配置 d3d9文字写屏测试

pygame显示图片的方法_day10-pygame图片、文字的显示,图形的绘制

1.pygame1.1初始化pygame.init()1.2.创建窗口set_mode((宽度,高度))screen = pygame.display.set_mode((600,400))1.3.游戏循环while True:#检测窗口上的按钮是否被点击for event in pygame.event.get():if event.type ==pygame.QUITcolse()2、显示文字...

weixin_31955465的博客 544

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

pygame显示图片的方法_day_10 pygame文字图片图形显示

1.pygame的显示流程1.初始化2.创建游戏窗口3.游戏循环# 1.初始化pygamepygame.init()# 2.创建游戏窗口# set_mode((宽度, 高度))screen = pygame.display.set_mode((600, 400))# 3.游戏循环while True:# 检测事件for event in pygame.event.get():# 检测窗口上的关闭按...

weixin_35530964的博客 782

PMBus协议解析:基于I2C的电源管理实战与TMS320F28003x驱动开发

在嵌入式系统与服务器电源设计中,数字电源管理总线是实现高效、可靠电源监控与控制的关键技术。PMBus协议基于广泛应用的I2C总线物理层,通过定义标准化的命令集、数据格式与时序规范,为多路电源的电压电流监控、动态调整及故障处理提供了高效解决方案。其技术价值在于通过硬件自动处理协议解析、时钟拉伸与中断,显著降低软件复杂度,使开发者能聚焦于电源环路设计等核心逻辑。该协议广泛应用于服务器、通信基站及高性能计算板卡等场景,通过引入数据包错误检查、专用告警线等机制,确保了电源管理的可靠性。本文以TI TMS320F28

weixin_29189377的博客 374

BQ27220燃料计量芯片与Arduino库kode_bq27220实战指南

燃料计量(Fuel Gauge)是嵌入式电池管理系统的核心技术,通过电压、电流、温度多维建模实现荷电状态(SOC)与健康状态(SOH)的动态估算。其原理基于电化学阻抗补偿算法(如CEDV),区别于简单电压查表法,具备自学习与老化适应能力。该技术显著提升便携设备续航预测精度与低功耗可靠性,广泛应用于TWS耳机、可穿戴设备及医疗电子等场景。本文围绕TI BQ27220高精度燃料计量IC及其配套Arduino库kode_bq27220展开,覆盖硬件连接规范、I²C初始化要点、SOC/SOH实时读取、EDV阈值配置

weixin_35671843的博客 329

08 图形特效与文字显示

摘要 使用 XNA Framework 设计游戏程序的时候可以利用 SpriteBatch 类别提供的功能显示游戏的内容供用户检视,SpriteBatch 类别提供了丰富的功能协助游戏程序绘制图画和文字,包括对所输出的图画和文字加入特殊的效果,例如放大/缩小、旋转、设定透明度、水平/垂直翻转、以及图层深度等游戏程序常常需要表现的效果。在这一篇文件中,我们将会为大家介绍利用 SpriteBatch

Samurai54 的专栏 1075

Couldn‘t find device with uuid 恢复LVM元数据 linux

Couldn't find device with uuid 恢复LVM元数据 linux欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使

m0_57559579的博客 7164

pygame基础 学习笔记 (03-显示文字)

效果: 代码:

ChaoChao66666的博客 2678

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2392

AXI4协议之AXI4-Lite接口详解及实战

本文首先对AXI4总线协议进行了一个简单的介绍,然后使用vivado提供的模板创建了一个AXI4-Lite Master的接口,并生成了一个具有Master和Slave的代码实例,阅读该示例代码,进行修改后用于自己的项目。

高阶近似的博客 2万+

Java图形程序中的对话逐字显示实现

Java图形程序中的对话逐字显示实现 在现代,摒弃传统的会话方式,很多的图形广告或游戏采用了[逐字打印]的效果来展示文字,当然,这样做的目的无非是为了突出内容或吸引眼球。但是这种实现方式却是值得借鉴的,以下,我给出一个JAVA实现的简单用例,需要者可以自行扩充。代码实现: packageorg.test;importjava.awt....

weixin_30480583的博客 81

SAP PCE私有云MM02修改物料主数据基本单位报错

当前发现只有改为AAAADL(无量纲)单位时会报错,其他的正常。一开始以为配置的ISO码换算有问题,对配置排查后,排除配置问题。最后发现是PCE当前版本的原因,需要打上NOTE。SAP PCE私有云在没有库存和业务单据的情况下,MM02修改物料主数据基本单位报错“EA CPZP MK000000000000:PCS 不可转换为”,详见截图。点击【显示错误】,提示EA CPZP MK000000000000:PCS 不可转换为。从SAP FOR ME下载NOTE 3531359,链接。

dingqing86的专栏 519

Python-游戏开发

pygame是一组用来开发游戏的Python程序模块,它是在SDL库的基础上开发的。用户可以利用它,在Python程序中创建功能丰富的游戏和多媒体程序。pygame是一组高可移植性的模块,可以支持多个操作系统,非常适合小游戏的开发。SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言编写而成。

qq_42759120的博客 724

人工智能---什么是Transformer?

Transformer是一种强大的神经网络架构,最初由Google的研究人员在论文《Attention is All You Need》中提出,用于自然语言处理任务,特别是在机器翻译方面取得了巨大成功。Transformer的核心思想是完全基于自注意力机制(self-attention mechanism)来实现序列到序列(sequence-to-sequence)的学习。它在自然语言处理(NLP)和其他序列到序列任务中表现出色,逐渐成为该领域的主流模型。近些年也逐渐在自动驾驶领域有所应用。

智能汽车人的博客 3954

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python游戏课程笔记·嵩天

Python游戏课程笔记 import pygame,sys sys是Python标准库 sys.exit()用于结束游戏并退出 pygame.init()初始化创建 screen = pygame.display.set_mode((600,400))窗口设置 pygame.displa.set_caption(“Python游戏之旅”)标题 图像.get_rect()返回一个覆盖图像的矩形Rect对象 width,height ball = pygame.image.load()载入图像,支持jpg,p

zhj12399的博客 684

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python心理学实验程序_心理学实验程序编程(python)

任务一:实现简单的屏幕的颜色之间的切换importpygamefrom pygame.locals import *pygame.init()win= pygame.display.set_mode((800,600),DOUBLEBUF|HWSURFACE)for i in range(10):win.fill((0,255,0))if i%2==0:win.fill((255,0,0))pyg...

weixin_39795268的博客 263

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

phaser.js 显示对象笔记

创建游戏容器需要几个基本参数,宽、高、第三个现在我还不造啥意思,div的id(应该是拿它来当游戏的容器的意思吧),一个总管对象(它至少包括preload,create两个方法) var game = new Phaser.game(w,h,Phaser.AUTO,"div的id",state); function state(game){ this.preload = functi...

weixin_30641465的博客 368

PyGame基础知识-Making Games with Python & Pygame

1. 例子 例1. 创建一个空窗口 import pygame, sys #退出用到了sys from pygame.locals import * #容易使用locals中的变量,但如果模块过多,容易产生混乱 pygame.init()#初始化,必须在使用pygame的其他函数之前调用 DISPLAYSURF = pygame.display.set_mode((400, 300))#创建

程序员 1500

【原创】pygame学习笔记(1)----基本的线,矩形,圆形,弧形绘制

PYgame的内容 (1)这个module很有意思 (2)书本至少来源于《Python游戏编程入门》 (3)官方权威说明:https://www.pygame.org/docs/   下面的尝试把各种图形在一个程序里绘制 注意点: (1)特别注意,比如引用color=0,0,200这种        要么是pygame.draw.line(screen,color,position...

奔跑的犀牛先生 1273

OpenGL入门学习

说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就

碗的成长记录 1876
上一篇: 检测并禁用隐藏服务
下一篇: 【原创】Win 7下定位kernel32.dll基址及shellcode编写
OSReact
博客等级 码龄14年 34粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值