黑客编程入门 之 网络编程入门

article/2025/9/26 16:56:59

网络编程入门

    • 前言
    • Socket技术详细介绍
    • Socket 编程
      • 所需函数
      • 服务器/客户 代码

前言

  “任何职业都可以成为黑客。你可以是一个木匠黑客。不一定是高科技。只要与技能有关,并且倾心专注于你正在做的事情,你就可能成为黑客。” ——引自《黑客伦理与信息时代精神》
  在这里引入黑客定义就是想提醒自己和大家,真正的黑客精神:Open,Free,Share,热衷共享最新研究。时刻谨记黑客精神,不要成为现在盛行的"Script Kid"(专指只会使用现成软件进行攻击以取得满足感的,危害网络空间安全的人)。希望大家都能够为网络环境贡献自己的一份力量。
  本人是刚开始学习黑客编程的小白,在此做笔记,有误之处,请大牛们指出。
  网络编程入门是踏入黑客神圣殿堂的第一课,掌握好网络编程将会帮助你更好的获得对目标计算机的控制。我个人使用的编程环境是CodeBlocks。这里网络编程省去了 Netapi 编程,因为我个人没有运行起来,而且只能在一个局域网内,所以在真正的网络木马病毒中并不常见,所以在此略去。转而使用 Socket 编程。Socket 编程需要使用的库函数对于不同的编译环境也是不同的。如果编译使用的是MINGW,那么需要用的头文件是 winsock2.h ,静态链接库是 libws2_32.a。如果是在 CodeBlocks 中的话,如下图:
在这里插入图片描述
在这里插入图片描述
以后也是这样子的操作,需要什么静态或者动态链接库就可以手动在这里添加。这里我也顺便说一下DevC++的添加方式。首先要新建工程,本人比较菜,暂时只知道这种方法。如下图:
在这里插入图片描述
在这里插入图片描述
对于VC++的话,课本上给出的方式:

#pragma comment(lib, "Ws2_32")

但是我没成功过,emmm,就转而使用CodeBlocks了。

Socket技术详细介绍

个人建议了解一下原理,推荐这篇博客。

Socket 编程

所需函数

  1. WSAStartup函数
    int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
参数含义
wVersionRequested指明程序请求使用的Socket版本,高位字节指明副版本,低字节指明主版本
lpWSAData指向WSADATA的指针,返回系统Socket的版本信息

在使用 Socket 的程序之前必须调用该函数,初始化 Windows Socket DLL,否则后面的任何函数都将调用失败。调用该函数时,操作系统根据请求的 Socket 版本来搜索相应的库,然后绑定找到的库到该应用程序中,以后应用程序就可以调用所请求的库中的函数了。该函数执行成功则返回0。

  1. WSACleanup函数
    int WSACleanup(void)
    应用程序在完成对请求的 Socket 库的使用后,用此函数来解除与 Socket 库的绑定且释放所占用的系统资源。

  2. socket函数
    SOCKET socket(int af, int type, int protocol)

参数含义
af指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET或AF_INET。两者在Windows下是相同的
type指定套接字的类型,刘套接字类型为SOCK_STREAM,数据报套接字类型为SOCK_DGRAM
protocol应用程序所使用的通信协议,TCP置IPPROTO_TCP

创建成功返回 SOCKET 类型的套接字描述符,失败就返回 INVALID_SOCKET 。
其实还有一个WSASocket函数,不过这里先不做介绍,先留一个小尾巴,等以后会提到。

  1. closesocket函数
    int closecocket(SOCKET s)
      每个进程都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构被引用次数。执行该函数,先检查引用次数,如果为1,则把s从表象中移除,并且释放对应的套接字数据结构;如果大于1,仅清除s在套接字描述符的对应表项,引用次数减1。
      执行成功就返回0,否则返回 SOCKET_ERROR 。

  2. send函数
    int send(SOCKET s, const char FAR *buf, int len, int flags)

参数含义
s指定发送端的套接字描述符
buf指明一个存放应用进程发送数据的缓冲区
len指明实际要发送的数据的字节数
flags一般置0

  注意:该函数只是将缓冲区中的数据复制到套接字发送缓冲区的剩余空间中,而不负责发送,至于数据什么时候发送由下层选用的协议决定。
  发送成功则返回实际复制到发送缓冲区的字节数,如果复制过程或者链接断开都返回SOCKET_ERROR。

  1. sendto函数
    int sendto(SOCKET s, const char * buf, int len, int flags, const struct socketaddr * to,int tolen)
