// Dumps the current packet onto the tee stream. // The packet has to be reconstructed according to the rules found in the respective // encoding(..) method. private void DumpPacket(string typeName, object thisObj) { TeeStream tee = TeeStream.Get(); // Container for our dumped packet. MemoryStream dataStream = new MemoryStream(); switch (typeName) { case "bgs.BattleNetPacket": { // Get data. object header = TypeBattleNetPacket.GetMethod("GetHeader").Invoke(thisObj, EMPTY_ARGS); // bnet.protocol.Header object data = TypeBattleNetPacket.GetMethod("GetBody").Invoke(thisObj, EMPTY_ARGS); // byte[] // Get sizes of packet parts. uint headerSize = (uint)TypeBattleNetHeader.GetMethod("GetSerializedSize").Invoke(header, EMPTY_ARGS); // uint int bodySize = ((byte[])data).Length; // Write sizes to buffer. int shiftedHeaderSize = ((int)headerSize >> 8); dataStream.WriteByte((byte)(shiftedHeaderSize & 0xff)); dataStream.WriteByte((byte)(headerSize & 0xff)); // Write header to buffer. TypeBattleNetHeader.GetMethod("Serialize", BindingFlags.Instance | BindingFlags.Public) .Invoke(header, new object[] { dataStream }); // Copy body to buffer. dataStream.Write((byte[])data, 0, bodySize); var packetData = dataStream.ToArray(); // Write data to tee stream. tee.WriteBattlePacket(packetData, true); } break; case "PegasusPacket": { // Get data. object data = TypePegasusPacket.GetMethod("GetBody").Invoke(thisObj, EMPTY_ARGS); // byte[] var typeField = TypePegasusPacket.GetField("Type"); object type = typeField.GetValue(thisObj); // int // Get size of body. int bodySize = ((byte[])data).Length; // Write sizes to buffer. byte[] typeBytes = BitConverter.GetBytes((int)type); // 4 bytes byte[] sizeBytes = BitConverter.GetBytes(bodySize); // 4 bytes dataStream.Write(typeBytes, 0, 4); dataStream.Write(sizeBytes, 0, 4); // Write body to the stream. dataStream.Write((byte[])data, 0, bodySize); var packetData = dataStream.ToArray(); // Write to tee stream. tee.WritePegasusPacket(packetData, true); } break; default: // Returning false here would just introduce undefined behaviour HookRegistry.Panic("Unknown typename!"); break; } }
public AbstractHookDescription() { HookRegistry.loadHookInfo(this); }
public Hook() { HookRegistry.Register(YandereNext.YandereNextManager.StartHook); }