青果社区_青果网_青果论坛_无尽战区论坛  
  
展开

小喇叭     

全站
清唱。 说: 论坛开启邀请注册,邀请码可以关注公众号【青果趣味】发信息【邀请码】给公众号即可免费获取邀请码。
2017-09-14
全站
清唱。 说: 近期开启邀请码注册,请珍惜账号。
2017-08-29
查看: 328|回复: 6
收起左侧

[源码] vs2013 D3D9 HOOK透视源码原理带注入器 大部分带中文注释 可运行

[复制链接]
清唱。 (1)
发表于 2018-7-6 17:25:13 | 显示全部楼层 |阅读模式

这是一个创建于2018-7-6 17:25的主题,如果是[辅助类]帖可能已经失效建议不要下载(标注了永久性或者脚本类工具除外),其他类贴其中的信息可能已经有所发展或是发生改变,请自行甄别。

马上注册,拥有社区全部功能,享用更多特权,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
注意,源码并非易语言,是VS2013的,编译后就可以运行,而且大部分已经注释了中文。

D3D9的,也有快捷键屏蔽指定模型ID,看得懂就看哦。

vs2013 D3D9 HOOK透视源码原理带注入器 大部分带中文注释 可运行

vs2013 D3D9 HOOK透视源码原理带注入器 大部分带中文注释 可运行


下面是部分代码

[C++] 纯文本查看 复制代码
// hook.cpp : 定义 DLL 应用程序的导出函数。
// .cpp文件=代码书写区文件

#include "stdafx.h"
#include "hook.h"
#include "d3d9.h"  //引用D3D9
#include "stdio.h"  //引用还原需要的格式化


HHOOK hook_句柄 = NULL; //申请的全局变量  名为 hook_句柄 默认等于0 NULL=默认
WNDPROC 原属性 = NULL; //申请一个热键原属性变量
LONG 记录值 = NULL; //记录热键数按下的值 用于ID过滤 //过滤到500还是没有
HWND 目标句柄 = NULL; //全局变量目标句柄 也就是game的句柄 


//申明一个回调函数的地址 名为  Hook_地址 
LRESULT CALLBACK Hook_地址
(
int nCode,
WPARAM wPararm,
LPARAM lPARAM
){
        return CallNextHookEx(hook_句柄,nCode,wPararm,lPARAM);
        //返回钩子信息 参数1 钩子句柄 2hook地址参数的后3个参数
}


HOOK_API void hook_无尽() //申明子程序名为hook_无尽 hook_api=这个项目的名_api
{
        hook_句柄 = SetWindowsHookEx(WH_CBT,Hook_地址,GetModuleHandle(L"hook.dll"),0);
        //参数1 钩子类型 添加wh_cbt为全局钩子 任何进程的操作都会注入 整数型为5
        //参数2 回调函数地址 申明的回调子程序地址
        //参数3 实例句柄DLL 通过getModuleHandle获取dll的句柄 文本型前面要加L“文件名.dll”
        //参数4 线程ID 因为是注入式 直接写0 

}

HOOK_API void hook_卸载() //申明DLL的api子程序名字是hook_卸载() 
{
        UnhookWindowsHookEx(hook_句柄); //卸载这个hook,参数是hook时返回的句柄
        UnhookWindowsHookEx(hook_句柄); //卸载这个hook,参数是hook时返回的句柄
        SetWindowLong(目标句柄, GWL_WNDPROC, (LONG)原属性);
}

//热键回调的子程序
LRESULT CALLBACK 热键回调(HWND 目标句柄, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        CHAR tmp[512]; //申请一个字节
        if (uMsg == WM_KEYDOWN) //判断是否按下键位
        {
                if (wParam == VK_UP) //判断是否向上
                {
                        记录值 += 1; //给自己加1 等于 变量=变量+1
                }
                if (wParam == VK_DOWN) //判断是否向下
                {
                        记录值 -= 1; //给自己减1 等于 变量=变量-1
                }
                if (wParam == VK_LEFT) //判断是否向左
                {
                        记录值 += 5; 
                }
                if (wParam == VK_RIGHT) //判断是否向右
                {
                        记录值 -= 5;
                }
                sprintf_s(tmp, "顶点数: %d\r\n", 记录值); //格式化变量地址到tmp
                OutputDebugStringA(tmp);
        }
        return CallWindowProc(原属性, 目标句柄, uMsg, wParam, lParam);
}


