Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
JnetPcap
#1
Привет всем. В общем есть вопрос тем кто имеет опыт работы с данной библиотекой. Есть 2 пакеты с одинаковыми seq/ack номерами но первый приходит с неполными tcp данными
1 packet
2й пакет
2 packet
В packetSamurai следующий код отвечает за такое
[src=java]
public void add(TCPPacket p) {
for (final SeqHolder sh : _waitingPrevious.values()) {
final TCPPacket old = sh.getPacket();
if (sh.getPacket().sequence == p.sequence) {
if (old.data.length < p.data.length) {
final int diff = p.data.length - old.data.length;
System.err.printf("DIFF %d = %d - %d \n",diff, p.data.length, old.data.length);
final long seq = (old.sequence + old.data.length)%MODULO;
//System.err.println("ADJUSTED TO SEQ: "+seq+"\nPACKET: "+p);
final byte[] data = new byte[diff];
System.arraycopy(p.data, p.data.length - diff, data, 0, data.length);
System.err.println(Util.hexDump(p.data));
p.data = data;
p.sequence = seq;

System.err.println(Util.hexDump(p.data));
}
else if (old.data.length == p.data.length) {
// packet retransmitted
// dont add, else the data will be duped (acked again)
return;
}
}
}
[/src]
И собственно вопрос как с jnetpcap записать в tcp.getPayload() массив ,который выше назван data.
System.arraycopy(...) не помог
Пробовал так
[src=java]
System.arraycopy(data, 0, packet..getHeader(tcp).getPayload(), packet.getHeader(tcp).getPayloadOffset(), data.length);
[/src]
Ответ
#2
я непонял смысл - таких манипуляций, можно обьяснитЬ?
consulo.io - Consulo - multi-language IDE
Ответ
#3
В packetSamurai делается следующее
В old.data хранится следующий массив (неполный) [85 49 03 3A 3E ]. Приходит 2й пакет с такими же seq/ack номерами, только полный [85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E]. И в результате он записывает в новый пакет следующее [F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E ], тоесть минус 5 байт предыдущих я хз зачем, но это работает и крипт\логика не падает)).
Ну и мне нада записать такой же массив в поле tcp data я не знаю как. Проще говоря код перевести с jpcap на jnetpcap
Ответ
#4
а по дампу - нормальные данные отображаются?(смотря на код)
consulo.io - Consulo - multi-language IDE
Ответ
#5
Не, старая остается
[src=java]
for (final SeqHolder sh : _waitingPrevious.values()) {
final PcapPacket old = sh.getPacket();
if (sh.getPacket().getHeader(tcp).seq() == p.getHeader(tcp).seq()) {
if (old.getHeader(tcp).getPayloadLength() < p.getHeader(tcp).getPayloadLength()) {
final int diff = p.getHeader(tcp).getPayloadLength() - old.getHeader(tcp).getPayloadLength();
System.err.printf("DIFF %d = %d - %d \n",diff, p.getHeader(tcp).getPayloadLength(), old.getHeader(tcp).getPayloadLength());
final long seq = (old.getHeader(tcp).seq() + old.getHeader(tcp).getPayloadLength()) % MODULO;
//System.err.println("ADJUSTED TO SEQ: "+seq+"\nPACKET: "+p);
final byte[] data = new byte[diff];
System.arraycopy(p.getHeader(tcp).getPayload(), p.getHeader(tcp).getPayloadLength() - diff, data, 0, data.length);

System.out.println("old packet");
System.out.println(Util.hexDump(old.getHeader(tcp).getPayload()));
System.out.println("new packet");
System.out.println(Util.hexDump(p.getHeader(tcp).getPayload()));
System.out.println("data array[] for copy");
System.out.println(Util.hexDump(data));
System.arraycopy(data, 0, p.getHeader(tcp).getPayload(), 0, data.length);
System.out.println("after copy");
System.out.println(Util.hexDump(p.getHeader(tcp).getPayload()));
[/src]
out:
old packet
85 49 03 3A 3E

new packet
85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65
53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E

data array[] for copy
F4 36 E5 E5 EA AD FE D0 28 7D 65 53 66 AE F6 5C
FE 82 3E B9 9F BC 8F 41 8F 6D 7E

after copy
85 49 03 3A 3E F4 36 E5 E5 EA AD FE D0 28 7D 65
53 66 AE F6 5C FE 82 3E B9 9F BC 8F 41 8F 6D 7E
Весь гемор из-за одной строчки p.data = data =)

Пока нашел костыльное решение создавать новый JPacket и передавать в конструктор ему строку с нужными байтами, но это ппц неправильно ) хотя работает
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)