首页
社区
课程
招聘
[原创]调戏:Anti硬断的梗(2)
发表于: 2014-10-31 05:32 28622

[原创]调戏:Anti硬断的梗(2)

2014-10-31 05:32
28622
原理:利用了4个硬断位置设置了4个有用的断点~

举例代码如下:(可以4个位置的关系与处理都可以再复杂很多很多倍。)


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

#pragma pack(1)
typedef struct _DEBUG_DR6_
{
	union{
		ULONG32 _DR6;
		struct {
			unsigned B0 : 1;
			unsigned B1 : 1;
			unsigned B2 : 1;
			unsigned B3 : 1;
			unsigned Reverted : 9;
			unsigned BD : 1;
			unsigned BS : 1;
			unsigned Reverted2 : 17;
		}st;
	}u;
}DEBUG_DR6, *PDEBUG_DR6;

typedef struct _DEBUG_DR7_
{
	union{
		ULONG32 _DR7;
		struct {
			unsigned L0 : 1; //0
			unsigned G0 : 1; //1
			unsigned L1 : 1; //2
			unsigned G1 : 1; //3
			unsigned L2 : 1; //4
			unsigned G2 : 1; //5
			unsigned L3 : 1; //6
			unsigned G3 : 1; //7
			unsigned LE : 1; //8
			unsigned GE : 1; //9
			unsigned reserved : 3; //001  //10-11-12
			unsigned GD : 1; //13...
			unsigned reserved2 : 2; //00
			unsigned RW0 : 2;
			unsigned LEN0 : 2;
			unsigned RW1 : 2;
			unsigned LEN1 : 2;
			unsigned RW2 : 2;
			unsigned LEN2 : 2;
			unsigned RW3 : 2;
			unsigned LEN3 : 2;
		}st;
	}u;
}DEBUG_DR7, *PDEBUG_DR7;
#pragma pack()

PVOID pHookAddress[4] = { NULL };//只有4个位置!
PVOID pJmpAddress[4] = { NULL };


