如何格式化TCP标头值并推送到字节数组以便在Java中进行数据包测试

时间:2017-01-01 08:05:43

标签: java arrays tcp packets jnetpcap

我试图弄清楚如何将一些手动创建的TCP标头数据推送到字节数组。我将能够使用JnetPcap.send(byte []数据包)并使用wireshark查看它,我现在需要的是将数据包创建为字节数组,以便我可以发送它。我想手动执行此操作,因为我可以使用大量库函数来创建标题。

我根本找不到有关如何格式化值或将它们加载到数组的任何解释。我也不确定我使用的值是否有效。这就是我想要使用的......

angular.module('manoj', ['ui.router','ngMaterial'])
    .config(function ($mdThemingProvider, $locationProvider, $stateProvider, $urlRouterProvider) {
        $mdThemingProvider.disableTheming();
        $locationProvider.hashPrefix('');

        $urlRouterProvider.otherwise('/a/dashboard');
        $stateProvider
            .state('login',{
                url:'/login',
                templateUrl:'app/login/index.html',
                controller: 'loginCtrl'
            })
            .state('a',{
                url:'/a',
                templateUrl:'app/app.html'
            })
            .state('a.dashboard',{
                url: '/dashboard',
                templateUrl: 'app/dashboard/dashboard.html',
                controller:'dashboardCtrl'
            });
    }).run(function ($rootScope, $state, $stateParams){
        $rootScope.$state = $state;
        $rootScope.$stateParams = $stateParams;

    });

(我也使用内置get ethernet的JnetPcap并获取Ipv头函数)

更新: 我发现这个片段看起来像我需要将十六进制值放到字节数组中的实用程序:

public static int sourcePort = 1234; //16 bits
public static int destinationPort = 80; //16 bits
public static int sequenceNum = 0; //32 bits - Can this be arbitrary?
public static int ackNum = 0; //32 bits - sequenceNumber + next data start
public static int dataOffset = 5; //4 bits - Minimum value of 5
public static int reserved = 0; //4 bits - Always 0
public static int controlFlags = 0; //8 bits - Not sure if I need any
public static int windowSize = 0; //16 bits Can this be arbitrary?
public static int checkSum = 0; //16 bits - ?use TCP.calculateChecksum() 
public static int urgent = 0; //16 bits

byte[] packet = new byte[160];
//Now load the values into the byte[]

那么如何将我的价值转换为此处。它是否真的是相互附加的十六进制翻译?

所以我的16位destinationPort = 80;变为0050 ...和32位sequenceNum = 0;变为0000 0000 ... 4位dataOffset = 5;变得5.看起来它可能会起作用,我会尝试一下。

(它们有118个十六进制数字,是否适用于TCP标头?我的值会留下40个十六进制数字,也许它们还有一个有效载荷或IP /以太网标头?)

2 个答案:

答案 0 :(得分:0)

通常的方法是通过import org.bouncycastle.asn1.pkcs.DSAPublicKey; ^ symbol: class DSAPublicKey location: package org.bouncycastle.asn1.pkcs 1 error 包裹的ByteArrayOutputStream

答案 1 :(得分:0)

我发现我可以使用jNetPcap函数加载标题:

Tcp tcp = packet.getHeader(new Tcp());  
tcp.source(sourcePort);  
tcp.destination(destinationPort); 
tcp.seq(sequenceNum);
tcp.ack(ackNum);
tcp.hlen(dataOffset);
tcp.flags(controlFlags);
tcp.window(windowSize);       
tcp.checksum(tcp.calculateChecksum()); 
tcp.urgent(urgent);

这对我有用,但我也可以手动设置字节数组,并将整个数组中的2-3-4标题传递给send函数。