能力值:
( LV7,RANK:110 )
|
-
-
2 楼
程序没有运行到哪个位置吧?INT3代码不行的话,还可以下硬件中断嘛!直接通过API设置CPU调试寄存器,设置好调试向量之后就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
有运行到,但是一运行就蹦了,什麽api可以调用调试寄存器呢
|
能力值:
( LV7,RANK:110 )
|
-
-
4 楼
SetThreadContext可以设置的,我已经编写好调用这个api来设置调试寄存器的库了
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
求代码^^
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
od->选项->调试设置->异常->忽略以下异常->去掉int 3前面的勾
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
不是 我是要用代碼下中断
|
能力值:
( LV7,RANK:110 )
|
-
-
8 楼
这是打包好的代码!DEMO制作一个给你!因为我测试好代码之后就删除了DEMO,为了省点空间,就删除了它,只留下了源代码和编译好的程序!
编译使用方法,需要用目录底下的Winternl.h替换掉VC的这个文件
|
能力值:
( LV7,RANK:110 )
|
-
-
9 楼
这个是程序的DEMO
// DEMO.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include "../../BPHookFunction/BPHookFunction/BPHookFunction.h"
#if _DEBUG
#if _WIN64
#define Debug DebugBreak();
#else
#define Debug _asm int 3
#endif
#else
#define Debug
#endif
#define DEBUG Debug
#define debug Debug
void Test1();
void Test2();
DWORD CALLBACK ThreadCreateCallBack(DWORD Tid,BOOL bCreate,LPTHREAD_START_ROUTINE lpStartAddress,PVOID ThreadData);
LONG WINAPI TopUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS *ExceptionInfo
)
{//如果HOOK设置正确,那么当运行到HOOK的函数时会回调这个函数
//Debug; //这个是调试宏,在代码中添加这个会导致运行时会被调试器捕获,用于在设置调试寄存器之后绕过VC对调试寄存器的回调的捕获,方便调试
//这个宏只是在DEBUG版本的程序中会起作用,如果不是DEBUG版本的程序,这个宏会被设置为空
#if _WIN64
//::DebugBreak();
//这里是64位程序回调的处理
if(ExceptionInfo->ContextRecord->Rip==(DWORD64)Test1)//检查一下是否是需要HOOK的函数,如果不是就放过以便让回调继续传递下去
{
ExceptionInfo->ContextRecord->Rip=(DWORD64)Test2;//替换Rip寄存器,以便进行HOOK
}else
{
return EXCEPTION_CONTINUE_SEARCH;//告诉系统,这个不是我需要处理的回调,请系统寻找别的回调
}
#else
//这里是32位程序回调的处理
if(ExceptionInfo->ContextRecord->Eip==(DWORD)Test1)//检查一下是否是需要HOOK的函数,如果不是就放过以便让回调继续传递下去
{
ExceptionInfo->ContextRecord->Eip=(DWORD)Test2;//替换Eip寄存器,以便进行HOOK
}
else
{
return EXCEPTION_CONTINUE_SEARCH;//告诉系统,这个不是我需要处理的回调,请系统寻找别的回调
}
#endif
return EXCEPTION_CONTINUE_EXECUTION;//告诉系统,我已经处理好了,请不要回调别的处理程序
}
void Test1()
{
::MessageBox(0,_T("愿函数"),_T("愿函数"),0);
}
void Test2()
{
::MessageBox(0,_T("Hook"),_T("Hook"),0);
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD Tid = ::GetCurrentThreadId();//取得本进程线程的ID
Test1();//没有进行HOOK之前的函数
InitHook();//初始化调试寄存器的HOOK,不调用这初始化函数的话,设置调试寄存器会失败的哦!
SetThreadCreateCallBack(ThreadCreateCallBack);//设置线程创建回调,以便在线程创建时设置那个线程的调试寄存器
SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,1);//设置调试寄存器,进行调试寄存器的HOOK
//第一个参数是需要设置寄存器的线程,第二个参数是HOOK的地址,第三个参数是异常回调,也就是当HOOK的函数调用时会回调的程序,HOOK的这个函数的寄存器和地址会保存在这个回调中
/*
第四个参数是使用的调试寄存器的序号,总共有4个寄存器可以使用,序号范围是0到3,第四个参数是HOOK的类型,保持默认就好,第五个参数是HOOK地址的大小,保持默认就好
第六个参数是决定是否进行HOOK,如果这个参数是TRUE,就进行HOOK,如果这个参数是FALSE,就进行卸载HOOK的操作
*/
Test1();//HOOK之后的函数,提示不能使用VC进行调试,因为VC会对调试器进行拦截,导致程序无法正确收到回调
SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,FALSE);
Test1();//HOOK卸载之后的函数
UnInitHook();
return 0;
}
DWORD CALLBACK ThreadCreateCallBack(DWORD Tid,BOOL bCreate,LPTHREAD_START_ROUTINE lpStartAddress,PVOID ThreadData)
{
if(bCreate)//在线程创建回调中,检查一下是否是线程创建
{
//如果确认是线程创建就进行调试寄存器HOOK,并且调用lpStartAddress指向的函数,这个函数的参数在ThreadData变量中,这个函数必须是在线程创建时调用,否则线程是不会创建成功的
SetHardWareBP(Tid,(DWORD)Test1,TopUnhandledExceptionFilter,0,0,1,1);
return lpStartAddress(ThreadData);//这个函数必须是在线程创建时调用,否则线程是不会创建成功的
}
return 0;//如果不是线程创建,那就简单了,直接返回0即可
}
|