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.

# Conflicts:
#	fetch_dependencies.sh
This commit is contained in:
philippe lhardy
2023-07-30 10:18:45 +02:00
parent d789870fbc
commit 9792b79c56
29 changed files with 1144 additions and 12 deletions

View File

@@ -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);
}
}