开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 34457|回复: 90
收起左侧

[C/C++] 请教c++写得D3D透视-为何会出现这个问题-带图

[复制链接]
结帖率:22% (5/23)
发表于 2011-11-30 09:59:09 | 显示全部楼层 |阅读模式   广东省深圳市
透视在游戏中 使用一段时间后 电脑变得很卡(而且在非N显卡的电脑上无法成功开启)
而且 用不到多久 会弹出 错误 英文的 我看不懂哪是啥意思  
里面有几个代码 删掉的话就不会弹出错误 但是 某些功能无法使用

000.jpg
我怀疑可能是这里某处代码问题

以下是游戏里面的图(可以注入AVA  CF 全球使命 绝地反击 突击风暴 csol 等 凡是跟dx9扯上关系的游戏都可以注入
(包括 跑跑卡丁车 飞车 这些 哈哈 不过没用哈  因为是D3D HOOK 渲染的 所以凡是跟d3d9扯上关系的都OK)
不过如果游戏做了反检测 什么的就不好说了 比如 CF的230 狼队的 5330 AVA的MESS -- 不过我事针对火力突击做的 腾讯的新FPS游戏 还不错!

001.jpg

003.jpg

002.jpg

004.jpg

希望谁能告诉下我 为何 仅只能在N显卡上使用的问题

以下是DLL
d3d-hook.rar (11.25 KB, 下载次数: 1223)

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:80% (4/5)

签到天数: 23 天

发表于 2011-11-30 10:07:50 | 显示全部楼层   河南省洛阳市
哇塞,好厉害哦。
回复 支持 反对

使用道具 举报

结帖率:23% (3/13)
发表于 2011-11-30 10:29:52 | 显示全部楼层   广东省梅州市
牛逼裤衩,还在这请教。瀑布汗了
回复 支持 反对

使用道具 举报

发表于 2011-11-30 10:48:11 | 显示全部楼层   辽宁省沈阳市
表示不会 {:3_233:}
回复 支持 反对

使用道具 举报

结帖率:22% (5/23)
 楼主| 发表于 2011-11-30 18:03:32 | 显示全部楼层   广东省深圳市
{:soso__3787786521799435725_3:}
{:3_244:} 求方法
回复 支持 反对

使用道具 举报

发表于 2011-11-30 18:13:35 | 显示全部楼层   广东省深圳市
厉害...求教下怎么HookD3D绘图函数啊
GetProcAddress找不到
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2011-12-1 08:59:32 | 显示全部楼层   贵州省贵阳市
你QQ多少 我可以解决A卡 还有全透!
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
发表于 2011-12-20 17:09:24 | 显示全部楼层   福建省龙岩市
1:d3d的初始化
LPDIRECT3D9  g_pD3D=NULL;//d3d对象
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;//d3d设备对象
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;//顶点缓冲

//初始化D3D
HRESULT InitD3D(HWND hWnd)
{
//创建D3D
g_pD3D=Direct3DCreate9(D3D_SDK_VERSION);
//填充D3DDevice结构
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
//创建D3DDevice
g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pd3dDevice);

//初始化几何数据
HRESULT InitGeometry()
{
//初始化顶点数据
CUSTOMVERTEX g_Vertices[]= { {-1.0f,-1.0f,0.0f,0xffff0000,}, {1.0f,-1.0f,0.0f,0xff0000ff,}, {0.0f,1.0f,0.0f,0xffffffff,}, };
//创建顶点缓冲区
g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,&g_pVB,NULL)
//填入顶点数据
VOID*pVertices;
g_pVB->Lock(0,sizeof(g_Vertices),(void**)&pVertices,0)
returnE_FAIL;
memcpy(pVertices,g_Vertices,sizeof(g_Vertices));
g_pVB->Unlock();
//渲染函数
VOID Render()
{
   pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
   pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER);//更改这两个渲染状态就可以实现透视功能
   //清空缓冲
  g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->BeginScene()
//在BeginScene后台缓存绘制图形
//开始绘制图形
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
g_pd3dDevice->EndScene();
//在EndScene结束后台缓存渲染图形
//在这可以得到我们的颜色,画准心。
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);//将后台缓存绘制的图形提交到前台缓存显示
}

//清理资源
VOID Cleanup()
{
g_pVB->Release();//释放顶点缓存对象
g_pd3dDevice->Release();//释放设备对象
g_pD3D->Release();//释放d3d对象
}


下面是一篇网上的透视源码作简要注释



