当前位置: 首页 > news >正文

网站建设公司全国排行天津网站建设制作排名

网站建设公司全国排行,天津网站建设制作排名,提升学历选什么专业比较好,大兴企业网站建设Windows软件调试学习笔记#xff08;三#xff09;—— 调试事件的处理 要点回顾调试事件的处理实验一#xff1a;实现简单调试器#xff08;创建进程#xff09;实验二#xff1a;分析异常来源实验三#xff1a;实现简单调试器#xff08;附加进程#xff09;实验四三—— 调试事件的处理 要点回顾调试事件的处理实验一实现简单调试器创建进程实验二分析异常来源实验三实现简单调试器附加进程实验四分析NtDebugActiveProcess 总结 要点回顾 当调试器与被调试进程建立连接后调试器与被调试进程关系如下图所示 被调试进程产生调试事件时会有专门的API对调试事件进行捕获并写入调试事件链表当中。调试器不断检索调试事件链表不断从调试事件链表中取出调试事件并进行处理。 调试事件的处理 调试器调试目标进程步骤 关联创建进程/附加进程调试循环 实验一实现简单调试器创建进程 1将Dbgview.exe拷贝到C盘根目录下。 2编译并运行以下代码 // MyDebugger.cpp : Defines the entry point for the console application. //#include stdafx.h #include windows.h #define DEBUGGEE C:\\Dbgview.exeint main(int argc, char* argv[]) {BOOL nIsContinue TRUE;DEBUG_EVENT debugEvent {0};BOOL bRet TRUE;//1.创建调试进程STARTUPINFO startupInfo {0};PROCESS_INFORMATION pInfo {0};GetStartupInfo(startupInfo);bRet CreateProcess(DEBUGGEE, NULL, NULL, NULL, TRUE, DEBUG_PROCESS || DEBUG_ONLY_THIS_PROCESS, NULL, NULL, startupInfo, pInfo);if(!bRet){printf(CreateProcess error: %d \n, GetLastError());return 0;}//2.调试循环while(nIsContinue){bRet WaitForDebugEvent(debugEvent, INFINITE);if(!bRet){printf(WaitForDebugEvent error: %d \n, GetLastError());return 0;}switch(debugEvent.dwDebugEventCode){//1.异常case EXCEPTION_DEBUG_EVENT:printf(EXCEPTION_DEBUG_EVENT %x %x %x \n,debugEvent.u.Exception.ExceptionRecord.ExceptionAddress,debugEvent.u.Exception.ExceptionRecord.ExceptionCode,debugEvent.u.Exception.ExceptionRecord.ExceptionFlags);//printf(EXCEPTION_DEBUG_EVENT\n);break;//2.case CREATE_THREAD_DEBUG_EVENT:printf(CREATE_THREAD_DEBUG_EVENT\n);break;//3.case CREATE_PROCESS_DEBUG_EVENT:printf(CREATE_PROCESS_DEBUG_EVENT\n);break;//4.case EXIT_THREAD_DEBUG_EVENT:printf(EXIT_THREAD_DEBUG_EVENT\n);break;//5.case EXIT_PROCESS_DEBUG_EVENT:printf(EXIT_PROCESS_DEBUG_EVENT\n);break;//6.case LOAD_DLL_DEBUG_EVENT:printf(LOAD_DLL_DEBUG_EVENT\n);break;//7.case UNLOAD_DLL_DEBUG_EVENT:printf(UNLOAD_DLL_DEBUG_EVENT\n);break;//8.case OUTPUT_DEBUG_STRING_EVENT:printf(OUTPUT_DEBUG_STRING_EVENT\n);break;}bRet ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);}return 0; }运行结果 进程被正常创建但是在程序创建过程中产生了一条异常事件。 思考为什么在进程创建过程中会产生一条异常事件 答案需要了解进程的创建过程。 进程的创建过程 映射EXE文件创建内核对象EPROCESS映射系统DLLntdll.dll创建线程内核对象ETHREAD系统启动线程 映射当前线程所需的其它DLL调用ntdll.LdrInitializeThunk主线程开始执行 实验二分析异常来源 1初步定位异常事件来源 1.1 将调试器设置为第一次暂停于系统断点 1.2 加载Dbgview.exe 不难看出是由于程序加载时调用了INT 3指令导致异常事件的产生。 右下角堆栈窗口显示当前指令位于ntdll.DbgBreakPoint函数。 2在IDA中定位DbgBreakPoint 3查看DbgBreakPoint的交叉引用列表 在列表中发现LdrpInitializeProcess这是进程初始化过程的相关函数。 4分析LdrpInitializeProcess 4.1 从函数头向下分析 4.2 分析调用DbgBreakPoint之处 说明在程序创建过程中一定有API修改了BeingDebugged这个标志位。 5查看LdrpInitializeProcess函数的交叉引用 6查看LdrpInitialize函数的交叉引用 最终定位到了LdrInitializeThunk函数在进程创建过程中会调用此函数。 这么做是因为系统在进程创建过程中给了调试器一个机会让程序中断下来。 实验三实现简单调试器附加进程 1启动“驱动管理.exe“ 2编译并运行以下代码 #include stdafx.h #include windows.h #include tlhelp32.h #define DEBUGGEE 驱动管理.exeint GetProcessId(char *processName) {HANDLE hProcSnap CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcSnap INVALID_HANDLE_VALUE){ExitProcess(-1);}PROCESSENTRY32 pe32 { sizeof(PROCESSENTRY32) };if(Process32First(hProcSnap, pe32)){do{ if(pe32.th32ProcessID ! 0){if(strcmp(pe32.szExeFile, processName) 0){return pe32.th32ProcessID;}}}while(Process32Next(hProcSnap, pe32));}CloseHandle(hProcSnap);return 0; }int main(int argc, char* argv[]) {BOOL nIsContinue TRUE;DEBUG_EVENT debugEvent {0};BOOL bRet TRUE;//1.附加调试进程if(!DebugActiveProcess(GetProcessId(DEBUGGEE))){return 0;}//2.调试循环while(nIsContinue){bRet WaitForDebugEvent(debugEvent, INFINITE);if(!bRet){printf(WaitForDebugEvent error: %d \n, GetLastError());return 0;}switch(debugEvent.dwDebugEventCode){//1.异常case EXCEPTION_DEBUG_EVENT:printf(EXCEPTION_DEBUG_EVENT %x %x %x \n,debugEvent.u.Exception.ExceptionRecord.ExceptionAddress,debugEvent.u.Exception.ExceptionRecord.ExceptionCode,debugEvent.u.Exception.ExceptionRecord.ExceptionFlags);//printf(EXCEPTION_DEBUG_EVENT\n);break;//2.case CREATE_THREAD_DEBUG_EVENT:printf(CREATE_THREAD_DEBUG_EVENT\n);break;//3.case CREATE_PROCESS_DEBUG_EVENT:printf(CREATE_PROCESS_DEBUG_EVENT\n);break;//4.case EXIT_THREAD_DEBUG_EVENT:printf(EXIT_THREAD_DEBUG_EVENT\n);break;//5.case EXIT_PROCESS_DEBUG_EVENT:printf(EXIT_PROCESS_DEBUG_EVENT\n);break;//6.case LOAD_DLL_DEBUG_EVENT:printf(LOAD_DLL_DEBUG_EVENT\n);break;//7.case UNLOAD_DLL_DEBUG_EVENT:printf(UNLOAD_DLL_DEBUG_EVENT\n);break;//8.case OUTPUT_DEBUG_STRING_EVENT:printf(OUTPUT_DEBUG_STRING_EVENT\n);break;}bRet ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);}return 0; }运行结果 思考为什么在附加进程时会收到与进程创建相同的信息。 答案这些信息被称为“杜撰的调试信息”。 DebugActiveProcess最终会进入ntoskrnl!NtDebugActiveProcess。 实验四分析NtDebugActiveProcess 跟入DbgkpPostFakeProcessCreateMessages。 提供这些虚假消息的目的是给提供调试器一些必要的信息但可靠性较低例如模块信息是通过遍历PEB的Ldr链表模拟出来的但是部分模块可能已经被程序卸载或隐藏了。 总结 调试器在创建进程时除了能得到进程创建、创建线程、模块加载等调试事件之外还会收到一个异常事件。异常来源于调试器创建进程时触发的系统断点目的是给调试器一个中断的机会。调试器在附加进程时能够得到一份模拟的进程创建时产生的相关调试事件信息这些虚假的调试事件信息可靠性较低程序在执行过程中可能已经处理过部分信息。
http://www.dnsts.com.cn/news/257888.html

