首页
社区
课程
招聘
[讨论]关于调试器在入口地址中断问题
发表于: 2008-4-28 21:52 4093

[讨论]关于调试器在入口地址中断问题

2008-4-28 21:52
4093
在看雪的软件加密技术内幕中的第三章(98页)中介绍到在nt系统下需要 Ntdll.ntcontinue 这个函数作为跳板才可以对程序入口地址进行设段,但是本人今天在测试的时候发现并不需要这样,本人的环境是xp sp2,
我的关键代码如下

	if(CreateProcess(NULL,_TEXT(tchar),NULL,NULL,FALSE,DEBUG_ONLY_THIS_PROCESS|CREATE_SUSPENDED,0,0,&si,&pi))
	{
		
		GetThreadContext(pi.hThread,&Regs);
		Regs.EFlags|=0x100;
		SetThreadContext(pi.hThread,&Regs);
		ResumeThread(pi.hThread);
		while(!STOP)
		{
			if(WaitForDebugEvent(&devent,-1))
			{
				switch(devent.dwDebugEventCode)//返回的调试代码
				{
				case EXCEPTION_DEBUG_EVENT:
					{
						switch(devent.u.Exception.ExceptionRecord.ExceptionCode)
						{
						case EXCEPTION_BREAKPOINT:
							{
								++dwBpCnt;
								//if(dwBpCnt==1)
								//{
									GetThreadContext(pi.hThread,&Regs);
									//Regs.Dr0=(DWORD)(GetProcAddress(GetModuleHandle(_T("ntdll.dll")),_T("NtContinue")));
									//Regs.Dr7=0x101;
								//	SetThreadContext(pi.hThread,&Regs);
									
									

							//	}
								
							}
							break;
						case EXCEPTION_SINGLE_STEP:
							{
								++dwSSCnt;
								if(dwSSCnt==2)
								{
									GetThreadContext(pi.hThread,&Regs);
									
									dwBreakAddr=Regs.Eax;
									Regs.Dr0=dwBreakAddr;
									Regs.Dr7=0x101;
									
									SetThreadContext(pi.hThread,&Regs);
									
									
								}
								else if(dwSSCnt==3)
								{
									GetThreadContext(pi.hThread,&Regs);
									Regs.Dr7=Regs.Dr0=0;
									Regs.EFlags|=0x100;
									SetThreadContext(pi.hThread,&Regs);
									STOP=TRUE;
								}
								break;
							}
						}
					}
					break;
				}
				SetRegsInfo(Regs);
				ContinueDebugEvent(devent.dwProcessId,devent.dwThreadId,DBG_CONTINUE);
			}
		}



我发现在执行第三次 single_step 后就会在eax 中获取入口地址的值,然后我们用硬件断点dr0中断eax中的值就可以了,请大家指点讨论哈

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回