VEH +硬件断点 HOOK



// dllmain.cpp : 定义 DLL 应用程序的入口点。

#include "stdafx.h"

#include "windows.h"

#include

#include

#include

#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;







}

你可能感兴趣的:(逆向)