网络编程基础(高手绕道)

如果你是高手,就不要看了 :)

经常会看到许多人问几乎相同的基础问题,这里根据自己的习惯做一些描述,这个帖子会慢慢根据大家的问题更新(希望可以坚持住 ^_^),希望对初学者有所帮助。

一、关于语言、编译器及系统

我们知道,在计算机里面进行程序设计至少需要掌握一种程序设计语言。常见的程序设计语言包括C/C++、ASM、BASIC、Delphi、Perl等,你随便根据兴趣去学习一种语言都可以实现程序设计这个目的,这些语言并没有谁比谁更好的问题(这是一个理解问题,实际上一些语言应该说比一些语言更先进,比如可以说C++比C更先进,但不能说谁比谁好,每一种语言都是优秀思想的结晶,我这样理解),只是它们的侧重点不同。比如,ASM、C比其他语言更接近系统的底层,使得它们适合做系统方面的程序设计、而用BASIC可以更快的设计应用程序等。作为网络程序设计我更喜欢C/C++语言,它有目标程序较小、运行速度快等优点,还包括习惯问题(所以,下面的描述中如果不特别说明,都以C/C++为例),当然选择什么语言进行程序设计是见仁见智的问题(你决定选择C/C++了吗?如果决定了,下面的的描述会更有针对性)。

我们选择好一种语言后,并编写好了程序代码,这么样才能让系统运行我们的程序呢?这就需要编译器了,编译器的作用就是把类似下面的源代码编译成系统可以识别并执行的代码:

#include <stdlib.h>

int main()

{

printf(“hello word.rn”);

return 0;

}

所有的语言都有自己的编译器,C语言的编译器有TC、BC等,C++语言的编译器有Visual C++、C++ Builder等。C和C++语言的关系是很密切的,C++语言是C语言的超集,而因为向下的兼容性,所以,如果你写的C源代码符合ANSI C标准,那么其在C和C++的编译器里面都可以编译,相反,C++的源代码只能在C++的编译器中编译。

那么编译器除了可以把源代码编译成可执行代码还有其他的作用吗?

答案是有,一般的情况下,编译器都提供一个集成的环境给设计这编写、编译程序,还包括一系列的函数库,比如上面例子中的prinrf就是stdlib.h提供的一个库函数。在涉及到网络程序设计中,常听到Winsock、Winapi等说法,而这些也是编译器提供的一套库函数,而这些库函数有一些编译器是不提供的,如TC、BC等,所以这些编译器不可以你作为网络程序设计的编译器,当然,这些编译器不适合作为网络程序设计的编译器还有其他重要的原因。

常看见下面这样的问题:

这个程序我用TC怎么编译不了?

可以不可以用TC编写网络程序?

现在告诉你,不可以,除了上面的原因,更重要的原因是我们现在程序所运行的平台是Windows(当然有其他的,但情况是类似的),而Winsock、Winapi本身是由系统(Windows)提供给我们的接口,编译器是帮助我们使用这些接口的桥梁,而TC等编译器本身没有这个功能,所以不能使用它们来帮助我们编写网络程序。还有,TC等编译器是为DOS等16位操作系统设计的,已经不能够适用我们现在32位的操作系统环境了。所以,我推荐Visual C++、C++ Builder或其他32位C++编译器。

Visual C++、C++ Builder或其他的32位C++编译器谁更好呢?这也是见仁见智的问题,常见到有些报道说现在的C++ Builder比Visual C++要好,这两个编译器不断的在竞争、攀比。我选择Visual C++,并不是说它比C++ Builder好,而是因为它编写的可执行代码(目标文件)比较小,这也不是说它比C++ Builder好,而是因为它是Microsoft出品的,而Windows也是Microsoft出品的,在Windows的发行版本中本身就包含了很多运行库,这样Visual C++的目标代码比较小。

二、关于代理

一般做坏事的时候都害怕对方发现自己的真实IP,怎么办?用代理是简单的办法。下面描述如何编程使用各种代理。

1、HTTP代理

HTTP代理可以把我们的HTTP请求通过HTTP代理服务器转发到我们要访问的HTTP服务器,再把结果返回给我们,以达到代理的目的。但其功能单一,只能实现HTTP的代理,具体可以查看RFC 2068、2616等相关RFC文档。

正常情况下,我们请求HTTP服务是这样的:首先和目的服务器的HTTP服务端口建立TCP连接,然后做类似“GET /index.html HTTP/1.0”的请求,HTTP服务器返回结果。当通过HTTP代理的时候是这样工作的:首先和HTTP代理服务器的服务端口建立TCP连接,然后做类似“GET http://目标服务器地址/index.htm HTTP/1.0”的请求,代理服务器对你的目标服务器做请求后返回结果给你。

相关的代码在网上很容易可以找到,这里就不列举了。

2、socks代理

socks是一个简单灵活的协议框架,包括4和5两个版本,sock5是由IETF核准的基于TCP/IP协议的基本应用程序代理协议,socks由两个部分组成,服务端和客户端。具体信息可以查看RFC 1928相关文档,在网上也可以搜索到许多基于socks5的开源项目,对照RFC文档,你可以了解这个协议的使用。

『以下信息来直接摘自互联网』

sock5代理客户端的工作程序是:

1.客户端向代理方服务器发出请求信息。

2.代理方服务器应答

3.客户端接到应答后发送向代理方服务器发送目的ip和端口

4.代理方服务器与目的连接

5.代理方服务器将客户端发出的信息传到目的方,将目的方发出的信息传到客户端。代理完成。

