| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:win32汇编学习理解笔记。。
只看楼主 加入收藏
onepc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:223
专家分:569
注 册:2009-8-27
结帖率:54.55%
收藏
已结贴  问题点数:20 回复次数:3 
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
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:10 
00401013  |.  6A 00         push    0                                      ; /ExitCode = 0
//把0压栈? //这个是退出码。
00401015  \.  E8 06000000   call    <jmp.&kernel32.ExitProcess>            ; \ExitProcess
是的,如果程序正常执行到这里的话。返回0意味着程序执行成功。

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从右到左的压栈方式???????
最后一个参数不是在最下面,因为CALL本身还要压入下条指令的EIP。编译器形成的栈桢码还要占位。所以一般第一个参数的访问方式是[ebp+8]而不是[ebp],stdcall本就是右到左压栈被调函数自身清除堆栈。

顺便问下。这个反汇编是否od就可以看到全部反的代码?
基本上是原汁原味,不过你要用了其他语言的库的话就另当别论了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-09-08 10:20
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:10 
反汇编是利用引擎对二进制的再识别,不一定会完全正确,具体可看下OPCODE的知识.
对win32宏汇编的识别率是最高的,基本上可以划等号 阅读起来没任何障碍.
所以只需要先把win32汇编学习熟练就可以. 借助反汇编来学习理解win32汇编代码没什么太大的必要,因为本身就相差不大.所以不用什么都去反汇编去看.
 对反汇编或者逆向感兴趣的话,先学熟悉win32汇编基础,再掌握PE格式,有这些知识,再继续学会比较容易些. 起码你在自己注释时,就会知道哪里用IAT表示,而不是很表面的字面形容了.
还是不要急,慢慢来.先专门学一下win32汇编.

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2009-09-08 18:23
快速回复:win32汇编学习理解笔记。。
数据加载中...
 
   



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

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