【NASM系列教程2】走向底层的路
本帖最后由 川本姨夫 于 2011-11-29 23:57 编辑{:5_95:}
本来想睡觉了,突然又睡不着了,所以就来发一篇帖子。。。我好啰嗦啊
掐指一算,黄道吉日,正是发帖的好时候,果断进入主题:win32汇编
说起win32汇编,可能大家就觉得很麻烦,语法标号关键字都很难懂,还有各种莫名其妙的符号,最恐怖的还是API那一堆各种参数,各种结构体,各种究极体各种难{:5_107:}。。。。。如果你想有个好心情,那建议你投诚用nasm,这家伙语法超简单,而且很灵活(开源的哦,等你学到一定程度你回来把它拆了。。。),你甚至可以不定义段,全部放在TEXT节区里边(那就写不了数据了=-=。但是可以通过修改段属性实现写代码段,好像有点得不偿失了。。。。)
忘了说最关键的一点,在nasm中除了DB其他伪指令我一概不用,结构体也直接用标号的偏移地址解决,反正都是dword的数据,直接标号+成员数量X4就行了。函数调用全部自己把参数压栈,代码做到清新易读,而且很能训练大家的底层思维哦(以后搞破解大大的有好处的干活)
用nasm首先要有nasm(废话。。。),然后头文件怎么办?百度一下nasmx就能找到啦,设置好环境变量,begin!!(不会下载设置的自行百度)
国际惯例,helloworld,上代码,看看有多简单
%include "..\..\win32\nasmx.inc" ; 路径大家自己不一样自己弄
%include "..\..\win32\user32.inc"
%include "..\..\win32\kernel32.inc"
%include "..\..\win32\windows.inc"
entry WinMain ;传说中的入口点,看着好像VC啊
szText dB "点一个试看看",0 ;定义一些数据
szTitle dB "你点的取消或关闭",0
TEXTOK DB "你点的OK",0
extern MessageBoxA,ExitProcess ;声明这些函数不在源代码中,在其他将要包含或连接进来的模块中
proc _main ;入口函数,不喜欢听“函数”这两个字?那你把它改成你喜欢的标号嘛
;记得把结尾的end proc也去了,这俩是狗男女,一对一对的
messagebox ;标号,下面调用MessageBox
push MB_OKCANCEL ;向堆栈中压入参数
push szText
push szText
push NULL
call MessageBoxA
check
cmp eax,IDOK ;如果你敢点OK
jz callok ;就跳到callok处,赶紧过去看看
anotherbox ;点取消就执行这个
push MB_OK
push szTitle
push szTitle
push NULL
call MessageBoxA
push NULL
call ExitProcess
OK ;没骗你,这是ok子程序
push MB_OK
PUSH TEXTOK
PUSH TEXTOK
PUSH 0
call MessageBoxA
ret
callok callOK ;哈哈,我再call,你被耍了
endproc
%include就不多说(注意路径,我当时就黄了半天卡在这),我这个include路径在asm文件的上两层目录的win32文件夹下(依个人口味,请酌量添加~_~),extern 就是说明这个标号在其他模块中(不用函数名proto 参数列表 啦),当然了,api函数肯定在系统dll中啦,nasm中凡是不带有[ ]的就看做地址,所以masm中那些讨厌的offset addr就没了- -!
还有,nasm中标号可以没冒号,所以很方便的可以自己实现子程序,自己维护堆栈,更加锻炼了你的底层知识。如果你怀念了masm的高级语法(万恶的微软,总是把简单的东西复杂化),那没问题,nasm也有那些伪指令,但是我都没去记,自己查手册吧,其实nasm有一项功能比masm强多了,那就是宏,宏设计得好可以让你编写速度比高级语言还快,不信你试看看。
不废话了,先编译连接nasm -f win32第一次发帖.asm
golink /entry_main 支持lady嘎嘎.obj user32.dll kernel32.dll
看见没,连includelib都省了,直接包含dll名即可。还有那个_main,是由WinMain导出来的(默认的入口函数,怎么看都像vc。。。{:5_104:}),你不高兴就省了,直接用标号代替,把结束那句endproc也扔了,链接命令改为golink /entry你喜欢的标号 23.obj user32.dll kernel32.dll。
你在我程序里看见定义段了么?(其实有个默认的text节区,东西全部放里边,不能写,只能读和执行),到后边学习最好还是定义一个.data段存放要写的数据。这就是nasm,简单的不得了,你一高兴直接ctrl+c直接从网页上带走了- -! {:5_105:}
强烈建议大家不要光看,抄家伙试一下啊,下边还有更刺激的
再上两个代码,分别是隐藏任务栏和现实任务栏,有点意思吧
这是隐藏
%include "..\..\win32\nasmx.inc"
%include "..\..\win32\user32.inc"
%include "..\..\win32\kernel32.inc"
%include "..\..\win32\windows.inc"
entry WinMain
wndname db "Shell_TrayWnd",0
sztextdb"找不到窗口",0
sure db"小心,你要隐藏任务栏",0
extern ExitProcess,MessageBoxA,FindWindowA,ShowWindow
proc _main
call makesure
start
push 0
pushwndname
call FindWindowA
cmpeax,0
jz nowindow
call hidewindow
call ExitProcess
endproc
hidewindow ;就这一句就把那任务栏弄没了,还我任务栏........
push SW_HIDE
push eax
call ShowWindow
quit ;退出程序的地方
push 0
call ExitProcess
nowindow ;如果你的电脑没得任务栏的话。应该不会吧。。。除非你把它弄挂了
push MB_OK
push sztext
push sztext
push NULL
call MessageBoxA
push 0
call ExitProcess
makesure ;给你一次机会让你确认是否隐藏=-=!
push MB_OKCANCEL
push sure
push sure
push 0
call MessageBoxA
cmp eax,IDOK
JNZ quit
jmpstart
注释不多,因为我懒嘛。。。
是不是任务栏不见了,别哭,下边还有个显示任务栏的程序来搭救你
%include "..\..\win32\nasmx.inc"
%include "..\..\win32\user32.inc"
%include "..\..\win32\kernel32.inc"
%include "..\..\win32\windows.inc"
entry WinMain
wndname db "Shell_TrayWnd",0
sztextdb"找不到窗口",0
extern ExitProcess,MessageBoxA,FindWindowA,ShowWindow
proc _main
push 0
push wndname
call FindWindowA
cmp eax,0
call hidewindow
call nowindow
call ExitProcess
endproc
hidewindow
push SW_SHOW ;关键在这个字段,HIDE, SHOW 有什么不同哩
push eax
call ShowWindow
push 0
call ExitProcess
nowindow
push MB_OK
push sztext
push sztext
push NULL
call MessageBoxA
ret
nasm -f win32甲鱼哥你好啊.asm
golink /entry_main 我是新来的.obj user32.dll kernel32.dll
编译连接运行,泪流满面,我的任务栏回来了,我以后再也不对你发脾气了,呜呜,我们回家吧。。。。
是不是觉得nasm比masm好用多了?不管你信不信,我反正是信了。。。。第一次发帖,不知道怎么贴代码,就copy上来的(本来很整齐的代码copy上来就乱了,我在那backspace弄了半天。。。。),大家将就看下,还有,鱼哥,我申精,我满地打滚要求加精,以后我一定洗心革面,好好发帖 。现在很晚了,原创这么多也很累,大家多多回复,我以后会经常来发帖的,偶会想乃们滴{:5_100:}
其实我这个人精力旺盛,一觉醒来发现帖子还没发出去,再加一句 :我知道你们学这些事是为了神马,那些个小花肠子大家都理解,所以更要从底层学习,只要有一点16位汇编基础都可以从win32汇编学起,用nasm无疑是帮你起飞最好的跑道。。。真的睡了{:5_103:},再次要求加精!!!!
{:5_107:}弱弱的问一句,怎么贴代码。。。我就不隐藏了,鄙视那些卖鱼币的,有本事做个东西去网上卖,跑这来赚新手的钱......包括我=-=~~~!
看不懂啊,真的是看不懂 只是听过nasm 还得一个个push参数,貌似有点麻烦 这个论坛是我去过的最好的论坛。 感恩无私的分享与奉献 :) 我觉得还是MASM好用一些!伪指令省心省力! 我是喜欢masm的, 但是学校要用nasm。 nasm的教程好少啊! 小鱼哥有好的教材吗? 主要是和C语言混合编程的。。 谢谢 只是听过:sad 支持楼主!德玛西亚!
页:
[1]