由于网上的信息传输基本上都是运用tcp或udp进行的,所以使用socks5代理可以办到网上所能办到的一切,而且不用担心目的方会查到你的ip,既安全又方便。

如何用代理TCP协议:

1.向服务器的1080端口建立tcp连接。

2.向服务器发送 05 01 00 (此为16进制码,以下同)

3.如果接到 05 00 则是可以代理

4.发送 05 01 00 01 + 目的地址(4字节) + 目的端口(2字节),目的地址和端口都是16进制码(不是字符串)。 例202.103.190.27 – 7201 则发送的信息为:05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201)

5.接受服务器返回的自身地址和端口,连接完成

6.以后操作和直接与目的方进行TCP连接相同。

如何用代理UDP连接

1.向服务器的1080端口建立udp连接

2.向服务器发送 05 01 00

3.如果接到 05 00 则是可以代理

4.发送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字节)

5.服务器返回 05 00 00 01 +服务器地址+端口

6.需要申请方发送 00 00 00 01 +目的地址IP(4字节)+目的端口 +所要发送的信息

7.当有数据报返回时 向需要代理方发出00 00 00 01 +来源地址IP(4字节)+来源端口 +接受的信息

注:此为不需要密码的代理协议,只是socks5的一部分,完整协议请看RFC1928

三、关于编译

拿到源代码以后如何编译?出现错误如何处理?

在Windows下,如果你拿到的源码包解压后(一般要带目录解压)首先看有没有readme文件,如果这些源码是一个VC的项目,那么readme文件中会包含一个文件列表及文件的功能及一些说明性的文字(这个文件是由VC自动建立的),那么你应该查找有没有一个dsw后缀的文件,这个文件是VC的工作区文件,双击这个文件,VC会自动启动并打开这个文件,一般情况下是可以直接编译通过的;如果没有这个文件,那么看是不是有一个dsp后缀的文件,这个文件是VC的项目文件,同dsw文件的打开方式,在VC下编译的时候会问你是不是建立工作区,选择是后也是可以正确编译的;如果这些源码不是由VC建立的项目,那么这个readme文件中会包含这些源码的编译方式及编译环境,看好,是不是可以在windows下编译,怎么编译。一般情况下,如果我们找到这些说明文件,那么源码是可以很好的编译的;如果没有找到任何说明性的文件,那就比较麻烦了,是不是非编译不可?如果不是那就算了,找个好编译的。 ^_^

在windows下,源码包一般是zip、rar后缀的,如果是gz、tar后缀的,一般情况下不是windows下的源码,大多数情况下,一个完整的源码包是可以很简单的编译成功的。

经常有人问exploit如何编译,比如xfocus就有很多exploit,有独立的也有在文章里面贴出来的,一般就是一段代码,遇到这样的情况先把代码复制下来,存成c后缀的文件(这个很重要,编译器在编译的时候会安装源码文件的后缀区分你是用什么语言编写的而编译,C++源码文件的后缀是cpp,C++的检查项目要比c严谨的多,而exploit大多是用c编写的,如果后缀不对,有可能编译不了)。然后打开这个c文件,看看开始的说明有没有编译方式,一般好的作者会写上编译的环境及其方法的,比如在vc的编译环境下用cl example.c编译或者在linux下用等gcc example example.c(gcc是linux下的C/C++编译器)等,那么我们运行vc目录下bin目录的VCVARS32.BAT文件(vc控制台环境设置文件,vc安装的时候会设置这些环境,并在系统启动的时候生效,如果你安装的时候没有选择,那么才需要运行这个文件),然后照说明里面的方法编译就可以了;如果没有说明如何编译,那么我们先区分一下这个代码是在什么环境下编译的,如果包括windows.h或者winsock.h这些头文件,那肯定在windows下是可以编译的,如果不包括,那么就没准是linux下的了。:)如果是windows下可以编译的代码,那么用vc打开这个c文件,直接编译好了,当然有可能出错误,如果出现编译(Compiling)错误,那就是代码的写法上面有问题,要具体情况具体分析,根据知识自己改,但一般编译exploit的时候很少出现编译错误,经常会出现连接(Linking)错误,比如下面这样:

error LNK2001: unresolved external symbol __imp__recv@8

~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~

连接错误号  错误原因                          函数名

是说编译器不能连接recv这个函数,不知道从那个lib文件中获得函数的详细信息,解决的办法是在msdn中查找recv这个函数,函数的说明文件会有下面的文字:

Requirements

Windows NT/2000/XP: Included in Windows NT 3.1 and later.

Windows 95/98/Me: Included in Windows 95 and later.

Header: Declared in Winsock2.h.

Library: Use Ws2_32.lib.

~~~~~~~~~~~~~~~~~~~~~~~

注意这句话

查到后,只要在代码的开始加如下面语句:#pragma comment(lib,”ws2_32″)就可以了,也可以在vc中选择Project->Settings->Link->Object/library Modules中添加这个lib文件也可以。当然我只是举recv这个函数,别的函数可以同样处理。

如果遇到别的连接错误,可以在msdn中搜索这个错误信息(搜索关键字不要包含函数名称)。比如上面那个错误可以搜索“error LNK2001: unresolved external symbol”,可以在msdn中找到错误的原因及其解决办法。如果是编译错误,呵呵,只能靠你自己了。

转载:Secluded论坛   目标来源:网络编程基础(高手绕道)

转载:Secluded论坛   目标来源:网络编程基础(高手绕道)