Tag Archives: 网络开发

网卡如何接受和发送数据

网卡如何发送数据包:

IP报文可以看作一个包。

linux网卡驱动程序,将IP包添加14字节的MAC包头,构成MAC包。 MAC包中含有发送端和接收端的MAC地址信息。既然是驱动程序创建的MAC包头信息,当然可以随便输入地址信息的。主机伪装就是这么实现的。 驱动程序将MAC包拷贝到网卡芯片内部的缓冲区,就算完事了。有网卡芯片接手处理。 网卡芯片对MAC包,再次封装成物理帧,添加头部同步信息和CRC校验。然后丢到网线上,就完成一个IP报文的发送。所有挂接到本网线的网卡都可以看到该物理帧。  

网卡如何接收数据包:

网线可以看作一个高速公路,物理帧也就是辆汽车,网卡呢,或许是个加油站吧。

    从这个角度讲,汽车和加油站没有绝对的关系,所有汽车都可以进入该加油站。

继续阅读

使用PCAP创建你的sniffer

利用pcap你可以截取你网卡的所有的包,创建你自己的网络嗅觉器(sniffer)

pcap是一个用C写的,基于BSD授权协议的,抓取网络包的工具。pcap代表是的acket capture,就是包截取。它有2个版本,unix-based的操作系统下面的libpcap和windows下面的winpcap。 有了这个包,你可以很轻松的截取你网卡的中所有数据包。像tcpdump, Wireshark, CA NetMaster,Microsoft Network Monitor 3.x都是基于pcap实现的。

下面简单说说怎么使用winpcap包来创建截取网卡中所有包。

1. 下载sdk

winpcap的官网, http://www.winpcap.org/default.htm 下载dll包 http://www.winpcap.org/install/default.htm 或者直接下载本文使用的包 http://www.winpcap.org/install/bin/WinPcap_4_1_3.exe 这个是一个安装包,会安装一些必要的动态库到c:windowssystem32 这些dll是我们的程序在运行的时候加载。 下载开发包 http://www.winpcap.org/devel.htm 或者直接下载本文使用的包 http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip 这个里面包含 文档 示例代码 头文件include 库文件lib include和lib是我们在编译程序的需要,否则,你无法编译连接。

2. 创建vc工程

使用vs2005创建一个win32的控制台工程。 打开工程的属性,添加WPCAP, HAVE_REMOTE到preprocessor中, 添加include的路径,和lib的路径 添加wpcap.lib, ws2_32.lib到linker的library中。
3. 使用API截取数据包 添加main.cpp文件到这个空的工程中,内容如下:
#include <stdlib.h>
#include <stdio.h>

//
// NOTE: remember to include WPCAP and HAVE_REMOTE among your
// preprocessor definitions.
//

#include <pcap.h>

#define LINE_LEN 16

