-
-
[讨论]关于调试器在入口地址中断问题
-
发表于: 2008-4-28 21:52 4093
-
在看雪的软件加密技术内幕中的第三章(98页)中介绍到在nt系统下需要 Ntdll.ntcontinue 这个函数作为跳板才可以对程序入口地址进行设段,但是本人今天在测试的时候发现并不需要这样,本人的环境是xp sp2,
我的关键代码如下
我发现在执行第三次 single_step 后就会在eax 中获取入口地址的值,然后我们用硬件断点dr0中断eax中的值就可以了,请大家指点讨论哈
我的关键代码如下
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中的值就可以了,请大家指点讨论哈
赞赏
他的文章
- [原创]ThunderVB后续修改版 15811
- [作品提交]仿天网进程列表控件 7681
- [作品提交]ShellCode辅助工具 10102
赞赏
雪币:
留言: