Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413618
  • 博文数量: 168
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 13:46
文章分类

全部博文(168)

文章存档

2015年(51)

2014年(30)

2013年(87)

我的朋友

分类:

2014-01-28 17:58:10

看懂本文你需要的知识点:8086汇编指令, WINDOWS的窗口的基本知识,基本API函数的使用

本文的目的:将一个窗口的实质显示出来,即,计算机的一切数据都是数值数据,计算机用数据结构来表示一种资源,无论是硬件资源,还是软件资源,。

模块:
一个模块代表的是一个运行的EXE文件或是DLL文件,用来代表这个文件中所有的代码和资源,磁盘上的

     
文件不是模块,装入内存中的文件才叫模块,每一个模块用一个模块句柄来标示.
     
WIN32,模块的句柄在数值上等于程序在内存中装入的起始地址
.
句柄
:
句柄只是一个数值而已,它的值对程序来说没有意义,它只是WINDOWS用来表示各种资源的编号而已,所以只有WINDOWS知道怎么引用它。即使资源的标示。..  

 

知识点:局部变量是用EBP做指针操作的,由于EBP的值随程序的执行环境用可能不同,在80386处理器中用LEA 来传送地址值 ,并放在EAX中,然后将EAX入栈使用

 

反汇编代码如下:

Call                00401F6        //调用WINMAIN函数,00401F6为函数入口地址

以下为WINMAIN窗口函数

Push                     ebp

Mov               ebp,        esp     //保存堆栈返回指针。

Add               esp,        -50         //为函数局部变量或参数分配空间。

 

Push0              //is NULL, GetModuleHandle returns a handle to the file used to create the calling process.

Call                //系统内核调用作用是获取模块句柄

Mov              dword   ptr  [403000],            eax //保存GETMODULEHAND 返回句柄

 

Push                     2000                   //调用参数入栈

Push        doword   ptr   [403000]   //调用参数入栈,注意不同的语言编写的程序参数入栈的约定可能不同,CSYSCALLSTDCALL,最右参数最先入栈 BASICfortranpascal

最左参数最先入栈

Call                   //加载菜单资源

 

Push                     2000

Push                     dword ptr  [403000]

Call                //加载加速键

Mov               dword     ptr   [ebp-50] ,             eax//保存加速键句柄

 

Push                     30

Lea                eax,dword ptr [ebp-30]

Push                     eax

Call                //API函数使用的大量数据结构中,

                                                                                                   往往用0做默认值,如果用局部变量定义了其中的一些字段,那么其他的字段值可能是随机值或其他 ,这样执行的结果是预想不到的 。故在赋值前需要将整个数据结构填0,此函数实现这个填零功能。

Push                     1000

Push             dword     ptr [403000]

Call                //加载图标

Mov               dword     ptr [ebp-18],          eax

Mov               dword     ptr [ebp-4],            eax

 

Push                     7F00

Push                     0

Call                加载光标

Mov               dword     ptr   [ebp-14],        eax

 

Push                     dword     ptr [403000]

Pop                dword     ptr   [ebp-1C]

Mov               dword   ptr  [ebp-30],              30

Mov               dword   ptr  [ebp-2C],      3

Mov               dword   ptr  [ebp-28],              00401052

Mov               dword   ptr  [ebp-10],              6

Mov               dword   ptr  [ebp-8],         00402078

Lea                eax, dword ptr  [ebp-30]

Push                     eax

Call                //注册窗口类

 

Push                     0

Push                     dword     ptr [403000]

Push                     dword     ptr [403008]

Push                     0

Push                     12C

Push                     190

Push                     64

Push                     64

Push                     0CF0000

Push                     00402085

Push                     00402078

Push                     200

Call                //创建窗口

Mov               dword ptr  [403004],          eax

 

Push                     1

Push                     dword     ptr [403004]

Call                //显示窗口

 

Push                     dword     ptr   [403004]

Call                //更新窗口

 

Push                     0

Push             0

Push                     0

Lea                eax, dword ptr [ebp-4c]

Push                     eax

Call                //下面进入消息循环

Or                 eax  ,eax

Je                  short       00401326

Lea                eax, doword   ptr [ebp-4c]

Push                     eax

Push                     dword  ptr[ebp-50]

push                     dword    [403004]

call               

or                  eax, eax

jnz                 short       00401324

lea                 eax, dword ptr [ebp-4c]

push                     eax

call               

lea                eax , dword  ptr [ebp-4c]

push                     eax

call               

jmp                short       004012E9

 

leave

retn        

 

 

call                004011F6

push              0

call               

 

也不知道写这样的文章有没有意义,不过既然想做,就不必考虑做它的价值,我只是觉得对我了解WINDOWS运行机制有所帮助。

 

 

阅读(1203) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~