川本姨夫 发表于 2011-11-29 13:31:53

【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:}弱弱的问一句,怎么贴代码。。。我就不隐藏了,鄙视那些卖鱼币的,有本事做个东西去网上卖,跑这来赚新手的钱......包括我=-=~~~!

754774889 发表于 2011-11-29 18:59:55

看不懂啊,真的是看不懂

清/wx风 发表于 2011-11-29 19:05:31

只是听过nasm

cqy55555 发表于 2011-11-29 21:18:13

还得一个个push参数,貌似有点麻烦

现在登录 发表于 2013-5-24 22:30:04

这个论坛是我去过的最好的论坛。

bafengao 发表于 2013-5-25 06:31:42

感恩无私的分享与奉献 :)

属専色灰 发表于 2013-5-25 07:44:22

我觉得还是MASM好用一些!伪指令省心省力!

alexI 发表于 2015-5-14 07:32:04

我是喜欢masm的, 但是学校要用nasm。 nasm的教程好少啊! 小鱼哥有好的教材吗? 主要是和C语言混合编程的。。 谢谢

小二A 发表于 2015-5-16 14:48:13

只是听过:sad

EntU 发表于 2015-5-28 00:45:21

支持楼主!德玛西亚!
页: [1]
查看完整版本: 【NASM系列教程2】走向底层的路