专业找工作网站下载一键生成app工具

张小明 2026/3/12 10:07:51
专业找工作网站下载,一键生成app工具,网站配色 橙色,做网站管理员需要哪些知识在本教程中,我们将学习Win32提供给开发者的用于调试的原语. 在教程的结尾,我们将学习如何调试一个进程. 下载 例子程序.理论:Win32有一些供程序员使用的API,它们提供相当于调试器的功能. 他们被称作Win32调试API(或原语).利用这些API,我们可以:加载一个程序或捆绑到一个正在运行…在本教程中,我们将学习Win32提供给开发者的用于调试的原语. 在教程的结尾,我们将学习如何调试一个进程.下载 例子程序.理论:Win32有一些供程序员使用的API,它们提供相当于调试器的功能. 他们被称作Win32调试API(或原语).利用这些API,我们可以:加载一个程序或捆绑到一个正在运行的程序上以供调试获得被调试的程序的低层信息,例如进程ID,进入地址,映像基址等.当发生与调试有关的事件时被通知,例如进程/线程的开始/结束, DLL的加载/释放等.修改被调试的进程或线程简而言之,我们可以用这些API写一个简单的调试器.由于这个题目有些过大,我把它分为几部分,而本教程就是它的第一部分.在本教程中,我将讲解一些基本概念及Win32调试API的大致框架.使用Win32调试API的步骤如下:创建一个进程或捆绑到一个运行中的进程上. 这是使用Win32调试API的第一步.由于我们的程序要扮演调试器的角色,我们要找一个供调试的程序.一个被调试的程序被称为debuggee.可以通过以下两种方式获得debuggee:通过CreateProcess创建debuggee进程.为了创建被调试的进程,必须指定DEBUG_PROCESS标志.这一标志告诉Windows我们要调试该进程. 当debuggee中发生重要的与调试有关的事件(调试事件)时,Windows 会向我们的程序发送通知.debuggee会立即挂起以等待我们的程序准备好.如果debuggee还创建了子进程,Windows还会为每个子进程中的调试事件向我们的程序发送通知.这一特性通常是不必要的.我们可以通过指定DEBUG_ONLY_THIS_PROCESS与 DEBUG_PROCESS的组合标志来禁止它.我们也可以用 DebugActiveProcess标志捆绑到一个运行中的进程上.等待调试事件. 在获得了一个debuggee进程后,debuggee的主线程被挂起,这种状况将持续到我们的程序调用WaitForDebugEvent为止.这个函数和其他的WaitForXXX函数相似,比如说,它阻塞调用线程直到等待的事件发生.对这个函数来说, 它等待由Windows发送的调试事件.下面是它的定义:WaitForDebugEvent proto lpDebugEvent:DWORD, dwMilliseconds:DWORDlpDebugEvent is the address of a DEBUG_EVENT这个结构将被填入关于debuggee中发生的调试事件的信息.dwMilliseconds 该函数等待调试事件的时间,以毫秒为单位.如果这段时间没有调试事件发生, WaitForDebugEvent返回调用者.另一方面,如果将该参数指定为 INFINITE 常数,函数将一直等待直到调试事件发生.现在我们看一下DEBUG_EVENT 结构.DEBUG_EVENT STRUCTdwDebugEventCode dd ?dwProcessId dd ?dwThreadId dd ?u DEBUGSTRUCT DEBUG_EVENT ENDSdwDebugEventCode 该值指定了等待发生的调试事件的类型.因为有很多种类型的事件发生,我们的程序要检查该值,知道要发生事件的类型并做出响应. 该值可能的取值如下:取值含义CREATE_PROCESS_DEBUG_EVENT进程被创建.当debuggee进程刚被创建(还未运行) 或我们的程序刚以DebugActiveProcess被捆绑到一个运行中的进程时事件发生. 这是我们的程序应该获得的第一个事件.EXIT_PROCESS_DEBUG_EVENT进程退出.CREATE_THEAD_DEBUG_EVENT当一个新线程在deuggee进程中创建或我们的程序首次捆绑到运行中的进程时事件发生.要注意的是当debugge的主线程被创建时不会收到该通知.EXIT_THREAD_DEBUG_EVENTdebuggee中的线程退出时事件发生.debugee的主线程退出时不会收到该通知.我们可以认为debuggee的主线程与debugge进程是同义词. 因此, 当我们的程序看到CREATE_PROCESS_DEBUG_EVENT标志时,对主线程来说,就是CREATE_THREAD_DEBUG_EVENT标志.LOAD_DLL_DEBUG_EVENTdebuggee装入一个DLL.当PE装载器第一次分解指向DLL的链接时,我们将收到这一事件. (当调用CreateProcess装入 debuggee时)并且当debuggee调用LoadLibrary时也会发生.UNLOAD_DLL_DEBUG_EVENT一个DLL从debuggee中卸载时事件发生.EXCEPTION_DEBUG_EVENT在debuggee中发生异常时事件发生. 注意: 该事件仅在debuggee开始它的第一条指令之前发生一次.异常实际上是一个调试中断(int 3h).如果想恢复debuggee事,以 DBG_CONTINUE 标志调用ContinueDebugEvent 函数. 不要使用DBG_EXCEPTION_NOT_HANDLED 标志否则debuggee会在NT下拒绝运行(Win98下运行得很好).OUTPUT_DEBUG_STRING_EVENT当debuggee调用DebugOutputString函数向我们的程序发送消息字符串时该事件发生.RIP_EVENT系统调试发生错误dwProcessId 和dwThreadId发生调试事件的进程和线程Id.我们可以用这些值作为我们感兴趣的进程或线程的标志符.记住如果我们使用CreateProcess来装载debuggee,我们仍可在PROCESS_INFO结构中获得debuggee的进程和线程.我们可以用这些值来区别调试事件是发生在debuggee中还是它的子进程中(当没有指定 DEBUG_ONLY_THIS_PROCESS 标志时).u 是一个联合,包含了调试事件的更多信息.根据上面dwDebugEventCode的不同,它可以是以下结构:dwDebugEventCodeu的解释CREATE_PROCESS_DEBUG_EVENT名为CreateProcessInfo的CREATE_PROCESS_DEBUG_INFO结构EXIT_PROCESS_DEBUG_EVENT名为ExitProcess的EXIT_PROCESS_DEBUG_INFO结构CREATE_THREAD_DEBUG_EVENT名为CreateThread的CREATE_THREAD_DEBUG_INFO结构EXIT_THREAD_DEBUG_EVENT名为ExitThread的EXIT_THREAD_DEBUG_EVENT 结构LOAD_DLL_DEBUG_EVENT名为LoadDll的LOAD_DLL_DEBUG_INFO 结构UNLOAD_DLL_DEBUG_EVENT名为UnloadDll的UNLOAD_DLL_DEBUG_INFO结构EXCEPTION_DEBUG_EVENT名为Exception的EXCEPTION_DEBUG_INFO结构OUTPUT_DEBUG_STRING_EVENT名为DebugString的OUTPUT_DEBUG_STRING_INFO 结构RIP_EVENT名为RipInfo的RIP_INFO 结构我不会在这一个教程里讲所有这些结构的细节,这里只详细讲一下CREATE_PROCESS_DEBUG_INFO 结构.假设我们的程序调用了WaitForDebugEvent函数并返回,我们要做的第一件事就是检查dwDebugEventCode中的值来看debuggee进程中发生了那种类型的调试事件.比如说,如果dwDebugEventCode的值为 CREATE_PROCESS_DEBUG_EVENT,就可认为u的成员为CreateProcessInfo 并用u.CreateProcessInfo来访问.在我们的程序中做对调试事件的响应. 当WaitForDebugEvent 返回时,这意味着在debuggee进程中发生了调试事件或者发生了超时.所以我们的程序要检查dwDebugEventCode 来作出适当的反应.这里有些象处理Windows消息:由用户来选择和忽略消息.继续运行debuggee. 当调试事件发生时, Windows挂起了debuggee,所以当我们处理完调试事件,还要让debuggee继续运行.调用ContinueDebugEvent 函数来完成这一过程.ContinueDebugEvent proto dwProcessId:DWORD, dwThreadId:DWORD, dwContinueStatus:DWORD该函数恢复由于调试事件而挂起的线程.dwProcessId和dwThreadId是要恢复的线程的进程ID和线程ID,通常这两个值从 DEBUG_EVENT结构的dwProcessId 和dwThreadId成员获得.dwContinueStatus显示了如何继续报告调试事件的线程.可能的取值有两个: DBG_CONTINUE 和DBG_EXCEPTION_NOT_HANDLED. 对大多数调试事件,这两个值都一样:恢复线程.唯一的例外是EXCEPTION_DEBUG_EVENT,如果线程报告发生了一个异常调试事件,这意味着在debuggee的线程中发生了一个异常.如果指定了DBG_CONTINUE,线程将忽略它自己的异常处理部分并继续执行.在这种情况下,我们的程序必须在以DBG_CONTINUE恢复线程之前检查并处理异常,否则异常将生生不息地不断发生....如果我们指定了 DBG_EXCEPTION_NOT_HANDLED值,就是告诉Windows我们的程序并不处理异常:Windows将使用debuggee的默认异常处理函数来处理异常.总而言之,如果我们的程序没有考虑异常,而调试事件又指向debuggee进程中的一个异常的话,就应调用含DBG_CONTINUE标志的ContinueDebugEvent函数.否则,我们的程序就必须以DBG_EXCEPTION_NOT_HANDLED调用 ContinueDebugEvent.但在下面这种情况下必须使用DBG_CONTINUE标志:第一个在ExceptionCode成员中有值EXCEPTION_BREAKPOINT的 EXCEPTION_DEBUG_EVENT事件.当debuggee开始执行它的第一条指令时,我们的函数将接受到异常调试事件.它事实上是一个调试中断(int 3h).如果我们以DBG_EXCEPTION_NOT_HANDLED调用ContinueDebugEvent 来响应调试事件, Windows NT会拒绝执行debuggee(因为它没有异常处理).所以在这种情况下,要用DBG_CONTINUE标志告诉Windows我们希望该线程继续执行.继续上面的步骤循环直到debuggee进程退出. 我们的程序必须在一个很象消息循环的无限循环中直到debuggee结束.该循环大体如下:.while TRUEinvoke WaitForDebugEvent, addr DebugEvent, INFINITE.break .if DebugEvent.dwDebugEventCodeEXIT_PROCESS_DEBUG_EVENT调试事件处理invoke ContinueDebugEvent, DebugEvent.dwProcessId, DebugEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED.endw就是说,当开始调试程序时,我们的程序不能和debuggee分开直到它结束.我们再来总结一下这些步骤:创建一个进程或捆绑我们的程序到运行中的进程上.等待调试事件响应调试事件.继续执行debuggee.继续这一无尽循环直到debuggee进程结束例子:这个例子调试一个win32程序并显示诸如进程句柄,进程Id,映象基址等..386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\comdlg32.incinclude \masm32\include\user32.incincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\comdlg32.libincludelib \masm32\lib\user32.lib.dataAppName db Win32 Debug Example no.1,0ofn OPENFILENAME FilterString db Executable Files,0,*.exe,0db All Files,0,*.*,0,0ExitProc db The debuggee exits,0NewThread db A new thread is created,0EndThread db A thread is destroyed,0ProcessInfo db File Handle: %lx ,0dh,0Ahdb Process Handle: %lx,0Dh,0Ahdb Thread Handle: %lx,0Dh,0Ahdb Image Base: %lx,0Dh,0Ahdb Start Address: %lx,0.data?buffer db 512 dup(?)startinfo STARTUPINFO pi PROCESS_INFORMATION DBEvent DEBUG_EVENT .codestart:mov ofn.lStructSize,sizeof ofnmov ofn.lpstrFilter, offset FilterStringmov ofn.lpstrFile, offset buffermov ofn.nMaxFile,512mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLYinvoke GetOpenFileName, ADDR ofn.if eaxTRUEinvoke GetStartupInfo,addr startinfoinvoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS DEBUG_ONLY_THIS_PROCESS, NULL, NULL, addr startinfo, addr pi.while TRUEinvoke WaitForDebugEvent, addr DBEvent, INFINITE.if DBEvent.dwDebugEventCodeEXIT_PROCESS_DEBUG_EVENTinvoke MessageBox, 0, addr ExitProc, addr AppName, MB_OKMB_ICONINFORMATION.break.elseif DBEvent.dwDebugEventCodeCREATE_PROCESS_DEBUG_EVENTinvoke wsprintf, addr buffer, addr ProcessInfo, DBEvent.u.CreateProcessInfo.hFile, D
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