参数含义
s指定发送端的套接字描述符
buf指明一个存放应用进程发送数据的缓冲区
len指明实际要发送的数据的字节数
flags一般置0
to指向目的地址的指针
tolento的长度

用于无连接的UDP协议,因为没有事先建立链接,所以需要指定源地址。

  1. recv函数
    int recv(SOCKET s, char FAR *buf, int len, int flags)
参数含义
s指定接收端的套接字描述符
buf指明一个存放应用进程接收数据的缓冲区
len指明buf的长度
flags一般置0

  与send类似,也是用于面向连接的服务,如果成功则返回实际从接收缓冲区复制的字节数,如果从 socket 的接收队列向 buf 复制的过程中出错则返回SOCKET_ERROR,如果网络连接中断返回0。

  1. recvfrom函数
    int recvfrom(SOCKET s, const char * buf, int len, int flags, const struct socketaddr * from,int fromlen)
参数含义
s指定接收端的套接字描述符
buf指明一个存放应用进程接收数据的缓冲区
len指明buf的长度
flags一般置0
from指向源地址地址的指针
fromlenfrom的长度
  1. bind函数
    int bind(SOCKET s, const struct sockaddr FAR* name, int namelen)
参数含义
s指定待绑定的套接字描述符
name指明带绑定的IP和端口等信息组合而成的结构体
namelen指明name长度
// sockaddr 结构体的定义
struct sockaddr {u_short sa_family;char sa_data[14];
}
// 在实际绑定的时候我们通常使用另一个地址结构,用强制类型转换使类型一致
struct sockaddr_in {short sin_family;	// 指定协议族u_short sin_port;	// 指定端口号,一般用htons()函数进行类型转换struct in_addr sin_addr;	// 该结构体中的 s_addr 指定要绑定的IP地址//通常用inet_addr()函数对IP地址字符串类型进行转换char sin_zero[8];	//
}
  1. listen函数
    int listen(SOCKET s, int backlog)
参数含义
s指定待监听的套接字描述符
backlog监听队列中最多容纳的客户连接数

执行成功返回0,否则返回SOCKET_ERROR

  1. accept函数
    SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)
参数含义
s指定处于监听状态的套接字描述符
addr返回新创建的套接字的地址结构
addr新创建的套接字地址结构的长度

  服务程序调用accept函数从处于监听状态的流套接字s的客户请求队列中取出排在最前的一个客户请求,并创建一个新的套接字来与客户套接字创建连接通道,如果连接成功,就返回新创建的套接字描述符,以后与客户端套接字交换数据的是细腻建的套接字;如果失败就返回INVALID_SOCKET。

  1. connect函数
    int connect(SOCKET s, const struct sockaddr FAR *name, int namelen)
参数含义
s指定客户端套接字描述符
name指定服务器地址
namelenname的长度

如果连接成功,返回0;否则返回SOCKET_ERROR。

  到这里为止可算是基本把所有会用到的函数都列举出来了,其实更常用的还是 TCP ,列出 UDP 使用的函数也是以防有这方面的需要。还有一个需要注意的地方就是主机字节顺序和网络字节顺序。我们使用的计算机大部分都是小端方式,而网络字节顺序都是大端方式,所以这就涉及到在发送数据时字节顺序的转换。比如上面说到的地址结构中的端口,在赋值的时候,我们使用 htons() 函数进行转换就是为了将我们的整型数字转换为大端方式。还有一个我们所需要的函数就是 inet_addr()。是将一个 IP 地址如“127.1.2.3”转换成一个32整数。如例子,转化完的值为0x0302017f。每两位16进制数代表了 IP 地址中的一位。
  现在前置知识都已经有了,就可以开始编程了,当然推荐的博客里面的程序可以,也可以看一下代码,都是相似的。

服务器/客户 代码

