爱博弈的小陈 2019-12-25 17:10
浏览 491

利用Libnet开发包构造DNS响应报文?

1.有没有大佬会用Libnet网络开发包构造DNS响应报文啊??求助
现在在DNS响应报文的负载部分没搞懂,想填充回答部分的时候,用Wireshark抓到的包总显示格式错误。

图片说明
下面是我自己写的构造响应报文的代码:
#include "libnet.h"
#include "./libnet/libnet-functions.h"
#include "/usr/local/include/libnet/libnet-functions.h"
int main(int argc, char *argv[])
{
char payload1[512]="";
int payload_s1=0;
char payload2[512]="";
int payload_s2=0;
char payload[512]="";
int payload_s=0;

// char payload[1024]="";
// int payload_s=0;

char err_buf[100] = "";
libnet_t *lib_net=NULL;//声明一个lib_net句柄

char query[]="www.baidu.com";
char answer[]="172.18.246.34";

libnet_ptag_t dns=0;//协议标记
libnet_ptag_t udp=0;//协议标记
libnet_ptag_t ip=0;//协议标记
libnet_ptag_t ethernet=0;//协议标记

unsigned char src_mac[6] = {0xf8,0xe9,0x03,0xb7,0xee,0x40};
unsigned char dst_mac[6] = {0x4c,0x34,0x88,0xda,0xb3,0x0d};
char *src_ip_str = "192.168.0.1"; //源主机IP地址
char *dst_ip_str = "192.168.0.108"; //目的主机IP地址
unsigned long src_ip,dst_ip = 0;

// payload_s = sprintf(payload, "%s", "this is for the test");

payload_s1 = snprintf(payload1, sizeof payload1, "%c%s%c%c%c%c%c",
                     (char)(strlen(query)&0xff), query, 0x00, 0x00, 0x01, 0x00, 0x01);
payload_s2 = snprintf(payload2, sizeof payload2, "%c%s%c%c%c%c%c%c%c%s", (char)(strlen(query)&0xff), query,
                       0x00, 0x00, 0x01, 0x00, 0x01,0x00,(char)(strlen(answer)&0xff),answer);
strcat(payload,payload1);
strcat(payload,payload2),
payload_s=payload_s1+payload_s2;

// payload_s = snprintf(payload, sizeof payload, "%c%s%c%c%c%c%c",
// (char)(strlen(query)&0xff), query, 0x00, 0x00, 0x01, 0x00, 0x01);

lib_net = libnet_init(LIBNET_LINK_ADV, "eth1", err_buf); //初始化,返回一个libnet的句柄!
if(NULL == lib_net)
{
    perror("libnet_init");
    exit(-1);
}

src_ip = libnet_name2addr4(lib_net,src_ip_str,LIBNET_RESOLVE); //将字符串类型的ip转换为顺序网络字节流
dst_ip = libnet_name2addr4(lib_net,dst_ip_str,LIBNET_RESOLVE);

dns=libnet_build_dnsv4(
        12,
        0xe62e,
        0x8180,
        1,
        1,
        0,
        0,
        payload,
        payload_s,
        lib_net,
        dns
);

udp= libnet_build_udp( //构造udp数据包
        53,
        8080,
        8+12+payload_s,
        0,
        NULL,
        0,
        lib_net,
        udp
);

ip= libnet_build_ipv4( //构造ip数据包
        20+8+12+payload_s,
        0,
        500,
        0,
        10,
        17,
        0,
        src_ip,
        dst_ip,
        NULL,
        0,
        lib_net,
        ip
);

ethernet= libnet_build_ethernet( //构造以太网数据包
        (u_int8_t *)dst_mac,
        (u_int8_t *)src_mac,
        0x800,
        NULL,
        0,
        lib_net,
        ethernet
);

int res = 0;
res = libnet_write(lib_net); //发送数据包
if(res ==-1)
{
    perror("libnet_write");
    exit(-1);
}

libnet_destroy(lib_net); //销毁资源
printf("----ok-----\n");
return 0;

}

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
    • ¥15 数据可视化Python
    • ¥15 要给毕业设计添加扫码登录的功能!!有偿
    • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
    • ¥15 微信公众号自制会员卡没有收款渠道啊
    • ¥15 stable diffusion
    • ¥100 Jenkins自动化部署—悬赏100元
    • ¥15 关于#python#的问题:求帮写python代码
    • ¥20 MATLAB画图图形出现上下震荡的线条
    • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