一;事件驱动 窗口程序是事件驱动,接下来我们用如下图来对比一下事件驱动和过程驱动(过程驱动是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处的代码
第一个窗口程序分析
第一个窗口程序分析