int MyFilter(EXCEPTION_POINTERS * pException)
{
	static ULONG32 s_Count = 0;
	DEBUG_DR6 dr6;
	PCONTEXT pContext;
	pContext = pException->ContextRecord;
	dr6.u._DR6 = pException->ContextRecord->Dr6;
	printf("%x eip = %p except %x\r\n",s_Count++, pContext->Eip,pException->ExceptionRecord->ExceptionCode);
	if (dr6.u.st.B0)
	{
		if (pContext->Eip == (DWORD)pHookAddress[0])
		{
			pContext->Eip = (DWORD)pJmpAddress[0];
		}
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	if (dr6.u.st.B1)
	{
		if (pContext->Eip == (DWORD)pHookAddress[1])
		{
			pContext->Eip = (DWORD)pJmpAddress[1];
		}
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	if (dr6.u.st.B2)
	{
		if (pContext->Eip == (DWORD)pHookAddress[2])
		{
			pContext->Eip = (DWORD)pJmpAddress[2];
		}
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	if (dr6.u.st.B3)
	{
		if (pContext->Eip == (DWORD)pHookAddress[3])
		{
			pContext->Eip = (DWORD)pJmpAddress[3];
		}
		return EXCEPTION_CONTINUE_EXECUTION;
	}
	return EXCEPTION_CONTINUE_SEARCH;
}

void Fuck_Call()
{
	MessageBoxA(NULL, "异常\r\n", "提示", MB_OK);
	ExitProcess(-1);
}

void Fuck_OK()
{
	Sleep(1);
}

void Fuck_Call_3()
{
	MessageBoxA(NULL, "异常3\r\n", "提示3", MB_OK);
	ExitProcess(-1);
}
void Fuck_Call_1()
{
	MessageBoxA(NULL, "异常1\r\n", "提示1", MB_OK);
	ExitProcess(-1);
}

void Fuck_Call_2()
{
	MessageBoxA(NULL, "异常2\r\n", "提示2", MB_OK);
	ExitProcess(-1);
}

void setHwbp()
{
	CONTEXT ctx = { 0 };
	ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
	if (GetThreadContext(GetCurrentThread(), &ctx))
	{
		ctx.Dr0 = (DWORD)pHookAddress[0];
		ctx.Dr1 = (DWORD)pHookAddress[1];
		ctx.Dr2 = (DWORD)pHookAddress[2];
		ctx.Dr3 = (DWORD)pHookAddress[3];
		ctx.Dr7 = 0x455;
		ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
		SetThreadContext(GetCurrentThread(), &ctx);
		//printf("set hwbp ok\r\n");
	}
}
void NormalLoop()
{
	setHwbp();
	while (1)
	{
		__try
		{
			Fuck_Call();
			Fuck_Call_3();
			Fuck_Call_2();
			Fuck_Call_1();
		}
		__except (MyFilter(GetExceptionInformation()))
		{

		}
		Sleep(1000);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	pJmpAddress[0] = (PVOID)Fuck_OK;
	pHookAddress[0] = (PVOID)Fuck_Call;
	pJmpAddress[1] = (PVOID)Fuck_OK;
	pHookAddress[1] = (PVOID)Fuck_Call_3;
	pJmpAddress[2] = (PVOID)Fuck_OK;
	pHookAddress[2] = (PVOID)Fuck_Call_2;
	pJmpAddress[3] = (PVOID)Fuck_OK;
	pHookAddress[3] = (PVOID)Fuck_Call_1;

	NormalLoop();
	return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (58)
雪    币: 433
活跃值: (1895)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
前排友情出售广告位
顺便近距离抚摸v大
2014-10-31 07:04
0
雪    币: 1495
活跃值: (675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
占个板凳吧
2014-10-31 07:11
0
雪    币: 13
活跃值: (26)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
第一次离V大那么近
2014-10-31 07:33
0
雪    币: 12921
活跃值: (4026)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
早起搬砖搬凳子。。
2014-10-31 07:43
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
昨天还在看你的第一篇文章
2014-10-31 08:43
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
学习一下,是不是手工置位dr6的b0,如果是dr1,2,3引发了断点,就不跳,如果是dr0,就跳。
2014-10-31 09:13
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
8
消化下。。。。。。
2014-10-31 09:15
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
没看出精华在哪个?只是很好奇DR7 == 0X455,这个和平常设的不一样而已。难道是为了降低高CPU而故意设计的?
2014-10-31 09:30
0
雪    币: 62
活跃值: (946)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
我哽咽了
2014-10-31 09:32
0
雪    币: 20
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
v校的帖子,得看一下。
2014-10-31 09:51
0
雪    币: 124
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
板凳板凳
2014-10-31 10:10
0
雪    币: 376
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
typedef struct _DEBUG_DR6_
{
  union{
    ULONG32 _DR6;
    struct {
      unsigned B0 : 1;
      unsigned B1 : 1;
      unsigned B2 : 1;
      unsigned B3 : 1;
      unsigned Reverted : 9;
      unsigned BD : 1;
      unsigned BS : 1;
      unsigned Reverted2 : 17;
    }st;
  }u;
}DEBUG_DR6, *PDEBUG_DR6;
新手请教下,这段个结构体不懂, unsigned 后面不是应该加 类型 吗 为什么后面没有,那里的变量应该是什么类型的
2014-10-31 11:14
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
好变态,目测没办法pass~
2014-10-31 11:27
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
__try { } __except { }
用ADD添加Filter的说
2014-10-31 12:58
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
不懂啊~我一般不用那种Filter~
那种很烦~
2014-10-31 13:01
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
把检测线程干掉就OK了
2014-10-31 14:11
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
只能把主线程干掉了
2014-10-31 14:44
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
发表下小小的看法,提一个相对难和谐一点的破解方案~

hook fuck_call的调用点
__asm
{
  pushfd
  or dword ptr[esp],0x100
  jmp fuck_call
}

hook fuck_call
__asm
{
popfd
}


普及一下基本知识,TF位置1可触发单步异常,其错误号和硬断异常是一样的
不过V大这个木有判断异常号,直接把fuck_call开头改成int3就可以了~

最后又看了一眼,好像真的哎,将Fuck_call_XX全部改成int3,貌似就完爆了
2014-10-31 15:16
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=djzbxxz;1327546]发表下小小的看法,提一个相对难和谐一点的破解方案~

hook fuck_call的调用点

__asm
{
  pushfd
  or dword ptr[esp],0x100
  jmp fuck_call
}

hook fuck_call

__asm
{
popfd
}

普及一下基本知...[/QUOTE]
判断dr6硬断原因了~~
2014-10-31 15:41
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
只是思路,不专针文章中的POC
2014-10-31 16:05
0
雪    币: 218
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
那貌似就只能是这个方法,再加上Hook KiUserExceptionDispatcher改Context了
或者加个VEH?
2014-10-31 18:08
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
23
KiUserExceptionDispatcher如果poc也hook了呢?

POC里没有做CRC校对,主要是为了突出POC~
2014-10-31 20:52
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
接管调试流程,发现异常先检测是不是OD设置的断点,不是则还原DRX,当然之前得为每个线程维护一个DRX清单
2014-10-31 21:12
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
25
那么问题就来了,硬断被占坑之后,你无法使用硬断了~
2014-10-31 21:25
0
游客
登录 | 注册 方可回帖
返回
//