日期:2014-05-17  浏览次数:20911 次

搞了3年程序,还是菜啊,hack过war3或者其他DX程序的牛人请指点下,感激不尽
对于war3的“全屏”与“窗口”模式,我目前只知道是通过D3DPRESENT_PARAMETERS.Windowed参数来控制的
经过初步了解war3使用的是d3d8的接口,因此也就通过Direct3DCreate8诱捕COM方式实现的目标函数pD3D->CreateDevice(..),在创建设备时进行hack,修改为 自己想要的模式,在修改时发现问题,修改无效!

以下是我的war3的一些数据:
用Depends查看d3d8.dll偏移0xE880处是函数Direct3DCreate8,然后我这儿的d3d8.dll是动态载入的
【用“-windows”命令打开war3“窗口模式”,目标是修改为“全屏模式”】
1.断下LoadLibraryA,确定刚刚载入d3d8.dll的时候就对Direct3DCreate8下断
2.命中Direct3DCreate8后,执行到返回,COM对象家在进入内存,返回值EAX就是目标对象的地址,这个地址也就是指针pD3D了,进入它的虚表,找到pD3D->CreateDevice的地址(偏移0x3C处),在CreateDevice函数头部下断点,理论上不会错过任何一次创建设备的过程
3.对war3进行F9运行,命中CreateDevice,查看内存esp+4,开始依次是this指针,然后是其它的6个参数,列表如下
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
这里修改d3dpp的数据,即D3DPRESENT_PARAMETERS.Windowed,修改为0,然后F9继续运行

问题:发现依然无效,还是“窗口模式”
请了解的兄弟帮个忙,俺感激不尽!

------解决方案--------------------
其实你比其他人已经很强了,只是自己觉得还是菜鸟而已
------解决方案--------------------
已经很厉害了,楼主有很高的追求