⑴ 簡單病毒編寫,和c語言用法,如何侵入他人電腦
http://bbs.pediy.com/upload/file/2004/12/only.txt_479.txt
Billy
Belceb病毒編寫教程---DOS篇(基礎理論)
http://www.hackbase.com/tech/2009-01-08/43041.html
利用C編寫病毒
我從咱們微機課本的Visual
Basic篇學了一點編程
⑵ 如何用C語言寫出防ARP攻擊的程序
你已經是高手了。不用徵求了`不過給你點意見。可以用ARP防火牆單機版。
⑶ c語言調用DOS命令 怎麼做才能使DOS命令在C語言中運行我想調用arp命令如和調用 敬請各位大蝦賜教
#include <stdlib.h>
中的函數system("dos命令");
如:
system("dir *.cpp");
⑷ 利用C語言編寫模擬ARP發送請求數據包和接收數據包
我給你一個技術思路吧。
如果要用C實現模擬ARP發送數據包和接收數據包,可以使用VC6.0開發win32 console application,然後開發一個windows控制台程序,使用API函數開發。
⑸ Windows系統下能否通過原始套接字發送接受Arp數據包,如何操作(最好給個例子)
雖然Windows XP SP2已經不再支持原始TCP數據包的發送,但就其本身作為一項技術而言,掌握原始數據包的發送也是非常重要的。今天我們要討論的原始UDP數據包的構造,便是這項技術的應用。相信懂得了如何管理UDP頭,其他協議的封裝應該就不成問題了。在閱讀本文,你需要具備以下知識:熟悉C語言、Socket基礎知識和TCP/IP基礎知識。如果你已經掌握了上面的知識,那就讓我們行動吧。
數據包格式
在對數據包進行封裝之前,我們有必要了解一下數據報格式,圖1是IP頭格式。我們所學的知識絕大部分都是從資料書籍中來的,但資料畢竟是死的,當我們拿到圖 1所表示的格式時,似乎有點蒙——這個格式是什麼意思啊?怎麼看?我記得我初學的時候就老犯這種糊塗。下面具體說明一下。
javascript:dcs.images.doResizes(this,0,null);" src="/kf/UploadFiles_7205/201009/20100923105017273.jpg">
圖1
在認識該格式之前,我們有必要了解一下什麼是「大尾」,什麼是「小尾」。「大尾」就是高位位元組排放在內存的低端,低位位元組排放在內存的高端。「小尾」反之。 Intel處理器大多數使用小尾位元組序,Motorola處理器大多數使用大尾(Big Endian)位元組序。既然不同的處理器處理的方式不一樣,那麼在網路交流數據的時候便應該使用同一套標准,不然肯定會發生錯誤的。TCP/IP各層協議將位元組序定義為大尾,因此TCP/IP協議中使用的位元組序通常稱之為網路位元組序,因而在填充數據包的時候一定要注意位元組順序,不然會出錯!還有,圖1的數據是從左至右位元組由低向高,這一點注意一下,初學者容易犯錯。
上面是一些需要注意的地方,下面再說一下各個欄位的含義。
1)版本號:標志版本;
2)分組長度(HLEN):報文頭部的字數(字長=32bits);
3)業務類型(Type of Service):分組的處理方式;
4)總長度(Total Length):分組頭部和數據的總長度(位元組數);
5)標識(Identification)、標記(Flags)、片偏移(Frag Offset):對分組進行分片,以便允許網上不同MTU時能進行傳送;
6)生存時間(TTL):規定分組在網上傳送的最長時間(秒),防止分組無休止地要求網路搜尋不存在的目的地址;
7)協議(Protocol):發送分組的上層協議號(TCP= 6,UDP=17);
8)校驗和(Header Checksum):分組頭校驗和;
9)源和目的IP地址(Source and Destination IP Address):標識網路終端設備的IP地址;
10)IP選項(IP Options):網路測試、調試、保密及其他;
11)數據(Data):上層協議數據。
根據上面的說明我們可以定義以下IP頭結構。
typedef struct _IPHeader // 20位元組的IP頭
{
UCHAR iphVerLen; // 版本號和頭長度(各佔4位)
UCHAR ipTOS; // 服務類型
USHORTipLength; // 封包總長度,即整個IP報的長度
USHORTipID; // 封包標識,惟一標識發送的每一個數據報
USHORTipFlags; // 標志
UCHAR ipTTL; // 生存時間,就是TTL
UCHAR ipProtocol // 協議,可能是TCP、UDP、ICMP等
USHORTipChecksum; // 校驗和
ULONG ipSource; // 源IP地址
ULONG ipDestination; // 目的IP地址
} IPHeader, *PIPHeader;
有了IP頭,下面就應該是UDP頭了,如圖2所示。下面說一下各個欄位的含義。
javascript:dcs.images.doResizes(this,0,null); border=0>
圖2
1)源埠(Source Port):呼叫端埠號;
2)目的埠(Destination Port):被叫端埠號;
3)報頭長度(HLEN):報文頭部的位元組數;
4)校驗和(Checksum):報頭和數據欄位的校驗和;
5)數據(Data):上層協議數據。
下面是定義的UDP頭結構。
typedef struct _UDPHeader
{
USHORT sourcePort; // 源埠號
USHORT destinationPort;// 目的埠號
USHORT len; // 封包長度
USHORT checksum; // 校驗和
} UDPHeader, *PUDPHeader;
上面我詳細介紹了IP頭和UDP頭的格式。在我們填充數據包的時候,應該清楚IP頭、UDP頭和傳輸數據的順序應該與如圖3一致。
圖3
編程 實現
下面我們來看看發送原始UDP封包的代碼是如何實現的。首先我們要有一個IP校驗碼,這有前人寫好的專門代碼,我們不必深究,拿來用就行,再此不貼出來,大家看雜志相關即可。下面是主程序的代碼,很簡單,大家慢慢體會,相信會有所收獲的。
int main()
{// 輸入參數信息
char szDestIp[] = "88.88.88.88";
// <<== 填寫目的IP地址
char szSourceIp[] = "127.0.0.1";
// <<== 填寫你自己的IP地址
USHORT nDestPort = 4567; //目的埠
USHORT nSourcePort = 8888;//源埠
char szMsg[] = "大家好,我是Hokkien!/r/n";
int nMsgLen = strlen(szMsg);
// 創建原始套節字
SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
// 有效IP頭包含選項
BOOL bIncl = TRUE;
::setsockopt(sRaw, IPPROTO_IP, IP_HDRINCL, (char *)&bIncl, sizeof(bIncl));
char buff[1024] = { 0 };
// 填充IP頭
IPHeader *pIphdr = (IPHeader *)buff;
pIphdr->iphVerLen = (4<<4 | (sizeof(IPHeader)/sizeof(ULONG)));
//版本與長度
pIphdr->ipLength = ::htons(sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen);
//數據包長度
pIphdr->ipTTL = 128; //生存時間
pIphdr->ipProtocol = IPPROTO_UDP;//UDP
pIphdr->ipSource = ::inet_addr(szSourceIp); //源IP
pIphdr->ipDestination = ::inet_addr(szDestIp); //目的IP
pIphdr->ipChecksum = checksum((USHORT*)pIphdr, sizeof(IPHeader));
//校驗碼,這是必需的!
// 填充UDP頭
UDPHeader *pUdphdr = (UDPHeader *)&buff[sizeof(IPHeader)];
pUdphdr->sourcePort = htons(8888); //源埠
pUdphdr->destinationPort = htons(nDestPort);//目的埠
pUdphdr->len = htons(sizeof(UDPHeader) + nMsgLen);//報頭長度
pUdphdr->checksum = 0; //校驗和,不是必需的
char *pData = &buff[sizeof(IPHeader) + sizeof(UDPHeader)];
memcpy(pData, szMsg, nMsgLen);
//填充校驗和
(pIphdr, pUdphdr, pData, nMsgLen);
// 設置目的地址
SOCKADDR_IN destAddr = { 0 };
destAddr.sin_family = AF_INET;
destAddr.sin_port = htons(nDestPort);
destAddr.sin_addr.S_un.S_addr = ::inet_addr(szDestIp);
// 發送原始UDP封包
int nRet;
for(int i=0; i<5; i++)
{
nRet = ::sendto(sRaw, buff,
sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen, 0, (sockaddr*)&destAddr, sizeof(destAddr));
if(nRet == SOCKET_ERROR)
{
printf(" sendto() failed: %d /n", ::WSAGetLastError());
break;
}
else
{
printf(" sent %d bytes /n", nRet);
}
}
::closesocket(sRaw);
getchar();
return 0;
}
總結
需要注意的是,如果這段代碼在Windows XP SP2以前的操作系統上運行,可以使用假的源IP地址。但遺憾的是,Windows XP SP2中,則必須指定一個有效的IP地址,而且不是回環IP(即127.0.0.1)。Windows現在已經不支持原始TCP的發送了。這些種種限制,使得我們在XP上玩黑玩得很不自在!為了取消這種限制,我們可以開發自己的驅動,但開發驅動畢竟不是簡單之事,我等菜鳥哪來這等本事啊。不過可喜的是,已經有高人為我們開發了一套當今非常流行的網路開發包驅動Winpcap,完全可以取消上面的限制!對於這種方法,我們以後再討論,大家期待一下,呵呵
⑹ 用C語言想編一個程序,在dos的循環輸入arp -d 命令,應該如何編
你的目的是想把arp緩存中的內容全部清空,以達到別人不能對你進行ARP欺騙的,對吧!!
其實沒必要這樣,你可以下載個ARP單機防火牆(華軍,天空都有的下),裝上應該就沒有事了。防止ARP欺騙的有很多,不過這個真的不錯哦!!!
⑺ C語言ARP攻擊源代碼
輸入arp-d
⑻ 我想問怎麼用c語言實現對一個二進制報文的讀取(報文里是乙太網,IP,UDP,DNS,ARP,TCP
這個很簡單啊,你只要根據IP,TCP等等的頭文件去解析報文就可以了。
如果可以,你把報文例子發給我,我給你寫一個。
⑼ C語言寫ARP欺騙
#include <stdafx.h>
#include "iostream"
#include "fstream"
#include "string"
#include "windows.h"
#include "Iphlpapi.h"
#pragma comment(lib , "IpHlpApi.lib")
#pragma comment(lib , "ws2_32.lib")
#define MACFILE "mac.ini" //mac配置文件
#define GATEWAY "gateway.ini"//網關地址文件
using namespace std;
int main(int argc,char * argv[])
{
string ipadd;
string macadd;
char bc;
//讀取網關ip地址
fstream _ipadd;
_ipadd.open(GATEWAY,ios::in);
while(_ipadd.get(bc))
{
ipadd+=bc;
}
cout << "ARP欺騙檢查工具 By:Neeao \n";
cout << "網關IP:" << ipadd << endl;
int iReturn;
DWORD dwIP;
BYTE byMAC[6];
DWORD dwLen;
WSADATA WsaData;
WSAStartup(MAKEWORD(2, 0), &WsaData);
dwIP = inet_addr(ipadd.c_str());
//cout << dwIP <<"\n";
if (dwIP == INADDR_NONE)
{
cout << "IP地址出錯: " << ipadd;
return 1;
}
//循環獲取mac地址
while(TRUE)
{
// 發送ARP查詢包獲得 MAC 地址
dwLen = 6;
iReturn = SendARP(dwIP, 0, (PULONG) &byMAC, &dwLen);
if (iReturn != NO_ERROR)
{
printf("出錯了:只能獲取當前網關下主機的MAC地址.\n", argv[1]);
//__leave;
return 1;
}
char MACadd[50];
sprintf(MACadd,"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",byMAC[0],byMAC[1],byMAC[2],byMAC[3],byMAC[4],byMAC[5]);
//cout << MACadd;
//判斷macadd是否為空,不為空直接跳過
if(macadd=="")
{
fstream _mac;
_mac.open(MACFILE,ios::in);
if(!_mac)
{
//cout<<MACFILE<<"沒有被創建";
//第一次運行寫入mac地址,為初始mac地址。
fstream _macr;
_macr.open(MACFILE,ios::out|ios::app);
if(!_macr)
{
cout<<"文件創建失敗,磁碟不可寫或者文件為只讀!";
exit(1);
}
_macr << MACadd;
_macr.close();
macadd = MACadd;
}
else
{
char ch;
string content;
while(_mac.get(ch))
{
content+=ch;
}
_mac.close();
macadd = content;
cout<< "MAC地址為:" <<content<< endl;
}
}
//判斷mac地址
if(macadd==MACadd)
{
cout << "ok\n";
//return 1;
}else
{
cout << "MAC地址被修改了\n";
//return 1;
}
Sleep(2000);//每2秒鍾獲取一次
}
return 0;
}
⑽ c語言讀取arp的報文txt文件的特定行的特定位元組,急,在線等!
#include<stdio.h>
//#include<string.h>
constintMAXLINES=1000;
constintMAXLEN=200;
//將info[]中的oldch替換為newch
voidreplace(charinfo[],charoldch,charnewch){
inti=0;
while(info[i]){
if(info[i]==oldch)info[i]=newch;
++i;
}
}
intmain(){
intn=0;
charinfo[MAXLINES][MAXLEN],discard[MAXLEN];
FILE*infp;
charfilename[60];
printf("文件名:");
scanf("%s",filename);
if((infp=fopen(filename,"rt"))==NULL){
printf("不能打開數據文件:%s ",filename);
return1;
}
while(fgets(discard,MAXLEN,infp)&&n<MAXLINES){//讀取空行
fgets(discard,MAXLEN,infp);//讀取時間等信息行
fscanf(infp,"%s",discard);//讀取|0
fgets(info[n++],MAXLINES,infp);//讀取有用信息,注意,最後的有效字元可能是' '
}
fclose(infp);
return0;
}