| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:win32汇编学习理解笔记。。
取消只看楼主 加入收藏
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
收藏
已结贴  问题点数:20 回复次数:0 
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就可以看到全部反的代码?
待续。。。。。。
搜索更多相关主题的帖子: 学习 汇编 笔记 
2009-09-05 13:53
快速回复:win32汇编学习理解笔记。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033619 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved