opengl32.dll调用SetPixelFormat挂死的自定义Hook与函数替换方案
可行的规避方案
按实现成本从低到高排序如下:
- 修改像素格式描述符初始化逻辑(最推荐)
你当前代码中将cColorBits设为0的写法会让ChoosePixelFormat匹配到无有效颜色通道的异常像素格式,直接将m_PixelFormatDescriptor.cColorBits设置为常用值(如24/32),同时给cDepthBits设24、cStencilBits设8,不要所有位数字段都填0,就能从根源避免匹配到会触发死循环的异常格式。 - 新增像素格式校验逻辑
在调用ChoosePixelFormat获取格式索引后、调用SetPixelFormat之前,先调用DescribePixelFormat查询该格式的红、绿、蓝、Alpha通道位掩码,如果存在任意通道掩码为0的情况,直接丢弃该格式,不执行后续的设置操作,就能规避死循环。 - Hook导出函数
wglDescribePixelFormat
不需要完全重写该函数的实现,只需要Hook后在系统原生逻辑执行完成后,额外校验返回的像素格式参数:如果出现通道掩码为0的情况,要么直接返回失败,要么手动补填合法的掩码值,即可避免后续流程进入死循环。 - 特征码扫描Hook未导出函数
MaskToBitsAndShift
你已经有该函数的完整汇编代码,可以提取前几字节作为特征码,扫描opengl32.dll的内存段找到函数入口,Hook后在函数开头增加参数校验逻辑:如果入参mask为0,直接给*shiftCount和*bitCount赋值0后返回,彻底解决死循环问题。
内容的提问来源于stack exchange,提问作者Sahib Khan
相关产品推荐
相关产品推荐

