- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
- #include "stdafx.h"
- #include "windows.h"
- #include <d3d9.h>
- #include <d3dx9.h>
- #include <D3dx9tex.h>
- #pragma comment(lib, "d3d9.lib")
- #pragma comment (lib,"d3dx9.lib")
- #pragma comment (lib,"winmm.lib")
- HANDLE hbase;
- DWORD oldprotect;
- DWORD index;
- __declspec(naked) void DrawIndexedPrimitive( LPDIRECT3DDEVICE9 pdev, D3DPRIMITIVETYPE type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount){
- //设置一个空函数就是编译后没有函数头
- _asm{
- mov eax,dword ptr [index]
- add eax,2//+2是因为头部指令是MOV EDI,EDI 又没有除法操作所以不会溢出这样我就+2 来跳过我们的硬件HOOK不让她重复执行~~~
- jmp eax
- }
- }
- void setHwBreakpoint( ){//设置硬断
- HANDLE hthrad;
- CONTEXT dst_context;
- memset(&dst_context,0,sizeof(CONTEXT));//清零结构内存
- dst_context.ContextFlags=CONTEXT_ALL;//设置flag
- hthrad= OpenThread(THREAD_ALL_ACCESS,FALSE,3608);//这里我直接用的硬编码 实际作用需要全局线程HOOK 我记得DRX可以不用XX每个线程达到目的的=//打开线程
- SuspendThread(hthrad);//暂停线程
- GetThreadContext(hthrad,&dst_context);//获取线程环境(上下文)
- dst_context.Dr0=index;//这里是HOOK地址
- dst_context.Dr7=0x405;
- SetThreadContext(hthrad,&dst_context);//设置上下文
- ResumeThread(hthrad);//线程跑起来吧~~~
- CloseHandle(hthrad);//防止句柄泄露 关句柄好习惯~~~
- }
- DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * exceptioninfo){//异常处理函数
- if (exceptioninfo->ExceptionRecord->ExceptionAddress==(PVOID)index)//比较异常地址是不是我们设置的地方
- {
- exceptioninfo->ContextRecord->Eip=(DWORD)DrawIndexedPrimitive;//是就设置EIP跳转到我们用来处理的函数
- EXCEPTION_CONTINUE_EXECUTION;//返回 这个函数我们特么处理 你不用管了,管了也白搭~~
- }else{
- exceptioninfo->ContextRecord->Dr0=index;//不是就重新设置断点 //防止XX
- exceptioninfo->ContextRecord->Dr7=0x405;
- return EXCEPTION_CONTINUE_SEARCH;//返回 不是我处理了 老子不干了~~
- }
- return EXCEPTION_CONTINUE_SEARCH;//返回 不是我处理了 老子不干了~~
- }
- void addvehhandle(){
- AddVectoredExceptionHandler(1,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);//添加VEH异常处理
- }
- BOOL APIENTRY DllMain( HMODULE hModule,
- DWORD ix,
- LPVOID lpReserved
- )
- {
- DisableThreadLibraryCalls(hModule);
- switch (ix)
- {
- if (CreateMutex(NULL,NULL,L"miss2321")==0)
- //return FALSE;
- case DLL_PROCESS_ATTACH:
- hbase=GetModuleHandle(L"d3d9.dll");
- index=(DWORD)hbase+0x24FE7;
- setHwBreakpoint();
- addvehhandle();
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
复制代码
|
|