首页
社区
课程
招聘
[原创]CoolCmd_通用D3D降压透视插件(附源码)
发表于: 2015-11-4 12:32 39547

[原创]CoolCmd_通用D3D降压透视插件(附源码)

2015-11-4 12:32
39547
bool GetD3DAdr(){
	bool bRet = false;
	LPDIRECT3D9         Tmp_pD3D = NULL; 
	LPDIRECT3DDEVICE9   Tmp_pd3dDevice = NULL; 
	if (NULL == ::GetModuleHandleA(D3D9DLLName)){
		goto Exit0;
	}
    if (NULL == (Tmp_pD3D = Direct3DCreate9(D3D_SDK_VERSION))){
		goto Exit0;
	}
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
	if (S_OK == Tmp_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,GetDesktopWindow(),
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp,&Tmp_pd3dDevice)){
		try{
			g_Adr_DrawIndexedPrimitive = *(PDWORD)(*(PDWORD)Tmp_pd3dDevice + g_Oft_DrawIndexedPrimitive);
			g_Adr_Present = *(PDWORD)(*(PDWORD)Tmp_pd3dDevice + g_Oft_Present);
			LogDbg("g_Adr_DrawIndexedPrimitive:%.8X g_Adr_Present:%.8X",g_Adr_DrawIndexedPrimitive,g_Adr_Present);
			bRet = true;
		}
		catch (...){	
		}
	}
