<small id='lwigpd28'></small> <noframes id='JiIbcT7H'>

  • <tfoot id='HMlpXq3e'></tfoot>

      <legend id='PoLYqn8Oey'><style id='CqoePbW'><dir id='qxms'><q id='QfJzSGOLWK'></q></dir></style></legend>
      <i id='9jdFC'><tr id='8HRwE'><dt id='XfDbmCQG'><q id='Vcu4PQHW'><span id='TzYQd'><b id='hQxPaH4w'><form id='mQtH'><ins id='g5uDtn1CBj'></ins><ul id='CspOf3y20h'></ul><sub id='Kdi1k8PAgn'></sub></form><legend id='Cu7xMj095'></legend><bdo id='pUY3'><pre id='WkC4jblT5Q'><center id='IFY8eKTlAH'></center></pre></bdo></b><th id='mxQuX5sN4O'></th></span></q></dt></tr></i><div id='oeQr4'><tfoot id='gFGLtheNk'></tfoot><dl id='Nn9GAt'><fieldset id='94UB'></fieldset></dl></div>

          <bdo id='fzraCoVMI'></bdo><ul id='KyPCbV5'></ul>

          1. <li id='4KSwcVv'></li>
            登陆

            用汇编语言诠释Linux的简略之美

            admin 2019-05-17 276人围观 ,发现0个评论

            体系接口

            关于底层调用,话说windows也有syscall,这是有必要的。但是Windows的syscall能够直接call吗?

            能够是能够,但是花费曲折,搞成SDT之类的杂乱概念。下面看看linux是怎样做的吧。

            section .data
            msg db "hello hopy!",0x0a
            section .text
            global _start
            _start:
            mov eax,4
            mov ebx,1
            mov ecx,msg
            mov edx,12
            int 0x80

            mov eax,1
            mov ebx,0
            int 0x80

            直接用int堕入!!!

            关键是体系调用号要知道,开端本猫找的是usr/include/asm-gen*/unistd.h,

            但是都不对。后来找的是usr/include潘娇阳/x86_64_linux_gnu/asm/下的头文件,

            有2个,别离对应x86和x64.、编译衔接指令如下:

            nasm -f用汇编语言诠释Linux的简略之美 elf main.asm
            ld main.o

            运转,段转储过错,查了一下,本猫用的是x64位的linux,所以要生成

            x64位的程序,或许指明是x86的程序,我挑选后者:

            ld 用汇编语言诠释Linux的简略之美-m elf_i386 -o main main.o

            哦鸟!

            体系接口 VS C规范库

            上面咱们看到了怎样仅仅用syscall做一些简略的事,现在咱们看能不能直接调用C规范库中的函数快速做一些"杂乱"的事:

            section .data
            ft db "now is %d",10
            section .text
            extern puts
            extern exit
            extern sleep
            extern printf
            global main
            main:
            mov edi,11
            again:
            dec edi
            push edi
            push ft
            call printf

            push 1
            call sleep

            cmp edi,0
            jnz again
            push msg
            call puts

            push 0
            call 用汇编语言诠释Linux的简略之美exit

            msg:
            db "happy xxx day!",0

            以上代码功用很简略,从10倒数到0,然后打印一行,最终完毕.与之前代码不同的是其间

            调用了C规范库中的函数.编译和曾经相同:

            nasm -e elf main.asm

            咱们看看怎样衔接:

            gcc -m32 -o mai用汇编语言诠释Linux的简略之美n main.o

            好了!运转正常!

            值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,假如开端用

            ld -m elf_i386 -lc -o main main.o

            的方法,首先会提示找不到c库,这能够进入/usr/lib,然后运用

            sudo ln -sv /lib用汇编语言诠释Linux的简略之美/i386-linux-gun/libc.so.6 libc.so

            创立软衔接处理.

            但在运转时提示无法找到可执行文件!该文件分明在的呀?

            咱们换为用gcc来衔接,但要将_start改为main,还要装载32库

            sudo apt-get install ia32-libs

            还会提示找不到h文件,这时再装载库

            sudo apt-get install g++-multilib

            还有2族库,如有必要也可加载:

            sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 
            libstdc++5:i386 libstdc++6:i386
            sudo apt-get install libc6-i386

            最终要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构巨细,

            这时改成如下即可:

            gcc -D_GNU_SOURCE -std=c99 ma用汇编语言诠释Linux的简略之美in.c

            回到体系调用

            之前咱们测验运用了C库的函数完结功用,那么能不能用syscall方法来搞呢?

            明显能够!

            section .data
            ft db "now is X",10
            section .text
            global _start
            _start:
            mov edi,10
            again:
            dec edi
            mov eax,edi
            add eax,0x30
            mov byte [ft+7],al
            mov eax,4
            mov ebx,1
            mov ecx,ft
            mov edx,9
            int 0x80
            mov eax,162
            push 0
            push 1
            mov ebx,esp
            mov ecx,0
            int 0x80

            cmp edi,0
            jnz again

            mov eax,4
            mov ebx,1
            mov ecx,msg
            mov edx,15
            int 0x80

            mov eax,1
            mov ebx,0
            int 0x80

            msg:
            db "happy xxx day!",10
            nasm -f elf main.asm
            ld -m elf_i386 -o main main.o

            在代码中延时运用的是nanosleep,其他和第一篇共同,只不过做了一个bin->ascii的小转化.

            总结

            咱们经过以上几个比如能够看到在Linux下调用体系底层接口是多么的垂手可得,假如不信,请逆向Windows中相同功用的代码,你会觉得在Linux下开发几乎太美好了!!!

            感谢欣赏 ;)

            请关注微信公众号
            微信二维码
            不容错过
            Powered By Z-BlogPHP