能力值:
( LV2,RANK:10 )
|
-
-
2 楼
补充一下,,上面的关键跳的地址是401104,不是4010FD,那个图我截错了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
刚才我又测试了一遍,发现用int * point = NULL; *point = 100;这种异常可以进入VEH的处理函数,但是硬件断点异常为什么进不去呢????是不是VS得设置什么东西啥的
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
啊看错了 编辑掉
最后于 2019-4-20 03:46
被yuchengton编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
Dr7是一些控制位,用于控制断点的方式
|
能力值:
( LV7,RANK:110 )
|
-
-
6 楼
之前我下载论坛的一个源码试过,物理机可以,虚拟机就不成功,看看是不是你用虚拟机的原因
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
pxhb
之前我下载论坛的一个源码试过,物理机可以,虚拟机就不成功,看看是不是你用虚拟机的原因
不是虚拟机64位Win10,。,昨天研究了一天服了。,。,如果我设置int * a = NULL; *a = 100;设置这类异常是可以进入VEH处理函数的,但是硬件断点异常却进不去
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
xiaohucode
Dr7是一些控制位,用于控制断点的方式
这个我知道啊,,我只设置了一个DR0,所以DR7 = 1就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
https://www.pediy.com/kssd/pediy06/pediy6707.htm 了解下
|
能力值:
( LV1,RANK:0 )
|
-
-
10 楼
也是人才 和之前我看的一个暂时当前线程然后hook的一模一样
|
能力值:
( LV5,RANK:60 )
|
-
-
11 楼
线程线程线程重要的是说三遍!另外设置的线程请用OpenThread打开句柄
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
谢谢大家
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
一事无成y
也是人才 和之前我看的一个暂时当前线程然后hook的一模一样 [em_78]
啥意思,,,,我没有暂停当前线程啊,只是设置一个硬件断点。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
最后于 2019-4-22 21:27
被自强zq编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
xiaxiansheng
11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
-1不是进程伪句柄吗?线程伪句柄不是-2吗?还是不太理解。。
最后于 2019-4-22 21:27
被自强zq编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
xiaxiansheng
11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
好吧,可以了,自己傻了,再问大佬一个问题,是不是这种硬件HOOK,都是在DLL入口函数出创建一个线程,线程参数是主线程的ID,然后在创建的线程里面暂停主线程,获取线程上下文,然后设置硬件断点, 之前出错是因为,没有暂停线程直接获取线程环境了,但是又不能在主线程里面直接暂停自己,得另外创建一个线程暂停自己,大佬,是这样吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
xiaxiansheng
11楼大佬说的对。你使用自线程ID什么意思?不行写-1啊
好吧。。。。我弄懂了。。。。。。。傻了,我看了看MSDN的GetThreadContext函数的Remarks,得暂停了线程之后才能获取线程环境,来下硬件断点,所以得另外创建一个线程暂停主线程才可以,,,,,,之前不知道,直接在没暂停的情况下获取线程上下文了,,,,,,,。。。。。。。
|
能力值:
( LV5,RANK:60 )
|
-
-
19 楼
#include <windows.h>
#include <tlhelp32.h>
DWORD ThreadID;
HANDLE hThread;
PVOID ExceptionHandle=NULL;
PVOID T_OrgProc[4];
PVOID T_NewProc[4];
class Dr7_Hook
{
public:
Dr7_Hook();
~Dr7_Hook();
HANDLE Dr7_Hook::Start_Thread();
BOOL Initialize();
DWORD HOOK(PVOID OrgProc, PVOID NewProc);
BOOL UnHOOK(PVOID NewProc);
//void Start(HANDLE hThread);
void Start();
void Stop();
private:
};
//Hook
void Dr7_Hook::Start()
{
CONTEXT Context;
Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;;
GetThreadContext(GetCurrentThread(), &Context);
Context.Dr0 = (DWORD)T_OrgProc[0];
Context.Dr1 = (DWORD)T_OrgProc[1];
Context.Dr2 = (DWORD)T_OrgProc[2];
Context.Dr3 = (DWORD)T_OrgProc[3];
Context.Dr7 = 0x405;
SetThreadContext(GetCurrentThread(), &Context);
}
//Hook指定线程
void Start(DWORD dwThreadId)
{
CONTEXT Context;
HANDLE hThread;
Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
hThread = OpenThread(THREAD_ALL_ACCESS, NULL, dwThreadId);
GetThreadContext(hThread, &Context);
DbgPrintf_Mine("Hook Addr:%X", T_OrgProc[0]);
Context.Dr0 = (DWORD)T_OrgProc[0];
Context.Dr1 = (DWORD)T_OrgProc[1];
Context.Dr2 = (DWORD)T_OrgProc[2];
Context.Dr3 = (DWORD)T_OrgProc[3];
Context.Dr7 = NULL;
if (Context.Dr0)
{
Context.Dr7 = Context.Dr7 | 3;
}
if (Context.Dr1)
{
Context.Dr7 = Context.Dr7 | 12;
}
if (Context.Dr2)
{
Context.Dr7 = Context.Dr7 | 48;
}
if (Context.Dr3)
{
Context.Dr7 = Context.Dr7 | 192;
}
Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
//Context.Dr7 = 0x405;
SetThreadContext(hThread, &Context);
CloseHandle(hThread);
}
void Dr7_Hook::Stop()
{
CONTEXT Context;
Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;;
GetThreadContext(GetCurrentThread(), &Context);
Context.Dr0 = NULL;
Context.Dr1 = NULL;
Context.Dr2 = NULL;
Context.Dr3 = NULL;
Context.Dr7 = NULL;
SetThreadContext(GetCurrentThread(), &Context);
}
//多线程Hook
bool Initialize_Thread()
{
HANDLE hThreadSnap = NULL;
//HANDLE hThread;
DWORD dwMypid;
dwMypid = GetMyProcessId();
THREADENTRY32 te32 = { 0 };
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
return (FALSE);
te32.dwSize = sizeof(THREADENTRY32);
if (Thread32First(hThreadSnap, &te32))
{
do
{
if (te32.th32OwnerProcessID == dwMypid)
{
DbgPrintf_Mine("ThreadID=%d", te32.th32ThreadID);
if (ThreadID != te32.th32ThreadID)
{
SuspendThread(hThread);//线程挂起
Start(te32.th32ThreadID);
ResumeThread(hThread);//线程恢复
}
}
} while (Thread32Next(hThreadSnap, &te32));
}
else
{
return FALSE;
CloseHandle(hThreadSnap);
}
CloseHandle(hThreadSnap);
return TRUE;
}
HANDLE Dr7_Hook::Start_Thread()
{
hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)Initialize_Thread, NULL, NULL, &ThreadID);
return hThread;
}
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * ExceptionInfo)
{
for (size_t i = 0; i < 4; i++)
{
if (ExceptionInfo->ExceptionRecord->ExceptionAddress == T_OrgProc[i])
{
DbgPrintf_Mine("NewProc Addr=%X", T_NewProc[i]);
DbgPrintf_Mine("ExceptionHandler To Eip=%X", T_OrgProc[i]);
ExceptionInfo->ContextRecord->Eip = (DWORD)T_NewProc[i];
return EXCEPTION_CONTINUE_EXECUTION;
}
}
return EXCEPTION_CONTINUE_SEARCH;
}
BOOL Dr7_Hook::Initialize()
{
BOOL Jud;
ExceptionHandle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
for (size_t i = 0; i < 4; i++)
{
T_OrgProc[i] = NULL;
T_NewProc[i] = NULL;
}
Jud = (BOOL)ExceptionHandle;
//CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, NULL);
return Jud;
}
DWORD Dr7_Hook::HOOK(PVOID OrgProc, PVOID NewProc)
{
for (size_t i = 0; i < 4; i++)
{
if (!T_OrgProc[i])
{
T_OrgProc[i] = OrgProc;
T_NewProc[i] = NewProc;
return i;
}
}
return 0;
}
BOOL Dr7_Hook::UnHOOK(PVOID NewProc)
{
if (NewProc==NULL)
{
Stop();
return (BOOL)RemoveVectoredExceptionHandler(ExceptionHandle);
}
else
{
for (size_t i = 0; i < 4; i++)
{
if (T_NewProc[i] == NewProc)
{
T_OrgProc[i] = 0;
T_NewProc[i] = 0;
Start();
return TRUE;
}
}
}
return FALSE;
}
Dr7_Hook::Dr7_Hook()
{
if (ExceptionHandle==NULL)
{
if (Initialize())
{
DbgPrintf_Mine("Success Initialize VectoredExceptionHandler");
}
else
{
DbgPrintf_Mine("Error Initialize");
}
}
}
Dr7_Hook::~Dr7_Hook()
{
UnHOOK(NULL);
CloseHandle(HANDLE(ThreadID));
DbgPrintf_Mine("Success UnVectoredExceptionHandler!");
}
ps:以前改的代码,太丑mua...
你要设置硬断的地址 要设置你走的这条线程,而不是随便的一条线程
我的方法和OD的一样,每个线程都设置。
线程ID可以用 TEB迭代 枚举,代码可能写的不是很好 。
最后于 2019-4-22 23:55
被AperOdry编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
20 楼
19楼已经发给你了 每个线程的寄存器不是一样的 你实在不懂可以复制粘贴
|
|
|