Exit0:
    if( Tmp_pd3dDevice != NULL ){
        Tmp_pd3dDevice->Release();
	}
    if( Tmp_pD3D != NULL ){
        Tmp_pD3D->Release();
	}
	return bRet;
}
void __stdcall HookD3D9_DrawIndexedPrimitive_Mem(bool bHook)
{
	if (bHook){
		g_Stride = GetPrivateProfileInt(Ini_App,Ini_Key_Stride,CN_D3D_Stride,g_Cfg);
		g_KeyBoardSwitch =  GetPrivateProfileInt(Ini_App,Ini_Key_KeyBoardSwitch,0,g_Cfg) > 0 ? true:false;
		OldDrawIndexedPrimitive = (TDrawIndexedPrimitive)g_Adr_DrawIndexedPrimitive;
                //此处写内存即可实现Hook
		*(PDWORD)(*(PDWORD)(g_Param_DrawIndexedPrimitive) + g_Oft_DrawIndexedPrimitive) = DWORD(NewDrawIndexedPrimitive); 
	}
	else{
		OldDrawIndexedPrimitive = NULL;
                //此处写内存恢复Hook
		*(PDWORD)(*(PDWORD)(g_Param_DrawIndexedPrimitive) + g_Oft_DrawIndexedPrimitive) = g_Adr_DrawIndexedPrimitive; 
	}
	HookKeyBoard(bHook);
}
HRESULT __stdcall NewDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount)
{
	HRESULT hRet = S_OK;
	IDirect3DVertexBuffer9* pStreamData = NULL;
	UINT iOffsetInBytes,iStride;
	if(D3D_OK == pDevice->GetStreamSource(0,&pStreamData,&iOffsetInBytes,&iStride)){
		pStreamData->Release();
	}
	if(iStride == g_Stride){
		pDevice->SetRenderState(D3DRS_ZENABLE,FALSE);//禁用Z轴缓冲
		hRet = OldDrawIndexedPrimitive(pDevice,type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
		pDevice->SetRenderState(D3DRS_ZENABLE,TRUE );//恢复Z轴缓冲
	}
	else{
		hRet = OldDrawIndexedPrimitive(pDevice,type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
	}
	return hRet;  
}
void __stdcall HookD3D9_Present_Mem(bool bHook)
{
	if (bHook){
		g_CpuSleep = GetPrivateProfileIntA(Ini_App,Ini_Key_CpuSleep,0,g_Cfg);
		LogDbg("%d",g_CpuSleep);
		OldPresent = (TPresent)g_Adr_Present;
		*(PDWORD)(*(PDWORD)(g_Param_DrawIndexedPrimitive) + g_Oft_Present) = DWORD(NewPresent); 
	}
	else{
		OldPresent = NULL;
		*(PDWORD)(*(PDWORD)(g_Param_DrawIndexedPrimitive) + g_Oft_Present) = g_Adr_Present; 
	}
}
HRESULT __stdcall NewPresent(LPDIRECT3DDEVICE9 pDevice,const RECT *pSourceRect,const RECT *pDestRect,HWND hDestWindowOverride,const RGNDATA *pDirtyRegion)
{
	HRESULT hRet = S_OK;
	if (-1 == g_CpuSleep){		//黑屏,直接返回
		Sleep(168);
		return hRet;
	};
	//执行原函数
	hRet = OldPresent(pDevice,pSourceRect,pDestRect,hDestWindowOverride,pDirtyRegion);
	//Sleep降压
	if (g_CpuSleep > 0){
		Sleep(g_CpuSleep);
	}
	return hRet;
}
void __stdcall GetD3DParam_Hook()
{
	while (0 == g_Param_DrawIndexedPrimitive){
//这边如此操作,是为了降低被针对性Crc检测到概率
		HookDrawIndexedPrimitiveParam(true);
		Sleep(2);
		HookDrawIndexedPrimitiveParam(false);
		Sleep(168);
	}
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (45)
雪    币: 70
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
收藏,谢谢分享~~~~
2015-11-4 12:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
你这个降压过头了,不兼容大漠插件~
2015-11-4 12:58
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
源码都在,你可以在往下层处理,想兼容难吗?
2015-11-4 13:01
0
雪    币: 7885
活跃值: (2285)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
收藏,下班后,慢慢看。。。
2015-11-4 13:03
0
雪    币: 245
活跃值: (294)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错学习了!!!!!
2015-11-4 13:12
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
我只是说你这个不兼容,我自然是兼容的而且完全不是在D3D层面上的(usermode DDI和dxg-mirror层),毕竟你这个只能用于D3D9~

现在高端都D3D11什么的了~
2015-11-4 13:36
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
和大漠插件不兼容应该是Hook点有冲突,源码在所以处理下应该就可以了

没遇到DX11的网游,不过按常规说都是针对DX接口的,修改下支持应该不成问题

就是随手做的插件 做示范的 没考虑那么多 源码和思路都提供了,想兼容或支持DX11可以自助修改的

至于你的,等免费开源时候,再涨涨姿势了
2015-11-4 13:59
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
等淘汰了就开源~
2015-11-4 14:03
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
mark 感谢开源,
2015-11-4 14:03
0
雪    币: 90
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
大神都辣妈这么腻害,透视好还是自瞄好啊
2015-11-4 14:55
0
雪    币: 385
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
"不稳定又易被Crc检测"
改jmp方式hook会造成游戏崩溃?
虚表能完全躲过检测?
所以不知道楼主发这贴和网上其他资源有何区别
2015-11-5 01:50
0
雪    币: 163
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
Mark
2015-11-5 04:40
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
我来给你解惑一下

JMPHOOK如果不在游戏循环中,而是在自己的空白线程中处理很容易造成崩溃

虚表是完全可以做到躲避检测的  我发了源码和思路  不代表发了我自己用的插件  
目前发的是完全接口层的  如果你动动手 再往下面处理 其实可处理的地方太多了 有什么过不了检测的?

理解了才会发现区别
2015-11-5 09:04
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
想起个事  把配置文件的ParamType=1 就可以兼容大漠插件了  源码里面都有.
2015-11-5 09:06
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2015-11-5 10:46
0
雪    币: 385
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
什么方式去hook崩溃是代码问题,不是区别所在
虚表hook能否躲检测那也要看游戏而论,如你所说可以处理的地方太多了,jmp方式难道就真的找不到没crc的地址来写hook?

别人发的正常代码  你也发的正常代码,本来没什么事,为什么就被说成你的代码比较好 别人的代码很多不足容易出错一样
2015-11-5 12:32
0
雪    币: 102
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持开源,谢谢。
2015-11-5 13:01
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
别HOOK函数前五个字节即可,不用这么麻烦。
2015-11-5 13:39
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
无论代码怎么写 对于频繁调用的函数 虚表HOOK一定比JMP HOOK稳定
虚表HOOK可以不用改任何代码,通杀所有游戏  DX不少地方有虚表复位机制 灵活利用下即可
你非要去改代码以及针对游戏去规避检测去实现那尽可以去这么做  

我说比其他市面上发出的好  自然是有道理  至于实际上好不好 我说了不算 你说了也不算 实际用的人自然知晓
2015-11-5 15:51
0
雪    币: 385
活跃值: (162)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
jmp最多也就涉及到一个写hook时线程eip问题  这不是代码问题是什么
“虚表HOOK一定比JMP HOOK稳定”  不知道结果是怎么得来的  经过了几千万次的jmphook和虚表hook操作对比还是..?

虚表hook是可以实现通杀你所说类似的游戏功能,但不代表能通杀检测,所谓灵活运用还不是要针对游戏检测去修改代码, 你试试随便找个游戏写个透视 保证其他所有游戏都能不被检测且以后都能一直稳定下去?

我说和其他市面上的代码一样  自然是有道理的  至于实际上好不好 反正我俩说的都不算  我没用自然不知晓
2015-11-5 21:04
0
雪    币: 6
活跃值: (1509)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
很多东西 ,我以前就想到了,听作者解说下就知道,V大他们一边卖培训教程工具,一边又被某些游戏公司高薪请去解决游戏问题,实在是两手都要拿,不放下啊,呵呵
  作者终于慢慢的放干货了,东西有参考价值啊
2015-11-5 21:28
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
23
关于HOOK  就像你说的JMP要处理线程EIP  
一个非要加条件A 条件B 才能去执行C,你处理EIP一定稳定?
一个是不要任何条件直接执行C  不需要AB条件而且更稳定,哪个好,有点理解力的都能明白吧

就事论事  按我的说的思路去处理虚表HOOk,已经可以实现市面上所有DX网游通用的不被检测的透视插件了  有何问题?
2015-11-5 22:05
0
雪    币: 100
活跃值: (64)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
24
说的好像是被游戏公司邀请  而不是被做外挂邀请去似的

从另个角度看,也说明技术大牛到哪都吃香@~
2015-11-5 22:09
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
25
能想到的虚表hook比jmphook稳定的原因有2个:
a.虚表hook 貌似32位是4字节,64位 8字节 于是可以InterlockedExchange于是稳定了很多。
b.虚表hook 相对于jmp需要反汇编引擎配合,简单容易很多。
加上大部分jmp hook的引擎,都很粗糙,so 稳定了很多。

but 木有虚表的地方还是要靠jmp hook的~
2015-11-5 22:43
0
游客
登录 | 注册 方可回帖
返回
//