首页
社区
课程
招聘
[原创]VEH-硬件断点+dll劫持内存补丁
发表于: 2013-6-26 08:28 22607

[原创]VEH-硬件断点+dll劫持内存补丁

2013-6-26 08:28
22607
学习加密三内存补丁一节时做的。高手莫要见笑. 下面是用了加密三中的CrackMeNet.exe做的示范.

//设置硬件断点函数
void SetHwBreakpoint()
{

	
	//添加VEH  参数1=1表示插入Veh链的头部,=0表示插入到VEH链的尾部
	AddVectoredExceptionHandler(1, VectoredHandler);
	
	//寄存器相关的结构体 
	CONTEXT _ConText = {CONTEXT_DEBUG_REGISTERS};
	
	//得到当前线程
	HANDLE hThread = GetCurrentThread();
	
	
	// 得到指定线程的环境(上下文)
	GetThreadContext(hThread, &_ConText);
	

	//给调试寄存器值
	if (0X0 == _ConText.Dr0 && 0X0 == _ConText.Dr1 && 0X0 == _ConText.Dr2)
	{
		_ConText.Dr0 = 0X00401489;
		_ConText.Dr1 = 0X0;
		_ConText.Dr2 = 0X0;
		_ConText.Dr3 = 0x0;
		
		_ConText.Dr7 = 0x405;


		// 设置线程的环境(上下文)
		SetThreadContext(hThread, &_ConText);
	}
	
	
	if (0X0 != _ConText.Dr0 || 0X0 != _ConText.Dr1 || 0X0 != _ConText.Dr2 || 0X0 != _ConText.Dr3)
	{
		MessageBox(NULL,"设置硬件断点成功..", "(^_^)", MB_OK);
	}
	else
	{
		MessageBox(NULL,"设置失败,", "提示", MB_OK);
	}

}


// VEH回调函数
LONG WINAPI VectoredHandler(
							PEXCEPTION_POINTERS ExceptionInfo
							)
{
	

	//判断是否为我们设置的异常地址
	if(ExceptionInfo->ExceptionRecord->ExceptionAddress == (PVOID)0X00401489)
	{
		MessageBox(NULL, "成功触发异常", "(^_^)", MB_ICONINFORMATION);
		
		// 修改当前异常中断的EIP
		ExceptionInfo->ContextRecord->Eip = 0x00401721;//指向要执行代码的内存地址
		
		// 处理异常.
		return EXCEPTION_CONTINUE_EXECUTION;
	}

	return EXCEPTION_CONTINUE_SEARCH;
}


ALCDECL MemCode_connect(void)
{

	SetHwBreakpoint();//调用设置硬件断点

	GetAddress("connect");
	__asm JMP EAX;
}


00401474  |.  6A 10         push 10                                  ; /AddrLen = 10 (16.)
00401476  |.  8D85 B0FDFFFF lea eax,[local.148]                      ; |
0040147C  |.  50            push eax                                 ; |pSockAddr
0040147D  |.  8B8D 00FEFFFF mov ecx,[local.128]                      ; |
00401483  |.  51            push ecx                                 ; |Socket
00401484  |.  E8 43050000   call <jmp.&WS2_32.#4>                    ; \connect
00401489  |.  8985 04FEFFFF mov [local.127],eax                      ;  --设置异常地址
0040148F  |.  83BD 04FEFFFF>cmp [local.127],-1


00401721  |.  8BF4          mov esi,esp                              ;  ---异常发生后直接跳到这里执行.
00401723  |.  6A 00         push 0                                   ; /Style = MB_OK|MB_APPLMODAL
00401725  |.  68 887A4100   push CrackMeN.00417A88                   ; |Title = "Crackne net-2"
0040172A  |.  68 987A4100   push CrackMeN.00417A98                   ; |Text = "Registration successful !"
0040172F  |.  8B15 90B14100 mov edx,dword ptr ds:[41B190]            ; |
00401735  |.  52            push edx                                 ; |hOwner => 001D016C ('Pediy - Crackme (net) 20061204',class='myWindowClass')
00401736  |.  FF15 D0D34100 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA



bin.rar
vs2008_src.rar

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

上传的附件:
收藏
免费 5
支持
分享
最新回复 (17)
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Thanks for sharing
2013-6-26 08:39
0
雪    币: 221
活跃值: (2256)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不错.谢谢了..
2013-6-26 09:03
0
雪    币: 6366
活跃值: (4336)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
4
学习了
2013-6-26 10:00
0
雪    币: 221
活跃值: (2256)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
AddVectoredExceptionHandler 这个函数在哪里?
2013-7-1 00:15
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
走过路过,好东西不能错过啊
2013-7-1 00:18
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark!!!!!
2013-7-1 05:11
0
雪    币: 1594
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
LZ换个名字估计就很多人看了,比如 过内存CRC效验代码
2013-7-2 15:50
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享,学习了
2013-7-2 16:47
0
雪    币: 788
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
CONTEXT _ConText = {CONTEXT_DEBUG_REGISTERS};
       
        //得到当前线程
        HANDLE hThread = GetCurrentThread();
       
       
        // 得到指定线程的环境(上下文)
        GetThreadContext(hThread, &_ConText);
       

        //给调试寄存器值
        if (0X0 == _ConText.Dr0 && 0X0 == _ConText.Dr1 && 0X0 == _ConText.Dr2)
        {
                _ConText.Dr0 = 0X00401489;
                _ConText.Dr1 = 0X0;
                _ConText.Dr2 = 0X0;
                _ConText.Dr3 = 0x0;
               
                _ConText.Dr7 = 0x405; 请问为什么设置0x405,有相关资料提供学习一下吗???????????

                // 设置线程的环境(上下文)
                SetThreadContext(hThread, &_ConText);
        }
2013-7-2 18:47
0
雪    币: 3902
活跃值: (5940)
能力值: ( LV13,RANK:550 )
在线值:
发帖
回帖
粉丝
11
2013-7-4 08:48
0
雪    币: 788
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢啦~~~~~~~~~~~~
2013-7-4 11:17
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
//给调试寄存器值
if (0X0 == _ConText.Dr0 && 0X0 == _ConText.Dr1 && 0X0 == _ConText.Dr2)

为什么没有 && 0X0 == _ConText.Dr3
2013-7-27 20:51
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
以前用这个办法过掉HS CRC校验的.
2013-8-1 09:55
0
雪    币: 264
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark一下,学习了.....
2013-12-15 21:51
0
雪    币: 3
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
如果是对DLL下硬件断点呢
“*
注入dll有问题,因为注入时是对进程创建一条新的执行线程,所以这个DLL是新的线程,不是程序的主线程,
GetCurrentThread(),取到的是自身的线程,不是主线程,所以断硬件断点没反应.
*/
2020-2-16 15:10
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
2020-2-24 23:18
0
雪    币: 245
活跃值: (207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这东西会被反调试逮到吧?
2020-3-1 17:45
0
游客
登录 | 注册 方可回帖
返回
//