int main(int argc, char **argv)
{   
pcap_if_t *alldevs, *d;
pcap_t *fp;
u_int inum, i=0;
char errbuf[PCAP_ERRBUF_SIZE];
int res;
struct pcap_pkthdr *header;
const u_char *pkt_data;

    printf("pktdump_ex: prints the packets of the network using WinPcap.n");
    printf("   Usage: pktdump_ex [-s source]nn"
           "   Examples:n"
           "      pktdump_ex -s file://c:/temp/file.acpn"
           "      pktdump_ex -s rpcap://\Device\NPF_{C8736017-F3C3-4373-94AC-9A34B7DAD998}nn");

    if(argc < 3)
    {

        printf("nNo adapter selected: printing the device list:n");
        /* The user didn't provide a packet source: Retrieve the local device list */
        if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
        {
            fprintf(stderr,"Error in pcap_findalldevs_ex: %sn", errbuf);
            return -1;
        }
        
        /* Print the list */
        for(d=alldevs; d; d=d->next)
        {
            printf("%d. %sn    ", ++i, d->name);

            if (d->description)
                printf(" (%s)n", d->description);
            else
                printf(" (No description available)n");
        }
        
        if (i==0)
        {
            fprintf(stderr,"No interfaces found! Exiting.n");
            return -1;
        }
        
        printf("Enter the interface number (1-%d):",i);
        scanf_s("%d", &inum);
        
        if (inum < 1 || inum > i)
        {
            printf("nInterface number out of range.n");

            /* Free the device list */
            pcap_freealldevs(alldevs);
            return -1;
        }
        
        /* Jump to the selected adapter */
        for (d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
        
        /* Open the device */
        if ( (fp= pcap_open(d->name,
                            100 /*snaplen*/,
                            PCAP_OPENFLAG_PROMISCUOUS /*flags*/,
                            20 /*read timeout*/,
                            NULL /* remote authentication */,
                            errbuf)
                            ) == NULL)
        {
            fprintf(stderr,"nError opening adaptern");
            return -1;
        }
    }
    else 
    {
        // Do not check for the switch type ('-s')
        if ( (fp= pcap_open(argv[2],
                            100 /*snaplen*/,
                            PCAP_OPENFLAG_PROMISCUOUS /*flags*/,
                            20 /*read timeout*/,
                            NULL /* remote authentication */,
                            errbuf)
                            ) == NULL)
        {
            fprintf(stderr,"nError opening source: %sn", errbuf);
            return -1;
        }
    }

    /* Read the packets */
    while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0)
    {

        if(res == 0)
            /* Timeout elapsed */
            continue;

        /* print pkt timestamp and pkt len */
        printf("%ld:%ld (%ld)n", header->ts.tv_sec, header->ts.tv_usec, header->len);          
        
        /* Print the packet */
        for (i=1; (i < header->caplen + 1 ) ; i++)
        {
            printf("%.2x ", pkt_data[i-1]);
            if ( (i % LINE_LEN) == 0) printf("n");
        }
        
        printf("nn");     
    }

    if(res == -1)
    {
        fprintf(stderr, "Error reading the packets: %sn", pcap_geterr(fp));
        return -1;
    }

    return 0;
}

继续阅读

用telnet来测试你自己写的TCP服务器

有时候我们写一个tcp的服务器程序,需要让客户端发起一个连接,来验证是否能正确的

绑定到端口

接受连接

接受数据

通常我们需要写一个客户端,但是如果你用telnet的话,那就不用为了上面的这个目的而写一个客户端了。

也许你会说,telnet不是用的是23端口吗?除非你的程序绑定到23端口,但是那也不可能啊,因为23已经被telnet的服务器给占用了啊,怎么可能做到?

继续阅读

https客户端的实现

https = http + ssl

ssl = secure socket layer

如果使用c/c++的话,那么libcurl将会是一个非常不错的选择。

官网地址是:

http://curl.haxx.se/libcurl/c/

c和c++的库都有。不过它本山是由c实现,c++的库只是对c的实现做了一个封装而已。

因为它是用c实现的,因此扩平台就很好,所以你可以将它用在任何平台。

继续阅读

利用sftp来上传你的文件

在开始介绍如何使用sftp之前,先简单说明一下sftp和ftps不是一回事情,很多人把这2个协议搞混了,有人还把Filezilla配置ftps来说明怎么利用filezilla如何配置sftp。其实filezilla服务端是不支持sftp协议的,客户端支持。

我们ftp不是一个安全的协议,其发送的内容很都是以明文的方式发送,包括用户名,密码还有文件内容。因此后来又引入了 secure ftp,就是安全的ftp协议,这其中包含了

继续阅读

关于Filezilla是否支持sftp

我们知道filezilla是一个开源的ftp的解决方案,它提供了客户端和服务器端,支持的fpt, sftp, ftps,这是你可以从wiki中看到的关于filezilla的介绍,但是这里需要澄清一点就是对sftp的协议的支持,只有filezilla客户端支持,而服务器并没有支持,因此关于的支持情况如下:

继续阅读

SSL 与 数字证书 的基本概念和工作原理


前言

SSL是让人头大的东西,看起来很复杂,我学过信息安全课,但是对SSL仍然是模糊一片。对于数字证书也是一知半解,从来没有去认真研究过。只知道个大概,“反正就是对称加密和非对称加密”,详细的就不懂了。其实这些跟操作系统,计算机体系结构一样,是基础知识,即使你不是专门研究信息安全的,即使你平时用不到,这些东西也应该是必须了解的~
It’s not rocket science!

继续阅读

vs2005编译Openssl

Openssl是ssl和tls的开源的免费的实现库。那ssl和tls又是什么呢?

ssl=secure socket layer                      安全套接字层

tls=transport layers security               传输层安全

我们的https是怎么来的呢?其实

https = http + ssl

要使用openssl,就要编译它。当然如果你不想自己编译,只想去拿来使用,你也有的选择,给你一个连接,这个连接有人家安装好的库:

