不關注《一碳科技》?那麼,你會錯過很多編程教學哦!

教學又來啦

這篇文章是上一篇文章《一篇短文教會你!C語言遠控木馬:被控端製作,附送源碼!》的補充,上一篇文章呢,我們給大家講了C語言遠控木馬的“被控端”製作方法,而這篇文章呢,《一碳科技》會教大家制作C語言遠控木馬的“控制端”,並且這篇文章將上一篇文章的“被控端”代碼進行重新整理,以便大家能夠直觀的看到代碼的實現過程。

製作控制端其實不難,《一碳科技》發佈過的文章《5分鐘學會scoket編程!使用SMTP協議發郵件:附送源碼+教學!》中就曾教大家如何使用socket通過smtp協議發送郵件,對比之下,控制端就相當於“smtp服務器”,被控端相當於給我們發送“郵件”的用戶。

第一步

首先和往常一樣,引用我們需要的頭文件,這裏我們需要4個頭文件:stdio.h、string.h、WinSock2.h、windows.h,除此之外,我們還要加入ws2_32.lib鏈接庫。

在這個程序裏,我們需要三個函數,他們分別要實現:接受客戶端連接、返回客戶端數據、綁定本地端口並開始監聽的功能,小編分別給他們取名爲:accept_client()、recv_updata()、bind_server(),這裏可能有人會有一文:“recv()不是可以接收客戶端數據嗎?爲什麼還要重新構造一個recv_updata()函數呢?”,別急,下面會講到。除此之外,我們還要申請一個存放客戶端返回數據的變量——char word[BUFSIZ]。

第一步源碼

第二步

​我們現在要開始分別構造我們需要的函數了,首先從bind_server()(綁定本地端口並開始監聽的功能)開始,這個函數跟往常一樣:初始化、創建套接字、服務器信息存入、將套接字與本地端口綁定(這點與之前不同)、開始監聽。這裏我們講一下“服務器信息存入”所要用到的兩個函數:inet_addr()、htons()。

inet_addr()的作用是將點分十進制轉換成長整型,什麼是點分十進制?IP地址是由四字節的十進制數表示的,每字節的十進制數表示範圍爲0~255,所以,我們平常看到的IP地址的格式都是:255.255.255.255,而這種格式就叫做點分十進制。那麼爲什麼要將這個點分十進制轉換成長整型,而不是其他數據類型呢?我們來看一下server_addr結構體中的S_addr成員,這個成員的數據類型爲ULONG,而我們的IP地址信息就存放在S_addr成員中,調用inet_addr()函數的原因就是在這裏。

htons()在這裏的作用是,將主機字節序轉換成網絡字節序,一般來說網絡字節序(大部分)都是指大端傳輸,目前,使用小端儲存方式的CPU有Intel x86、ARM,而小編所使用的計算機CPU是intel的,所以這裏要用htonl()函數,把主機字節序的“小端”轉換成網絡字節序的“大端”。

什麼大端、小端?

“大端”、“小端”指的是計算機存放數據的方式。大端指的是:將高位字節儲存在內存的低地址,而小端指的是,將高位字節儲存在內存的高地址,如果看不明白這裏,建議大家去看一下:計算機內存順序、高字節與低字節。

inet_addr()函數與htons()函數,是這裏比較容易“迷糊”的地方,剩下的函數就不多講了,因爲它們在《一碳科技》之前的文章就曾講解過。

到這裏,bind_server()函數就寫好了,接下來給大家講一下recv_updata(),這裏爲什麼要重新寫一個recv()函數呢?因爲recv()函數接收的數據,要經過處理才能使用printf()函數打印出來,否則printf()函數打印出來的數據將不是我們想要的數據,例如它會打印出:“燙燙燙燙燙燙燙燙燙燙燙”。

而我們這裏用strnest()函數對word變量(第一步聲明的變量)進行“加工”,將word數組成員全部用“\0”代替(相當於初始化),然後recv()開始接收客戶端數據,word數組的“\0”就會按順序替換成客戶端數據,而printf()函數讀取到“\0”就會停止打印。

原先申請的word數組並沒有初始化,所以裏面會自動填充0xCCCC↓

運行結果

第三步

第三步是製作accept_client()函數,這一步沒有特別難理解的地方,這裏就不多講了,各位看官根據源代碼進行理解就可以了。

這是程序運行結果

先開啓控制端,然後開啓客戶端,客戶端連接控制端,控制端顯示客戶端IP地址,之後控制端就可以向客戶端發送CMD命令,圖中,小編使用write命令打開了客戶端的寫字板。

查看原文 >>
相關文章