文章作者:evilknight
信息来源:邪恶八进制信息安全团队(
www.eviloctal.com)
第一章: C语言概述
节1.1 编绎环境介绍
这里只是简单的介绍一下我们的编绎环境,关于C的历史这些,在课件里有,这个课件是我当时参加黑客X档案举办的那个C写后门与后门技术的C基础课件,我会打包一起附上来的。注:课件是以C90为基础的,我是以C99标准写的这份快速入门的 C基础教材,所以请大家注意区分。
这也是本人第一次写这类的教材,不足以及错误之处请大家火速指出,以免误导初学者,呵呵。
现在先简单的介绍一下编绎环境吧,如果是windows用户的话建议使用Dev-c++编绎器(4.9.9.2这个版本),Dev-cpp是一个GCC在win32下的IDE程序,用Dephi 5编写,只有2M,给出一个下载地址:
http://milanfff.vip72.25idc.com/ ... p-4.9.9.2_setup.exe
如果是linux平台的话直接就可以使用GCC了.
节1.2 一个简单的C语言实例
介绍了编绎环境,现在让我们来看一个简单的C程序:
#include
int main(void)
{
printf(\"Hello World.......\\n\");
return 0;
}
上面就是一个简单的,很经典的一个程序入门的程序,下面我们依次对程序的每一行进行分析.
#include
这行就是告诉编绎器包含文件stdio.h中的全部信息,stdio.h是所有C语言编绎包的一个标准部分,标准的输入输出(standard input/output header)。#include 可能大家还注意到了这个,在C中预处理指令(preprocessor directive)都是以# 号开头的,注意,预处理指令可不是C语言的语句哦,这个我们在以后的章节会祥细说明的。
int main(void)
可能看到这里有些人会问,怎么我看到有些人写的是void main(void)的呢,我可以很明确的告诉你,他这样写是错的,C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C ),那他的代码为什么可以在VC6.0编绎器中通过编绎呢,因为VC6.0出生的年代以以及他对类型的检测不严格,所以导致这个错误的代码可以编绎。
C程序中包含一个或者多个函数,且必须要有一个主函数(main)也只能只有一个主函数,函数前的int型表明此函数的返回值是整型,大家也可能注意到 main括号里面的void了,这里为什么要用void呢,为什么不写int argc, char **argv呢,因为函数名后面的圆括号里一般包含传递传递给函数的信息,因为我们不用他传递任何信息,所以为空(具体的关于函数传递的细节我们在以后也会祥讲的),可能还会有人问,那不用他传递,我们直接留空就行了,在这里大家要注意一下,如果是C++的话你可以留空,如果是C的话,请写上一个 void.在C中函数名后面的圆括号为空,并不表示他不接受任何参数信息,而是表示他愿意接受一切,而C++函数后面的圆括号为空则表示不接受任何参数信息,大家有意识的区分一下。
{
statement;
}
在C中所有的函数都是使用花括号来表函数体的开始与结束,他们存在是必不可少的,也只能由花括号,不能由小括号,中括号取代,同时花括号还可以用来把函数中的语句聚集到一个单元或代码块中。
printf (\"Hello World.......\\n\");
函数调用,这个是C语言的一个标准函数,圆括号表明printf是一个函数名,圆括号中包括的内容是从函数main()传递到函数printf ()的信息,程序将如何处理printf()里的参数呢?大家可能也注意到了\"Hello World.......\\n\"没错,程序就是通过识别两个双引号里面的内容.大家也可能注意到了后面有一个\\n,这个代表换行,关于\\n这些转义字符我会在讲数据类型的时候祥讲的。
return 0;
最后一个了,哎,打字打到手好累,这里return 0;的意思是返回一个0给main() 函数,操作系统通过main() 的返回值来判断程序是否结束,返回0表示程序正常结束,在大多数系统中,main的返回值是状态标识。返回值为0表明main成功执行了。其它的返回值的意义由操作系统来定义。通常非0的返回值表明发生了错误。每个操作系统都由自身的、用于告诉用户main函数返回值的途径。
节1.3 编绎->链接->运行
前面讲了那么多,代码也写了,但是怎么样才可以弄成可执行程序呢,呵呵,经过了编辑,我现在来教大家编绎了,如果是使用windows平台的用户的话那么请运行你的dev-c++,然后再新建一个工程,依次点\"File\" -> \"New\" -> \"Project\",在弹出的窗口当中我们选C Project,Name你就自己写了吧,我这里写bin,喜欢什么就写什么,然后点一下Console Application,因为我们要编的只是一个命令行的程序,点ok,这时会提示你保存路径,我选择在C盘的bin目录.按ok。我们再把刚才写的代码打上去就可以了,之后再点compile,第三行最左边的那个图标,也可以点菜单栏的\"Execute\"->\"Compile\"进行编绎, 编绎完成之后我们来运行,打开一个cmd窗口,进入刚才编绎目录,我们是c:\\bin,进去之后键入bin就可以运行了...是不是看到了那个可爱的 Hello World........。(如果英语不好的话在第一次运行的时候选择中文就好了)
下面我们讲linux平台编绎过程,我们先写代码
$ touch bin.c
$ vi bin.c
按i之后,我们再把刚才的代码敲进去,完成后按一下ESC,再敲入:wq
$ gcc bin.c -o bin
$ ./bin
呵呵,是不是看到了那个可爱的Hello World........
这里我就不具体的命令了,比如vi的使用,gcc的参数等,你们有兴趣的话可以自己看一下,下面我给出了资料的地址...
1.3 大致说一下编绎和链接(参考C Primer plus)
论坛t0xin建议:讲C的话最好把编译器和链接器之类的都详细讲下效果会更好编绎器这些祥讲就不可能了,首先本人能力有限,我那本现在编绎原理只看了几页而已,呵呵,只能讲一些基本的。呵呵。
一个程序要经过四个步骤:编辑->编译->链接->运行
编译器首程序代码转换为中间文件,链接器再将些中间文件和其它的代码相结合起来生成可执行文件。C 使用被划分为两部分的这一方法使程序便于模块化。你可以分别编译各个模块,然后使用链接器将编译过的模块结合起来,这样,如果需要改变一个模块,则不必重新编译所有其他的模块。同时链接器将您的程序与预编译的库代码结合起来。
中间文件的形式有多种选择,最一般的选择,是将源代码转换为机器语言代码,将结果放在一个目标代码文件(简称目标文件)。虽然目标文件包含机器语言代码,但该文件还不能运行,目标文件包含源代码的转换结果,但它还不是一个完整的程序。
第一,目标文件中缺少的第一个元素是一种叫做启动代码的东西,此代码相当于您的程序和操作系统之间的接口。
第二,目标文件缺少的第二个元素是库例程的代码,几乎所有C程序都利用标准C库中所包含的例程(称为函数)。
链接器的作用是将这三个元素(目标混合式码、系统的标准启动代码和库代码)结合在一起,并将他们存放在单个文件,即可执行文件中。对库代码来说,链接器只从库中提取您所使用的函数所需要的代码。
如果大家有兴趣的话可以打开下面的链接,看一下GCC编译程序的一个流程。
GCC编译流程
http://book.csdn.net/bookfiles/132/1001324459.shtml
在我们写好代码的时候,直接就编译器编译完就可以运行了,似乎没有经过链接这个步骤,呵呵。这是因为系统的不同,一些系统要自己分别运行编译器和链接器,在另外一些系统上,编译器可以自动启运链接器。
节1.4 关于注释
在程序变得更复杂之前,我们应该明白C 如何处理注释的,注释可以帮助其他人阅读程序,通常用于概括算法、确认变量用途或者阐明难以理解的代码段。注释不会增加程序的大小的,因为编绎器在编绎的时候会忽略所有的注释。
/* 这是一个注释 */
/* 可以写
成几
行也行*/
/*
这样也行
*/
/* 这样就不行了,没有结束标记。
这是C的注释,但是在C99中增加了另一种风格的注释//,呵呵,学过C++或者java的人都清楚吧,不过这种注释补限制在一行内,因为一行的结尾就标志着注释的结束,所以这种形式只要在注释的开始需要注释标志符号。
// 这是一个注释
// 这样写就
不行了
下面我给出一个注释的范本
/*******************************************************
*
* Author: EvilKnight
* Date : 2006-7-7
* Version : None
* Copyright (c) 2006,EvilKnight,All right reserved.
*
* Functional: 十进制数字转成二进制输出.
*
********************************************************/
当然,你也可以
//******************************************************
//
// Author: EvilKnight
// Date : 2006-7-7
// Version : None
// Copyright (c) 2006,EvilKnight,All right reserved.
//
// Functional: 十进制数字转成二进制输出.
//
//*****************************************************
参考资料
dev-c++
http://milanfff.vip72.25idc.com/ ... p-4.9.9.2_setup.exe
C课件
http://milanfff.vip72.25idc.com/study/program/c.rar
C写后门与后门技术语音与课件
上传当中.......
GCC 中文手册
http://www.21ic.com/news/n5203c79.aspx
vi 命令(最下面)
http://www.chinaitlab.com/www/special/lincom.asp
最后谢谢 依然﹎饭特稀(QQ: 114340871) 提供ftp.
如果不能下载请及时通知.....