使用C++(I386+)编译一个纯二进制文件

原创 2003年10月02日 01:18:00

环境搭建设

在目前,很少有关于这方面太多的资料。因此这也是我下决心来写一些东西的原因,希望这篇文章能对大家有所帮助。在读该篇文章前,你必须有一定的基础。否则,在阅读时会有很大困难,首先你要了解汇编语言及C语言,其次,你要会使用LINUX

首先我要先介绍一下,所需要的硬件及软件环境。

1、一台INTELI386构架的PC机或者更高

2、一份LINUX操作系统,如:红帽子。

3、GNU GCC编译器,这个C编译器通常是LINUX自带的。请用此命令(GCC –VERSION)来检查以下它的版本,我这里显示的是2.7.2.3。也许在你哪里可能显示的不是这个版本,但是我想应该不会有太大的问题。

4、版本为0.97或者更高的NASMNASM是一个免费的支持便宜多种文件对象格式的汇编编译器,它的语法设计的的很简单,很容易上手。到这里寻找相应的版本http://www.ibiblio.org/pub/Linux/devel/lang/assemblers/

5、一个文本编辑器

安装汇编编译器

       把从INTERNET上下载到的文件,在一个适当的目录下解压,输入下列命令:

              gunzip nasm-0.97.tar.gz

tar -vxf nasm-0.97.tar

       上面的命令会创建一个叫做nasm-0.97的目录,进入该目录我们开始编译这个汇编编译器,输入下列命令:

                     ./configure

make

       这样会创建两个可执行文件nasm ndisasm.。你可以把这两个文件考备到/usr/bin,这样就可以很容易的来执行该文件了。接下来,你可以把刚才因为编译而创建的目录及目录下所有的文件删除了。经过这些步骤,我们就可以开始进入真正的主题了。

 

开始编译我们的第一个二进制文件

       使用任何一个文本编辑器,创建一个叫TEST.C的文件,然后在输入以下内容:

              int main () {

}

       然后我们开始编译这个文件。输入以下命令:

              gcc -c test.c

ld -o test -Ttext 0x0 -e main test.o

objcopy -R .note -R .comment -S -O binary test test.bin

       请注意,这里的test.bin文件是一个二进制机器码的文件,和我们平时在WINDOWSLINUX下运行的可执行文件不一样。需要把二进制机器码经过一定格式的封装后通过操作系统的装载器装载后才可以在操作系统里运行。可执行文件不是这篇文章的主题,在这里我们就不做讨论了。如果想学破解的朋友,可以在先在二进制机器码文件上下下功夫,相信我这对你以后的一定会有帮助的,好了现在言归正传,开始介绍二进制机器码了。

       经过上面的步骤,我们已经创建了一个叫test.bin的二进制机器码文件。我们可以用刚才编译过的ndisasm来看我们的第一个二进制机器码文件。请输入下面的命令:

              ndisasm -b 32 test.bin

       当你按下回车后,就会在屏幕上输出以下内容:

00000000           55          push ebp

00000001            89E5      mov ebp,esp

00000003           C9         leave

00000004           C3         ret

       我们会在屏幕上看到有三列文字,第一列是表示指令在内存中的地址。第二列是指令的二进制码,第三列就是指令的汇编代码。注意指令的汇编代码是和指令的二进制码一一对应的。

       你应该注意到,这是一个32位的代码,GNC GCC只能生成32位的代码。因此要运行这个程序也必须在32位的环境中运行。这段代码只是完成了一个住函数的框架,并没有执行任何指令。EBP指针是用来保存函数参数的。

使用CMake将一个源文件编译成一个可执行的二进制文件

使用CMake将一个源文件编译成一个可执行的二进制文件
  • zhuquan945
  • zhuquan945
  • 2016年10月11日 15:07
  • 2145

编译静态二进制文件

现在有一个文件"a.c",其中内容如下: #include int main() { printf("Hello World"); return 0; }使用"gcc a.c"命令,...
  • DSLZTX
  • DSLZTX
  • 2015年11月09日 08:03
  • 1009

使用nasm和gcc生成无格式的二进制文件

前两天看到一篇文章,使用C编译器创建无格式的二进制文件(i386+)(1-6)(译)   http://xieyubo.spaces.live.com/blog/cns!55B39819C9DA...
  • panwuqiong
  • panwuqiong
  • 2012年02月17日 20:55
  • 1881

使用GCC生成无格式二进制文件(plain binary files)

使用C语言生成一个二进制文件使用自己喜欢的文本编辑器写一个test.c:int main(){}再使用如下命令编译:gcc –c test.cld –o test –Ttext 0x0 –e main...
  • tianxiaogang12
  • tianxiaogang12
  • 2010年08月29日 23:33
  • 1994

GCC二进制工具介绍

Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、...
  • tq02h2a
  • tq02h2a
  • 2008年09月06日 21:06
  • 1435

C/C++程序从编译到最终生成可执行文件的过程分析

转载http://apps.hi.baidu.com/share/detail/32660500 C/C++程序编译步骤 如何生成可执行文件      ********...
  • wyb19890515
  • wyb19890515
  • 2012年01月19日 15:46
  • 18771

使用C++(I386+)编译一个纯二进制文件

环境搭建设在目前,很少有关于这方面太多的资料。因此这也是我下决心来写一些东西的原因,希望这篇文章能对大家有所帮助。在读该篇文章前,你必须有一定的基础。否则,在阅读时会有很大困难,首先你要了解汇编语言及...
  • hacking
  • hacking
  • 2003年10月02日 01:18
  • 843

用来生成二进制内核的Makefile样例

弄出了下面这个Makefile,在偶的Linux试了一切正常:Makefile AS = nasm                                    # 使用nasm作为汇编器. ...
  • axx1611
  • axx1611
  • 2006年12月26日 20:44
  • 2631

一步一步学习C++(类)之虚函数和纯虚数

1、 该函数必须与基类的虚函数有相同的名称 2、 该函数必须与基类的虚函数有相同的参数个数和相对应的参数类型。 3、 该函数必须与基类的虚函数有相同的返回值,或满足类型兼容规则的指针,引用...
  • xy010902100449
  • xy010902100449
  • 2015年04月09日 19:51
  • 1656

Android 使用NDK编译二进制文件并运行

Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件。 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文...
  • u014088294
  • u014088294
  • 2015年11月19日 11:14
  • 2313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用C++(I386+)编译一个纯二进制文件
举报原因:
原因补充:

(最多只允许输入30个字)