void hook_测试() //子程序名 但不公开
{

        目标句柄 = FindWindowA("这里填写游戏类名",0); //通过窗口类名 和 标题获取窗口句柄 返回给目标句柄 就是透视你想要的游戏
        DWORD 目标pid; //申请一个变量
        GetWindowThreadProcessId(目标句柄,&目标pid); //通过窗口句柄获取进程PID信息 并且传给 变量 目标pid
        if (GetCurrentProcessId() == 目标pid) //通过get***id获取当前窗口的ID是不是这个ID经行判断
        {
                OutputDebugStringA("找到目标");
                hookD3D();
                原属性 = (WNDPROC)SetWindowLong(目标句柄,GWL_WNDPROC,(LONG)热键回调);
        }
        OutputDebugStringA("不是目标");
}

//原函数还原
DWORD jmp跳原 = 0; //申请个地址先给0
__declspec(naked) HRESULT WINAPI HyDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE type, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount)
{
        __asm
        //这里是做跳转还原 

        {
                mov edi, edi //d3d9.Direct3DCreate9Ex + 1E9DC - 8B FF - mov edi, edi
                push ebp //d3d9.Direct3DCreate9Ex + 1E9DE - 55 - push ebp
                mov ebp, esp //d3d9.Direct3DCreate9Ex + 1E9DF - 8B EC - mov ebp, esp
                mov eax,jmp跳原 //调回d3d9.Direct3DCreate9Ex + 1E9E1 - 6A FF - push - 01 { 255 }
                jmp eax
        }
}


