鱼C论坛

 找回密码
 立即注册
查看: 6471|回复: 9

[技术交流] 【NASM系列教程2】走向底层的路

[复制链接]
发表于 2011-11-29 13:31:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 川本姨夫 于 2011-11-29 23:57 编辑




本来想睡觉了,突然又睡不着了,所以就来发一篇帖子。。。我好啰嗦啊


       掐指一算,黄道吉日,正是发帖的好时候,果断进入主题:win32汇编

       说起win32汇编,可能大家就觉得很麻烦,语法标号关键字都很难懂,还有各种莫名其妙的符号,最恐怖的还是API那一堆各种参数,各种结构体,各种究极体各种难。。。。。如果你想有个好心情,那建议你投诚用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   call  OK               ;哈哈,我再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。。。),你不高兴就省了,直接用标号代替,把结束那句endproc也扔了,链接命令改为golink /entry  你喜欢的标号 23.obj user32.dll kernel32.dll。

        你在我程序里看见定义段了么?(其实有个默认的text节区,东西全部放里边,不能写,只能读和执行),到后边学习最好还是定义一个.data段存放要写的数据。这就是nasm,简单的不得了,你一高兴直接ctrl+c直接从网页上带走了- -!


    强烈建议大家不要光看,抄家伙试一下啊,下边还有更刺激的


         再上两个代码,分别是隐藏任务栏和现实任务栏,有点意思吧

这是隐藏


%include "..\..\win32\nasmx.inc"
%include "..\..\win32\user32.inc"
%include "..\..\win32\kernel32.inc"
%include "..\..\win32\windows.inc"
entry WinMain

wndname db "Shell_TrayWnd",0
sztext  db  "找不到窗口",0
sure    db  "小心,你要隐藏任务栏",0

extern ExitProcess,MessageBoxA,FindWindowA,ShowWindow
proc _main
   
      call makesure
start  
      push 0
      push  wndname
      call     FindWindowA
      cmp  eax,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
        jmp  start


注释不多,因为我懒嘛。。。
       是不是任务栏不见了,别哭,下边还有个显示任务栏的程序来搭救你


%include "..\..\win32\nasmx.inc"
%include "..\..\win32\user32.inc"
%include "..\..\win32\kernel32.inc"
%include "..\..\win32\windows.inc"

entry WinMain


wndname db "Shell_TrayWnd",0
sztext  db  "找不到窗口",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弄了半天。。。。),大家将就看下,还有,鱼哥,我申精,我满地打滚要求加精,以后我一定洗心革面,好好发帖 。现在很晚了,原创这么多也很累,大家多多回复,我以后会经常来发帖的,偶会想乃们滴






           其实我这个人精力旺盛,一觉醒来发现帖子还没发出去,再加一句 :我知道你们学这些事是为了神马,那些个小花肠子大家都理解,所以更要从底层学习,只要有一点16位汇编基础都可以从win32汇编学起,用nasm无疑是帮你起飞最好的跑道。。。真的睡了,再次要求加精!!!!


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

评分

参与人数 1荣誉 +15 鱼币 +20 收起 理由
小甲鱼 + 15 + 20 赞一个,支持原创!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-29 18:59:55 | 显示全部楼层
看不懂啊,真的是看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-29 19:05:31 | 显示全部楼层
只是听过nasm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-29 21:18:13 | 显示全部楼层
还得一个个push参数,貌似有点麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-24 22:30:04 | 显示全部楼层
这个论坛是我去过的最好的论坛。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-25 06:31:42 | 显示全部楼层
感恩无私的分享与奉献 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-5-25 07:44:22 | 显示全部楼层
我觉得还是MASM好用一些!伪指令省心省力!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-14 07:32:04 | 显示全部楼层
我是喜欢masm的, 但是学校要用nasm。 nasm的教程好少啊! 小鱼哥有好的教材吗? 主要是和C语言混合编程的。。 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-16 14:48:13 | 显示全部楼层
只是听过:sad
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 00:45:21 | 显示全部楼层
支持楼主!德玛西亚!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表