win32汇编学习理解笔记。。
.586.model flat,stdcall ;.model 内存模式[,语言模式][,其他模式]
;定义了 .model flat 自动为各种段寄存器做了下面定义
;assume cs:flat ds:flat ss:flat es:flat fs:error gs:error
;若要使用fs gs的话要在前面声时 assume fs:nothing,gs:nothing |or| assume fs:flat,gs:flat
;windows api 调用使用的是stdcall
option casemap:none
;casemap:none 定义了程序中的变量和子程序名是否对大小写敏感 win32 api的api名称区分大小写
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
szcaption db 'A MessageBox !',0
sztext db 'Hello,World !',0
.code
start:
invoke MessageBox,NULL,offset sztext,offset szcaption,MB_OK
invoke ExitProcess,NULL ;退出程序
end start
od载入之后查看
00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
//先把mb_ok这个值压入
00401002 |. 68 00304000 push 00403000 ; |Title = "A MessageBox !"
//title压入
00401007 |. 68 0F304000 push 0040300F ; |Text = "Hello,World !"
//text压入
0040100C |. 6A 00 push 0 ; |hOwner = NULL
//父句柄压入
0040100E |. E8 07000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
//call 地址 0040101A <jmp.&user32.MessageBoxA> 这个的地址就是在0040101A
//0040101A $- FF25 08204000 jmp dword ptr [<&user32.MessageBoxA>] ; user32.MessageBoxA
//call到这里。这里有一条jmp dword ptr 这里就是messageboxa的地址。
//点jmp dword ptr这句。ds:[00402008]=77D5058A (user32.MessageBoxA)
// 本地调用来自 <模块入口点>+0E
//有这个在下面有这个东东。ds:偏移?这个好像就是dos asm里的段+偏移吧。跳过去就是在user.dll这个文件里的了。
//跳到user里的messagebox执行完之后又回来
//
00401013 |. 6A 00 push 0 ; /ExitCode = 0
//把0压栈? //这个是退出码。
00401015 \. E8 06000000 call <jmp.&kernel32.ExitProcess> ; \ExitProcess
//双跳到 kernel32里执行exitprocess函数了。。
//执行之后程序退出了
//
0040101A $- FF25 08204000 jmp dword ptr [<&user32.MessageBoxA>] ; user32.MessageBoxA
00401020 .- FF25 00204000 jmp dword ptr [<&kernel32.ExitProcess>] ; kernel32.ExitProcess
00401026 00 db 00
00401027 00 db 00
//这个api函数,都是要把最后面的参数入栈,那么就在最下面了。pop时就是最后弹出,那么api函数执行之后。参数从左到右????
难道这个就是stdcall从右到左的压栈方式???????
待续。。。。。。因为我看了几天pe格式。还有学了下od脱壳。不过。。。学不会。只会照别人怎么作怎么做。。
现在静心学下32汇编。。。。。
//后面加上pe方面的理解。输入表这些。。。。请大家帮我看下是否正确?
顺便问下。这个反汇编是否od就可以看到全部反的代码?
待续。。。。。。