MaimMim Man in the middle minetest interceptor
- prototype - between client and server, allow to capture all exchanges and potentially change them - created to capture server maps in laby - first test get only MapBlock, support version serialization version 28 - prepartion for 29 with zstd but untested.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
package org.artisanlogiciel.games.minetest.net;
|
||||
|
||||
import org.artisanlogiciel.games.minetest.core.PacketException;
|
||||
import org.artisanlogiciel.games.minetest.core.Serialize;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class IncomingSplitBuffer {
|
||||
|
||||
int m_seqnum;
|
||||
int m_chunk_count;
|
||||
int m_chunk_num;
|
||||
|
||||
// number of chunks
|
||||
int m_got = 0;
|
||||
|
||||
NetworkPacket m_list[] = null;
|
||||
BufferedPacket m_reassembled = null;
|
||||
|
||||
BufferedPacket insert(NetworkPacket networkPacket)
|
||||
throws PacketException
|
||||
{
|
||||
|
||||
byte[] buffer = networkPacket.getBuffer();
|
||||
int length = networkPacket.getLength();
|
||||
int offset = networkPacket.getOffset();
|
||||
|
||||
int type = Serialize.readU8(buffer , offset, length);
|
||||
int seqnum = Serialize.readU16(buffer, offset + 1, length);
|
||||
// total number of chunk
|
||||
int chunk_count = Serialize.readU16(buffer, offset + 3, length);
|
||||
// this chunk number
|
||||
int chunk_num = Serialize.readU16(buffer, offset+ 5, length);
|
||||
|
||||
System.out.println("Split length " + length + " type " + type + " seqnum " + seqnum + " chunk_num/chunk_count " + chunk_num + "/" + chunk_count );
|
||||
|
||||
// move to next header
|
||||
networkPacket.addOffset(7);
|
||||
|
||||
if (m_reassembled != null)
|
||||
{
|
||||
return m_reassembled;
|
||||
}
|
||||
|
||||
if (m_list == null )
|
||||
{
|
||||
m_list = new NetworkPacket[chunk_count];
|
||||
}
|
||||
|
||||
if ( chunk_num < chunk_count && (m_list[chunk_num] == null) )
|
||||
{
|
||||
m_list[chunk_num] = networkPacket;
|
||||
m_got ++;
|
||||
}
|
||||
//todo seqnum
|
||||
m_seqnum = seqnum;
|
||||
|
||||
// fully obtained
|
||||
if ( m_got == chunk_count )
|
||||
{
|
||||
reassemble();
|
||||
}
|
||||
|
||||
return m_reassembled;
|
||||
|
||||
}
|
||||
|
||||
private void reassemble()
|
||||
{
|
||||
// keep first header since result is a valid BufferedPacket
|
||||
int fullLength = BufferedPacket.BASE_HEADER_SIZE;
|
||||
for (NetworkPacket networkPacket : m_list )
|
||||
{
|
||||
fullLength += networkPacket.getLength() - networkPacket.getOffset();
|
||||
}
|
||||
byte[] reassembled = new byte[fullLength];
|
||||
NetworkPacket first = m_list[0];
|
||||
System.arraycopy(first.getBuffer(),0,reassembled,0,BufferedPacket.BASE_HEADER_SIZE);
|
||||
int offset = BufferedPacket.BASE_HEADER_SIZE;
|
||||
for (NetworkPacket networkPacket : m_list )
|
||||
{
|
||||
int dataLength = networkPacket.getLength() - networkPacket.getOffset();
|
||||
System.arraycopy(networkPacket.getBuffer(), networkPacket.getOffset(),reassembled,offset,dataLength);
|
||||
offset+=dataLength;
|
||||
}
|
||||
m_reassembled = new BufferedPacket(reassembled);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user