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

网站建设技术招聘标志设计要素

网站建设技术招聘,标志设计要素,曹健的wordpress博客,网站代码怎么看Windows软件调试学习笔记(三)—— 调试事件的处理 要点回顾调试事件的处理实验一:实现简单调试器(创建进程)实验二:分析异常来源实验三:实现简单调试器(附加进程)实验四&…

Windows软件调试学习笔记(三)—— 调试事件的处理

  • 要点回顾
  • 调试事件的处理
    • 实验一:实现简单调试器(创建进程)
    • 实验二:分析异常来源
    • 实验三:实现简单调试器(附加进程)
    • 实验四:分析NtDebugActiveProcess
  • 总结

要点回顾

  1. 当调试器与被调试进程建立连接后,调试器与被调试进程关系如下图所示
    在这里插入图片描述
  2. 被调试进程产生调试事件时,会有专门的API对调试事件进行捕获,并写入调试事件链表当中。
  3. 调试器不断检索调试事件链表,不断从调试事件链表中取出调试事件并进行处理。

调试事件的处理

调试器调试目标进程步骤

  1. 关联(创建进程/附加进程)
  2. 调试循环

实验一:实现简单调试器(创建进程)

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.exe"int 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;
}

运行结果:
在这里插入图片描述
进程被正常创建,但是在程序创建过程中产生了一条异常事件。

思考:为什么在进程创建过程中会产生一条异常事件?
答案:需要了解进程的创建过程。

进程的创建过程

  1. 映射EXE文件
  2. 创建内核对象EPROCESS
  3. 映射系统DLL(ntdll.dll)
  4. 创建线程内核对象ETHREAD
  5. 系统启动线程
    1. 映射当前线程所需的其它DLL(调用ntdll.LdrInitializeThunk
    2. 主线程开始执行

实验二:分析异常来源

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 "驱动管理.exe"int 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链表模拟出来的,但是部分模块可能已经被程序卸载或隐藏了)。

总结

  1. 调试器在创建进程时,除了能得到进程创建、创建线程、模块加载等调试事件之外,还会收到一个异常事件。
  2. 异常来源于调试器创建进程时触发的系统断点,目的是给调试器一个中断的机会。
  3. 调试器在附加进程时,能够得到一份模拟的进程创建时产生的相关调试事件信息
  4. 这些虚假的调试事件信息可靠性较低,程序在执行过程中可能已经处理过部分信息。
http://www.yayakq.cn/news/649514/

相关文章:

  • 镇江网站建设方案seo刷排名公司
  • 做网站首页图片wordpress 正文 宽度
  • 杭州建网站的公司求网站建设
  • 网上商城网站建设体会网站建设教程设
  • 做网站界面的软件湖北建设厅
  • 网站域名要多少钱vi设计手册完整版案例
  • 太原市建设厅官方网站微信公众号运营模式
  • 网站建设创意报告书东莞建设网站官网住房和城乡
  • 在那个网站做义工好河东做网站公司
  • 视频背景做网站背景番禺网站开发哪家专业
  • 免费电子商务网站建设数据营销系统
  • 网站开发顶岗实习报告做网站1万多
  • html创建站点的步骤wordpress开启多站点
  • 做创意小视频的网站版式设计图片
  • 如何做好网站的推广工作如何做网站推广方式
  • 网站建设亼仐团网络规划设计师论文方向
  • 做网站的过程腾讯小程序怎么赚钱
  • 阜阳手机端网站建设网络架构分层包括哪些
  • 网站建设需要学编程么中国建设银行网址是什么
  • 手机永久免费建站网站运营的作用
  • 做暧暧视频免费视频网站上海公司牌照价格走势
  • 做平台网站怎么做营销网站模板
  • 烟台网站建设电话建设部网站 干部学院 一级注册建筑师培训 2014年
  • 速成网站 改版 影响wordpress 严重 漏洞
  • 设立网站基于淘宝的网站开发分析
  • 微商城网站开发视频扬州网站建设小程序
  • 南京企业建站系统模板网站备案时要不要关闭
  • 建设银行网站怎么设置转账额度怎么申请专线访问国际网络
  • 南昌网站建设推广专家武夷山网站设计
  • 三网合一网站建设全包费用如何给网站做高质量外链