服务器端代码:

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>unsigned long GetLocalIP() {char szLocalIP[20] = {0};char szHostName[128+1] = "\0";hostent *phe;if ( gethostname(szHostName, 128) == 0 ) {// Get host addressesphe = gethostbyname(szHostName);for ( int i = 0; phe != NULL && phe->h_addr_list[i] != NULL; i++ ) {sprintf(szLocalIP, "%d.%d.%d.%d", (UINT)((UCHAR*)phe->h_addr_list[i])[0], (UINT)((UCHAR*)phe->h_addr_list[i])[1], (UINT)((UCHAR*)phe->h_addr_list[i])[2], (UINT)((UCHAR*)phe->h_addr_list[i])[3]);}} else	return 0;printf("host name: %s\nIP: %s\n", szHostName, szLocalIP);return inet_addr(szLocalIP);
}int main() {int sockfd, new_fd;struct sockaddr_in my_addr;struct sockaddr_in their_addr;int sin_size;// 初始化 Windows Socket Dll ,必须放在所有 Socket 编程之前 WSADATA ws;WSAStartup( MAKEWORD(2, 2), // 初始化版本为2.2&ws );                  // 返回版本信息 ws 中GetLocalIP();sockfd = socket( AF_INET,   // 建立 socketSOCK_STREAM,            // TCP/IP 协议族0 );                    // 套接字类型,通信协议设为0// 绑定本机的830端口my_addr.sin_family = AF_INET;            // 协议类型是 INETmy_addr.sin_port = htons(830);          // 绑定 830 端口my_addr.sin_addr.s_addr = INADDR_ANY;   // 本机任意 IP INADDR_ANYbind(sockfd,                        // 绑定到 sockfd 上(struct sockaddr*)&my_addr,     // 地址结构指针sizeof(struct sockaddr));       // 地址结构大小listen(sockfd,  // 在 sockfd 上监听5);         // 设定可等待客户队列的大小为5printf("listening......\n");sin_size = sizeof(struct sockaddr_in);new_fd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);char their_addr_str[20];sprintf(their_addr_str, "%d.%d.%d.%d",their_addr.sin_addr.s_addr&0xff,(their_addr.sin_addr.s_addr>>8)&0xff,(their_addr.sin_addr.s_addr>>16)&0xff,(their_addr.sin_addr.s_addr>>24)&0xff);printf("Connected! Client IP: %s:%d\n", their_addr_str, their_addr.sin_port);send(new_fd,"ww0830\n",14,0);printf("send OK!\n");closesocket(sockfd);closesocket(new_fd);return 0;
}

客户端代码:

#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#define MAXDATASIZE 100int main(int argc, char* argv[]) {int sockfd, numbytes;char buff[MAXDATASIZE];struct sockaddr_in their_addr;  // 对方的地址端口信息if ( argc != 2 ) {// 需要有服务端 ip 参数fprintf(stderr, "usage: client hsotname\n");exit(1);}WSADATA ws;WSAStartup(MAKEWORD(2, 2), &ws);    // 初始化 Windows Socket Dllsockfd = socket(AF_INET, SOCK_STREAM, 0);// 连接对方their_addr.sin_family = AF_INET;their_addr.sin_port = htons(830);their_addr.sin_addr.s_addr = inet_addr(argv[1]);// 连接服务器端connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));// 接受数据并打印numbytes = recv(sockfd, buff, MAXDATASIZE, 0);buff[numbytes] = '\0';printf("Received: %s\n", buff);closesocket(sockfd);return 0;
}

http://chatgpt.dhexx.cn/article/vPQ96LtH.shtml

相关文章

WinPcap网络编程入门——1. 获取设备列表

WinPcap网络编程入门——1. 获取设备列表 系列教程章节直达&#xff1a; Winpcap网络编程入门——1. 获取设备列表&#xff1b; 上节中我们简单介绍了 WinPcap 的相关资料&#xff0c;配置好了开发环境&#xff0c;现在就让我们正式开始网络编程开发吧&#xff01; 1. 基本开…

网络编程入门(代码很详细)

网络编程 1.1概述 计算机网络&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算…

网络编程——(1)网络编程入门

一、软件架构 1.1C/S结构&#xff1a; 全称Client/Server结构&#xff0c;是指客户端和服务器结构。常见的程序有QQ、迅雷等。 1.2 B/S结构&#xff1a; 全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势&#xf…

网络编程入门

