Esempio n. 1
0
    public static byte[] WhatsappEncrypt(byte[] key, byte[] data, bool appendHash)
    {
        if (encryptionOutgoing == null)
        {
            encryptionOutgoing = new RC4(key, 256);
        }
        HMACSHA1 h = new HMACSHA1(key);

        byte[] buff = new byte[data.Length];
        Buffer.BlockCopy(data, 0, buff, 0, data.Length);

        encryptionOutgoing.Cipher(buff);
        byte[] hashByte = h.ComputeHash(buff);
        byte[] response = new byte[4 + buff.Length];
        if (appendHash)
        {
            Buffer.BlockCopy(buff, 0, response, 0, buff.Length);
            Buffer.BlockCopy(hashByte, 0, response, buff.Length, 4);
        }
        else
        {
            Buffer.BlockCopy(hashByte, 0, response, 0, 4);
            Buffer.BlockCopy(buff, 0, response, 4, buff.Length);
        }

        return(response);
    }
Esempio n. 2
0
        private void Send(Packet packet, bool client)
        {
            lock (client ? _clientLock : _serverLock)
            {
                MemoryStream ms = new MemoryStream();
                using (PacketWriter w = new PacketWriter(ms))
                {
                    w.Write(0);
                    w.Write(packet.Id);
                    packet.Write(w);
                }

                byte[] data = ms.ToArray();
                PacketWriter.BlockCopyInt32(data, data.Length);
                if (client)
                {
                    ConsoleUtilities.VerboseWriteLine($"Sent {packet.Type} to the client");
                    _clientSendCipher.Cipher(data);
                    LoggingUtilities.LogPacketToFile(packet, client);
                    if (!_closed)
                    {
                        _clientStream.Write(data, 0, data.Length);
                    }
                }
                else
                {
                    ConsoleUtilities.VerboseWriteLine($"Sent {packet.Type} to the server");
                    _serverSendCipher.Cipher(data);
                    if (!_closed)
                    {
                        _serverStream.Write(data, 0, data.Length);
                    }
                }
            }
        }
        public void SendPacket(OutgoingPacket packet)
        {
            if (!_socket.Connected)
            {
                return;
            }
            MemoryStream ms = new MemoryStream();

            using (PacketOutput output = new PacketOutput(ms))
            {
                output.Write(0);
                output.Write(packet.GetPacketType().ToId());
                packet.Write(output);
            }
            byte[] buffer = ms.ToArray();
            _outgoingEncryption.Cipher(buffer, 5);
            int size = buffer.Length;

            byte[] a = BitConverter.GetBytes(IPAddress.NetworkToHostOrder(size));
            buffer[0] = a[0];
            buffer[1] = a[1];
            buffer[2] = a[2];
            buffer[3] = a[3];
            _socket?.Send(buffer);
        }
Esempio n. 4
0
        private void ReadCallback(IAsyncResult ar)
        {
            CustomBuffer  cb         = (ar.AsyncState as (NetworkStream _ns, CustomBuffer _cb)? ?? (null, null))._cb;
            NetworkStream ns         = (ar.AsyncState as (NetworkStream _ns, CustomBuffer _cb)? ?? (null, null))._ns;
            bool          isClient   = ns == _clientStream;
            RC4           currCipher = isClient ? _clientRecvCipher : _serverRecvCipher;

            if (!ns.CanRead)
            {
                return;
            }

            int read = ns.EndRead(ar);

            cb.Walk(read);

            if (read == 0)
            {
                Dispose();
            }
            else if (cb.Idx == 4)
            {
                cb.ResizeBuffer(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(cb.Buffer, 0)));
                Read(cb.Idx, cb.Remaining, isClient);
            }
            else if (cb.Remaining > 0)
            {
                Read(cb.Idx, cb.Remaining, isClient);
            }
            else
            {
                currCipher.Cipher(cb.Buffer);
                ConsoleUtilities.VerboseWriteLine("Received Data! Size: " + cb.Buffer.Length);

                Packet p = Packet.Construct(cb.Buffer);
                ConsoleUtilities.VerboseWriteLine("Received Data is a " + p.Type + " packet!");

                if (isClient)
                {
                    _proxy.ClientPacketSent(this, p);
                }
                else
                {
                    _proxy.ServerPacketSent(this, p);
                }

                if (p.Send)
                {
                    Send(p, !isClient);
                }

                cb.Clear();
                Read(0, 4, isClient);
            }
        }
Esempio n. 5
0
 public static byte[] WhatsappDecrypt(byte[] key, byte[] data)
 {
     if (encryptionIncoming == null)
     {
         encryptionIncoming = new RC4(key, 256);
     }
     byte[] buff = new byte[data.Length];
     Buffer.BlockCopy(data, 0, buff, 0, data.Length);
     encryptionIncoming.Cipher(buff);
     return(buff);
 }
Esempio n. 6
0
        private void ProcessPacket(byte type, int size)
        {
            byte[] buffer   = new byte[size];
            int    received = 0;

            while (received < size)
            {
                int read = _socket.Receive(buffer, received, size - received, SocketFlags.None);
                if (read == 0)
                {
                    // eof
                    Disconnect();
                    return;
                }
                received += read;
            }
            _incomingEncryption.Cipher(buffer, 0);
            PacketType     packetType = (PacketType)type;
            IncomingPacket packet     = IncomingPacket.Create(packetType);

            if (packet != null && _hooks.ContainsKey(packetType))
            {
                MemoryStream ms = new MemoryStream(buffer);
                using (PacketInput pi = new PacketInput(ms))
                {
                    packet.Read(pi);
                }
                foreach (var hook in _hooks[packetType].ToArray())
                {
                    try
                    {
                        hook(packet);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
            }
        }
Esempio n. 7
0
        private void ProcessPacket(byte type, int size)
        {
            try
            {
                byte[] buffer   = new byte[size];
                int    received = 0;
                while (received < size)
                {
                    int read = _socket.Receive(buffer, received, size - received, SocketFlags.None);
                    if (read == 0)
                    {
                        // eof
                        Disconnect(DisconnectReason.EofBody.SetDetails("Read was 0."));
                        return;
                    }

                    received += read;
                }

                _incomingEncryption.Cipher(buffer, 0);
                PacketType packetType = type.ToPacketType();

                if (packetType == PacketType.UNKNOWN)
                {
                    return;
                }

                IncomingPacket packet = IncomingPacket.Create(packetType);
                if (packet != null)
                {
                    MemoryStream ms = new MemoryStream(buffer);
                    using (PacketInput pi = new PacketInput(ms))
                    {
                        packet.Read(pi);

                        if (DebugPackets)
                        {
                            Log.Info("Received " + packet.GetPacketType());
                        }
                    }

                    foreach (Action <IncomingPacket> action in _anyPacketHook)
                    {
                        action.Invoke(packet);
                    }

                    if (_hooks.ContainsKey(packetType))
                    {
                        foreach (var hook in _hooks[packetType].ToArray())
                        {
                            try
                            {
                                hook(packet);
                            }
                            catch (Exception e)
                            {
                                Log.Info(e);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Disconnect(DisconnectReason.ExceptionOnProcessPacket.SetDetails(e.Message));
            }
        }