http://slproweb.com/products/Win32OpenSSL.html

这个也是openssl官网推荐的下载连接,所以你不用担心它是否有病毒。

其实openssl的工程中包含了怎么编译openssl工程文档,例如关于如何在win32编译,可以参考其中的INSTALL.W32,但是我发现这个文档有个错误,请参看后面的部分。

好了,我们还是自己编译吧。

一 去官网下载openssl工程

官网是

http://www.openssl.org

工程下载地址:

http://www.openssl.org/source/

最新版本:

openssl-1.0.1c.tar.gz 

二  解压

三  安装perl

如果你没有安装perl,从下列网站下载,安装:

http://www.activestate.com/activeperl/downloads

四  启动visual studio 2005 command prompt

visual studio 2005 command prompt在开始菜单 -> 程序 -> visual studio 2005 ->visual studio tools

五 配置

下面的命令全部在visual studio 2005 command prompt中执行。

执行:

>perl configure VC-WIN32

注意这里是大写,不要写成小写。否则会出现警告。

另外有些教程,以及openssl工程中INSTALL.W32中提到可以加上–prefix,也就是

>perl configure VC-WIN32 –prefix=c:/openssl/dir

但是,我发现如果加上这个,后面编译就出现包含文件的错误。

六 生成Makefile

执行:

msdo_ms

除了使用do_ms还可以使用下面这2个命令:

msdo_nasm              这个是说明使用nasm来处理汇编部分

msdo_masm            这个是说明使用masm来处理汇编部分

七 编译

nmake -f msntdll.mak

编译完成之后,可以到out32dll这个文件夹看看,是不是生成一堆的dll和exe文件,在你新解压的openssl文件夹下是没有这个文件的。

测试OpenSSL动态库:nmake -f msntdll.mak test
测试OpenSSL静态库:nmake -f msnt.mak test
安装OpenSSL动态库:nmake -f msntdll.mak install
安装OpenSSL静态库:nmake -f msnt.mak install
清除上次OpenSSL动态库的编译,以便重新编译:nmake -f msntdll.mak clean
清除上次OpenSSL静态库的编译,以便重新编译:nmake -f msnt.mak clean

如何使用呢?

在openssl文件下面有inc32文件夹,这个就是头文件,注意不是include,刚开始我也以为是include文件夹,结果编译时候出错了,结果打开的这些文件,里面只是一些奇怪的字符而已。lib和dll文件是在我们刚才提到的out32dll文件夹中。

接下来,我们使用vs2005创建一个控制台空工程,添加一个main.cpp文件,输入下面内容:

#include <iostream>

extern "C"
{
#include "./include/openssl/bio.h"
#include "./include/openssl/ssl.h"
}

#pragma comment( lib, "./lib/libeay32.lib")
#pragma comment( lib, "./lib/ssleay32.lib")

using namespace std;

int main( int argc, char** argv )
{
    BIO*    pBio;
    pBio = BIO_new_connect("www.google.com:80");
    if(pBio == NULL)
    {
        cout<<"Failed!"<<endl;
        return -1;
    }

    if(BIO_do_connect(pBio) <= 0)
    {
        cout<<"Connection Failed!"<<endl;
    }
    else
    {
        cout<<"Connection Successful!"<<endl;
    }

    return 0;
}

继续阅读

ping和tracert命令详解

ping和tracert命令详解

这个应该大家都会用的吧,最主要的就是检测目标主机是不是可连通。Ping程序实际就是发送一个ICMP回显请求报文给目的主机,并等待回显的ICMP应答。然后打印出回显的报文。Ping不通一个地址,并不一定表示这个IP不存在或者没有连接在网络上,因为对方主机可能做了限制,比如安装了防火墙,因此Ping不通并不表示不能使用FTP或者TELNET连接。
PING得到的结果包括字节数、反应时间、以及生存时间。Ping程序通过在ICMP报文数据中存放发送请求的时间来计算返回时间。当应答返回时,根据现在时间减去报文中存放的发送时间就得到反应时间了。生存时间(TTL),本来就存放在IP数据报的头部,直接就能够获取。
上次和Dancefire说天网防火墙的时候,现在不是天网能识别哪些程序在进行网络连接么,结果试验用Ping的时候,天网就不知道了,呵呵,反正是没有警告。那ICMP木马天网能防么?

继续阅读