界面好看的网站外加工订单网

FaceFusion应用场景全解析:覆盖影视、娱乐与数字人制作在流媒体内容爆炸式增长的今天,观众对视觉体验的要求正以前所未有的速度攀升。从电影中“返老还童”的传奇演员,到短视频里与明星同框的普通人,再到直播间里表情灵动的虚拟偶…

张小明 2026/3/5 5:50:18 网站建设

做网站图片如何压缩图片海南哪家公司做网站做的好

MIME:互联网数据格式的基石 1. 引言 HTML 是万维网的基础,但它只是众多使网络成为可能的标准数据类型之一。在互联网和 Web 程序中,存在着更广泛的数据格式集合,用于弥合不同操作系统和硬件平台之间的差距,其中 MIME(Multipurpose Internet Mail Extensions)就是这样一…

张小明 2026/3/5 5:50:21 网站建设

2016网站设计欣赏wordpress+widget+开发

小区人脸识别门禁 目录 基于springboot vue办公管理系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue小区人脸识别门禁系统 一、…

张小明 2026/3/5 5:50:21 网站建设

开源公司网站WordPress修改首页文章预览

你是否曾经为了下载一个网页上的所有图片、CSS和JS文件,不得不一个个右键另存为?😫 那种重复劳动不仅耗时耗力,还容易遗漏重要资源。今天,让我为你介绍一款真正能改变工作方式的工具——ResourcesSaverExt,…

张小明 2026/3/5 5:50:22 网站建设

信宜网站建设wordpress创建数据库类型选什么

UEFITOOL28固件解析工具深度使用指南 【免费下载链接】UEFITOOL28 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITOOL28 UEFITOOL28是一款功能强大的跨平台UEFI固件分析工具,专门用于解析、编辑和重建各类BIOS映像文件。无论您是需要进行固件安全研究、…

张小明 2026/3/5 5:50:23 网站建设

网站建设关于wordpress更换图片地址

Seed-Coder-8B-Base助力低代码平台实现智能化升级 在企业数字化转型加速的今天,越来越多组织开始采用低代码平台来快速构建业务系统。这类工具通过可视化拖拽和配置化设计,让非专业开发者也能参与应用开发。然而现实往往并不理想:一旦涉及复杂…

张小明 2026/3/5 5:50:55 网站建设