bool StartDll=1;
bool WallHack=1;//定义布尔变量用来判断是否开启透视功能
typedef HRESULT(WINAPI* DrawIndexedPrimitive_)(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, UINT StartIndex, UINT PrimitiveCount);//从这开始是detours hook com接口需要的参数,后面有如何用detours hook com接口的方法,这里定义了一个类型
DrawIndexedPrimitive_ pDrawIndexedPrimitive;

HRESULT WINAPI nDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinIndex,UINT NumVertices, UINT StartIndex, UINT PrimitiveCount)//我们的hack函数。
{   

  IDirect3DVertexBuffer9* pStreamData = NULL;
  UINT iOffsetInBytes,iStride;   
  pDevice->GetStreamSource(0,&pStreamData,&iOffsetInBytes,&iStride); //用来获取stride,前面是定义这个函数的三个参数

  if (  iStride == 40 &&WallHack==1)//这里进行透视判断,当stride=40,WallHack=1时开启透视,如果我们不知道游戏人物的stride,可以增加一个变量把40替换掉,用自加来判断人物st
  {
      pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);//这里是更改渲染状态,禁用z轴,实现透视的方法,这应该都知道吧。
      pDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER);
                //再给一种写法,两种效果是不一样,下面的人物自身不会透视,看不到自身的结构。
                pDevice->SetRenderState(D3DRS_ZENABLE,false);
      pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
                pDrawIndexedPrimitive(pDevice,Type,BaseVertexIndex, MinIndex, NumVertices, StartIndex,
      PrimitiveCount);
      pDevice->SetRenderState(D3DRS_ZENABLE,true);
                pDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
  }
     
      
   return pDrawIndexedPrimitive(pDevice, Type, BaseVertexIndex, MinIndex, NumVertices, StartIndex, PrimitiveCount);//返回值
                        
         
}

int StartHack ();



BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call, LPVOID lpReserved )//这是默认的 DLL格式
{
    if (StartDll)
   {
      StartDll=0;
       CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)StartHack, NULL, NULL, NULL);                 
   }
   return TRUE;
}

int StartHack ()//取tb,方法不止一种,我们也可以通过d3d对象来取tb数组,取hook函数位置,自己可以打开d3d头文件数数是在第几个~~
{
   char s[1000];
   DWORD offsetBase=0x4FE571A0;
   for(;; Sleep(500))
        {
               offsetBase=(DWORD)GetModuleHandle ("d3d9.dll");
            if (offsetBase)            
               break;            
        }

   DWORD a[2];
   a[0]=offsetBase+0x88840;
   sprintf (s,"[Noobshooter] Module d3d9 =%08X,Offset FuncHook =%08X",offsetBase,a[0]);
   OutputDebugString (s);
   pDrawIndexedPrimitive = (DrawIndexedPrimitive_)DetourFunction((PBYTE)a[0],(PBYTE)nDrawIndexedPrimitive);//进行绕到我们的函数,参数,地址,我们的函数

   for (;;Sleep (500))//按键的判断
   {
      if (GetAsyncKeyState (VK_F9)!=0)
      {
         Beep (2000,200);
         Wallhack=1;
      }
      if (GetAsyncKeyState (VK_F10)!=0)
      {
         Beep (3000,200);
         WallHack=0;
      }
   }
   return 1;

这是detours1.5用来hook com接口的格式
HRESULT STDCALL (*pfSeekTrampoline)(
   IStream * This,
   LARGE_INTEGER dlibMove,
   DWORD dwOrigin,
   ULARGE_INTEGER *plibNewPos);

HRESULT STDCALL SeekDetour(   
   IStream * This,
   LARGE_INTEGER dlibMove,
   DWORD dwOrigin,
   ULARGE_INTEGER *plibNewPos)
{
   return pfSeekTrampoline(This, dlibMove, dwOrgin, plibNewPos);
}

void detour_member_function(IStream *pi)
{
   (*(PBYTE*)pfSeekTrampoline) = DetourFunction(
      (PBYTE)pi->lpVtbl->Seek,
      (PBYTE)SeekDetour);
};
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
发表于 2011-12-20 17:11:42 | 显示全部楼层   福建省龙岩市
哎。。。网上去找下,如果不行的话,去独*团  找   人生的路     他也在研究这个  而且是个高手
回复 支持 反对

使用道具 举报

发表于 2012-1-10 10:39:58 | 显示全部楼层   内蒙古自治区巴彦淖尔市
...哈哈哈,支持!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表