全部博文(290)
分类:
2007-10-29 19:57:57
看懂本文你需要的知识点:8086汇编指令, WINDOWS的窗口的基本知识,基本API函数的使用
。
本文的目的:将一个窗口的实质显示出来,即,计算机的一切数据都是数值数据,计算机用数据结构来表示一种资源,无论是硬件资源,还是软件资源,。
模块:
一个模块代表的是一个运行的EXE文件或是DLL文件,用来代表这个文件中所有的代码和资源,磁盘上的
文件不是模块,装入内存中的文件才叫模块,每一个模块用一个模块句柄来标示.
在WIN32中,模块的句柄在数值上等于程序在内存中装入的起始地址.
句柄:
句柄只是一个数值而已,它的值对程序来说没有意义,它只是WINDOWS用来表示各种资源的编号而已,所以只有WINDOWS知道怎么引用它。即使资源的标示。..
知识点:局部变量是用EBP做指针操作的,由于EBP的值随程序的执行环境用可能不同,在80386处理器中用LEA 来传送地址值 ,并放在EAX中,然后将EAX入栈使用
反汇编代码如下:
Call
以下为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] //调用参数入栈,注意不同的语言编写的程序参数入栈的约定可能不同,C,SYSCALL,STDCALL,最右参数最先入栈 ,BASIC,fortran,pascal
最左参数最先入栈
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
往往用0做默认值,如果用局部变量定义了其中的一些字段,那么其他的字段值可能是随机值或其他 ,这样执行的结果是预想不到的 。故在赋值前需要将整个数据结构填0,此函数实现这个填零功能。
Push 1000
Push dword ptr [403000]
Call
Mov dword ptr [ebp-18], eax
Mov dword ptr [ebp-4], eax
Push
Push 0
Call
Mov dword ptr [ebp-14], eax
Push dword ptr [403000]
Pop dword ptr [ebp
Mov dword ptr [ebp-30], 30
Mov dword ptr [ebp
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
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
Push eax
Call
Or eax ,eax
Je short 00401326
Lea eax, doword ptr [ebp
Push eax
Push dword ptr[ebp-50]
push dword [403004]
call
or eax, eax
jnz short 00401324
lea eax, dword ptr [ebp
push eax
call
lea eax , dword ptr [ebp
push eax
call
jmp short 004012E9
leave
retn
call
push 0
call
也不知道写这样的文章有没有意义,不过既然想做,就不必考虑做它的价值,我只是觉得对我了解WINDOWS运行机制有所帮助。