//调用D3D9的函数来执行获取ID和禁用Z
// 开始Hook_(自定义) + DrawIndexedPrimitive(调用的D3D9函数名)
HRESULT WINAPI HookDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount)
{
        //OutputDebugStringA("hook!");
        HRESULT 返回值=S_OK; //获取当前hook的返回值 并且赋值SDK的sOk
        //这下面是自己的代码 比如禁用Z
        
        //先确定模型ID
        IDirect3DVertexBuffer9* pStreamData = NULL;
        UINT OffsetInBytes, 模型ID;
        //判断获取的数据流 确定模型ID
        if (pDevice->GetStreamSource(0, &pStreamData, &OffsetInBytes, &模型ID) == D3D_OK)
        {
                pStreamData->Release();//获取后销毁数据 否者会越大
                if (模型ID == 32) //如果模型ID等于某个数值就开始禁用  CsGo是32开始 记录值=申请的变量 通过快捷键修改 36=反恐行动
                {
                        if (NumVertices >= 记录值 && NumVertices <= 记录值 + 100) //判断大于= 或者小于等于记录+多少 NumVertices = 上面hook的顶点数 如果单个模型ID透视所有的话 需要判断顶点
                                //记录值可以通过快捷键修改 上面已设定 ↑ ↓ ↔ 为快捷键 会输出到Dbgview里面,用Dbgview查看即可.
                        {
                                pDevice->SetRenderState(D3DRS_ZENABLE, FALSE); //禁用Z缓存 来透视模型
                        }
                }
        } 


        
        //到这里结束修改代码 下面还原
        返回值 = HyDrawIndexedPrimitive(pDevice, type,BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
        pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //还原Z禁用
        return 返回值;

}


LONG 获取D3D9地址() //创建子程序 获取一个地址
{
        LONG D3D9地址 = (LONG)GetModuleHandleA("d3d9.dll"); //通过API获取指定DLL地址 给变量 D3D9地址
        if (D3D9地址 == NULL) //如果结果等于0
        {
                OutputDebugStringA("失败");//输出地址
                return NULL; //如果等于0返回0
        }
                OutputDebugStringA("貌似成功获取");
        return D3D9地址 + 0X2B6B1; //2B6B1=偏移 0x是因为是十六位的
}

void hookD3D() //创建一个子程序 名字是hookd3d
{
        LONG D3D9真实地址 = 获取D3D9地址(); //申请一个变量 变量结果是上面自定义子程序的返回内容
        CHAR tmp[512]; //申请一个521空字节的变量
        sprintf_s(tmp,"%d\r\n",D3D9真实地址); //格式化变量地址到tmp
        OutputDebugStringA(tmp); //输出地址
        jmp跳原 = D3D9真实地址 + 5; //准备跳回去的地址
        DWORD 地址原始属性 = 0; //申请一个整数型变量 初始化0
        if (VirtualProtect((LPVOID)D3D9真实地址,5,PAGE_EXECUTE_READWRITE,&地址原始属性))
                //参数2 一个jmp5字节所以写5 最后一个是传参原始保护属性给修改结果
        {
                DWORD Value = (DWORD)HookDrawIndexedPrimitive - D3D9真实地址 - 5;
                // - 5 是因为 jmp 是一个5字节

                __asm //使用汇编
                {
                        //jmp
                        mov eax,D3D9真实地址 //把地址传给寄存器的eax
                        mov byte ptr[eax],0xE9 //写E9到eax //jmp
                        add eax,1 // jmp之后需要加1
                        mov ecx,Value
                        mov dword ptr[eax],ecx
                }
                VirtualProtect((LPVOID)D3D9真实地址,5,地址原始属性,&地址原始属性); //还原保护属性
        }
}

VOID 还原hook() //定义子程序 用作还原
{
//还原代码
        LONG D3D9真实地址 = 获取D3D9地址(); //申请一个变量 变量结果是上面自定义子程序的返回内容
        DWORD 地址原始属性 = 0; //申请一个整数型变量 初始化0
        if (VirtualProtect((LPVOID)D3D9真实地址,5,PAGE_EXECUTE_READWRITE,&地址原始属性))
                //参数2 一个jmp5字节所以写5 最后一个是传参原始保护属性给修改结果
        {
                DWORD 还原字节集;
                //d3d9.Direct3DCreate9Ex + 1E9DC - 8B FF - mov edi, edi
                //d3d9.Direct3DCreate9Ex + 1E9DE - 55 - push ebp
                //d3d9.Direct3DCreate9Ex + 1E9DF - 8B EC - mov ebp, esp
                BYTE 还原数组[5] = {0x8b,0xfFF,0x55,0x8B,0xEC}; //还原字节即可 FF=0xfFF 其他=0x其他 十六进制
                WriteProcessMemory((HANDLE)-1,(LPVOID)D3D9真实地址,还原数组,5,&还原字节集); //改写内存还原字节集 
                //参数1= -1 写内存的进程因为是DLL所以-1 字节  参数2=hook的地址 参数3=还原的数组内容 参数4=还原几个字节 原先是5 ,参数5=传参申请的还原字节集
                VirtualProtect((LPVOID)D3D9真实地址,5,地址原始属性,&地址原始属性); //还原保护属性
        }

//还原结束

}



vs2013 D3D9 HOOK透视源码带注入器 大部分带中文注释 可运行 (1).zip (149.81 KB, 下载次数: 1)

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

清唱。 (1)
发表于 2018-7-6 17:27:34 | 显示全部楼层
易语言的下次有机会发布,其实已经写出来了,只是没有写过游戏验证,所以可以调试部分游戏,有验证的游戏开了马上就被检测了。
[发帖际遇]: 清唱。 乐于助人,奖励 4 点 经验值. 幸运榜 / 衰神榜

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

清唱。 (1)
发表于 2018-7-7 17:49:51 | 显示全部楼层

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

洛璃 (32054)
发表于 2018-7-16 22:14:46 | 显示全部楼层

易语言的下次有机会发布,其实已经写出来了,只是没有写过游戏验证,所以可以调试部分游戏,有验证的游戏开了马上就被检测了。

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

77796885 (32057)
发表于 2018-7-20 09:03:43 | 显示全部楼层

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

xiaohong147 (32084)
发表于 2018-7-26 20:42:16 | 显示全部楼层

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

云云云 (32178)
发表于 2018-8-17 12:59:40 | 显示全部楼层

发帖求助前要善用社区搜索功能,那里可能会有你要找的答案,就像度娘一样;

请不要反复发帖问【荣耀】怎么获取,点击这里查看【积分策略】,或者【点击赚积分】or【分享得荣耀】and【每日签到

如何回报帮助你的果友,一个好办法就是给对方加【荣耀】或是【点评】来赞美Ta,加分不会扣除自己的积分,做一个热心且受人欢迎的人。

 懒得打字嘛,点击右侧快捷回复【左侧自定义内容】 
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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