相关文章:

  • 如何建立免费网站的步骤建水网站开发
  • 海淀高端网站建设wordpress文章显示作者
  • 做婚宴的网站有哪些wordpress 扫码付款
  • 设计网站免费下载网页网页设计制作公司
  • 铜陵做网站的公司网站等保如何做
  • 好的网站模板公司网页网站建设 ppt
  • wordpress 多站点 合集做网站公司需要帮客户承担广告法吗
  • 徐州企业自助建站包头正大光电 做网站
  • 提供网站制作公司报价ppt模板免费下载完整版免费简约
  • 南京网站设计课程网站建设建议
  • 网站首页改版影响优化小说手机网站建设
  • 个人网站怎么做 简历电子加工东莞网站建设
  • 纪念馆网站建设做个人网站需要哪些
  • 志迅东莞网站建设wordpress设置ip白名单
  • 网站正在建设 h5模板建设婚介网站
  • 科技类网站设计特点一个wordpress程序搭建多个网站
  • 帝国+只做网站地图纯注册app拉新挣钱
  • 南通seo网站价格网站建设制作文字教程
  • 做手机网站用什么设计工作室网站推荐
  • 二级网站建设情况说明美大门店管理系统
  • 张家港做网站的推荐seo综合查询国产
  • 在线服装设计网站国外源码网站
  • 青岛网站推广关键词h5企业模板网站模板下载
  • 自己做网站需要学些什么做的比较唯美的网站有哪些
  • 泉州专业建站公司张店网站开发招聘
  • 哪些网站的活动策划做的好图片上传不了网站
  • 阿里巴巴网站费用怎么做分录seo为什么不景气了
  • 北京网站制作公司报价公司企业简介图片
  • 有没有兼职做设计的网站吗靖安县城乡规划建设局网站
  • seo查询网站是什么网站 mvc 设计