天象独行 发表于 2020-11-30 16:10:55

第一个窗口程序分析

本帖最后由 天象独行 于 2020-12-3 19:21 编辑

第一个窗口程序分析作者:天象独行时间:20201130

一;事件驱动       窗口程序是事件驱动,接下来我们用如下图来对比一下事件驱动和过程驱动(过程驱动是Dos时期经常采用的方式)。
       如上图,过程驱动的“文件名”需要按照过程顺序输入,事件驱动则不一样,用户可以随意选择先输入哪个文件名。用户的操作相当于发送了一个消息,这些消息没有任何顺序关系。二;窗口框架       这里需要说明几个成员(也可称呼为函数API)它们是协助计算机来处理程序的。2.1;USER32.DLL       USER32.DLL文件可以用来从程序消息队列中取出消息,调用各种消息在不同角色之间相互传递。2.2;GetMessage函数       该函数在USER32.DLL文件当中,从消息列队中取出消息。(每个Window程序都维护一个消息列队,当应用程序没有取消息时候,消息保存在消息列队当中)。2.3;DispatchMessage函数       DispatchMessage函数可以协助应用程序处理取出来的消息。该函数来调用窗口过程。2.4;PostMessage函数       PostMessage函数可以协助进程之间相互传递消息。2.5;框架说明       详细如下图,首先消息通过键盘,鼠标等其他设备产生保存在系统消息队列当中。该消息队列是由Window操作系统维护的。当程序执行到GetMessage函数的时候,GetMessage函数所在的USER32.DLL从消息队列中取出消息,然后反馈给相关应用程序。GetMessage获取消息的时候,如何处理该消息则需要请DispatchMessage函数来取协调处理。如果在将消息传送给DispatchMessage之前需要对消息进行加工,则需要其他函数帮忙,比如:TranalateMessage。

三;代码分析程序如附件
       3.1;程序入口       编程语言程序入口一般在start 位置。我们来定位到相关位置,且查看内容。从下图位置我们可以了解到。入口程序调用了子程序_WinMain,然后将ExitProcess推出函数执行。       3.2;子程序“_WinMain”       _WinMain程序主要分为几个功能部分:注册窗口类,建立并显示窗口,消息循环。在执行这些部分之前首先需要获取应用程序句柄。使用GetModuleHandle函数来获取,详细如下图:
       3.2.1;注册窗口类       注册窗口类部分执行了一个LoadCursor函数以及RegisterClassEX函数。其中LoadCursor函数作用是载入鼠标。RegisterClassEX函数的作用是注册窗口类,其参数是WNDCLASSEX结构数据。
       3.2.2;建立并显示窗口
       首先使用函数CreateWindowEx函数来创建窗口,函数ShowWindow显示窗口功能,UpdateWindow函数刷新窗口。       3.2.3;消息循环       万事具备,接下来我们使用一个死循环来执行消息获取处理的过程。首先执行GetMessage函数来获取消息,通过TranslateMessage函数来对消息进行加工,DispatchMessage来协调回调函数来处理不同的消息。
       3.2.4;_ProcWinMain       该程序是有个回调函数,它是由操作系统所调用的。具体是通过DispatchMessage函数来协调使操作系统来调用该函数。四;逆向分析   4.1.;程序入口       我们通过IDA打开程序,找到程序入口,程序入口运行了标号sub_401089处的代码,还有ExitProcess函数。
   4.2;标号sub_401089       接下来,我们分析一下标号sub_401089处的代码



页: [1]
查看完整版本: 第一个窗口程序分析