1.网络编程入门 1.1网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 网…

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义&#xff08;矩阵的行和列互换位置&#xff09; 2. 矩阵转置的性质之一&#xff1a;矩阵转置一次后再转置一次&#xff0c;等于矩阵自身&#xff08;有点像一个两状态开关&#xff0c;在开与关之间来回切换&#xff09; 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示&#xff1a; 则其转置矩阵表示为&#xff1a; 二、对称矩阵 若矩阵 B 与其转置矩阵相等&#xff0c;则称矩阵 B 为对称矩阵&#xff0c;如&#xff1a; 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等&#xff0c;则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 &#xff08;1&#xff09;求最大元素&#xff0c;并指出其在矩阵中的所有出现位置&#xff1b; &#xff08;2&#xff09;求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨&#xff1a;   以前处理的数据通常都是实数矩阵&#xff0c;一直认为MATLAB中的转置可用实现&#xff0c;并没有发现有什么不对。但是&#xff0c;这段时间在做线性调频信号的干扰抑制的仿真&#xff0c;其信号矩阵都是复数矩阵&#xff0c;依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组&#xff0c;需要用到一个由轴编号组成的元组&#xff0c;才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T…

转置矩阵(Transpose of a matrix)

定义 给定一个矩阵 A&#xff0c;将矩阵的行列互换得到的新矩阵称为转置矩阵&#xff0c;记为 &#xff0c;。转置矩阵的行列式不变&#xff0c;即 。转置矩阵由下列动作建立&#xff1a; 将 A 的横行写为 的纵列&#xff1b;将 A 的纵列写成 的横行。 形式来说&#xff0…

数据结构--3.3 矩阵转置

矩阵转置 结构体创建初始化转置打印测试代码运行结果 1.稀疏矩阵的压缩存储&#xff0c;至少需要存储以下信息&#xff1a; 矩阵中各非 0 元素的值&#xff0c;以及所在矩阵中的行标和列标&#xff1b; 矩阵的总行数和总列数&#xff1b; 上图是一个稀疏矩阵&#xff0c;若对…

D2D与其他短距离通信技术

本篇文章主要对D2D和其他短距离通信技术&#xff08;WIFI\NFC\zigbee\蓝牙、超宽带、微站&#xff09;做了比较&#xff0c;从运营商投入、基础设施、应用、最大传输速率、最大传输距离、频率、标准、特征等方面

D2D引擎与GDI\GDI+绘制效果对比

本例主要是对比D2D和GDI在绘制文字、线条的区别&#xff0c;以及D2D与GDI在绘制图片时的区别。 D2D是基于COM组件开发的&#xff0c;使用前的CoInitialize(NULL)是必须的&#xff1b;另外&#xff0c;GDI的初始化GdiplusStartup&#xff08;&#xff09;也别忘了。 废话少说&…

D2D加载图片资源(2)

※先给大家认识下什么是WIC WIC全称是Windows Image Component&#xff0c;是一套扩展的API&#xff0c;用来处理数字图像&#xff0c;它是基于COM组件的。该API包含非常丰富的图像处理函数。 详细可以点击百度文库再看看 http://baike.baidu.com/view/414115.htm?fraladdi…

5G关键技术,D2D通信-ielab

D2D&#xff08;device to device&#xff09;技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分散式网路中&#xff0c;每个用户节点都能发送和接收信号&#xff0c;并具有自动路由(转发消息)的功能。网路的参与者共用它们所拥有的一部分硬…

D2D D3D12 渲染视频帧思路及实现

写在之前 耗时2个月&#xff0c;写完公司的音视频处理系统。对于整个音视频处理有了基本的了解。个人感觉最坑的地方有三&#xff1a; 编解码音视频录制的同步视频预览渲染&#xff08;视频帧的渲染&#xff09; 由于在以后要支持同时多路1080P录制及预览&#xff0c;所以对…

车载通信与导航(五):D2D通信流程

取自https://blog.csdn.net/u012159948/article/details/20059927 D2D技术可以应用于移动蜂窝网络&#xff0c;以提高资源利用率和网络容量。每一个D2D通信链路占用的资源与一个蜂窝通信链路占用的相等。D2D通信将在宏蜂窝基站的控制下获得通信所需的频率资源和传输功率。它与蜂…