Трансляция боя разработкой: JabberX убивает Telegram

Администратор

Доброго времени суток, уважаемые зрители. В этой цепочке сообщений я транслирую бой разработкой, Таломир Миротал против Дурова. Поединок программированием ведётся против основного продукта Дурова - чат-клиента Telegram и одноимённых серверов и протоколов. Таломир Миротал взялся уделать зарвавшегося россиянина, с глупой фамилией и полу-образованием в программировании. Итак, поехали...


ОСНОВНЫЕ ИДЕИ JabberX


  • Совместимость со стандартными jabber серверами, новый протокол строится поверх существующей инфраструктуры и совместим со старыми версиями и клиентами
  • Без привязки к телефону: telegram не регистрирует без указания номера телефона, по которому полиция и ФСБ через базы данных банков и звонков привязывает ваш никнейм и разговоры к настоящему ФИО
  • Без расшифровки трафика на сервере, telegram расшифровывает и пишет все переговоры на сервере по требованиям служб, JabberX поддерживает псевдонимы с публичным ключом, расшифровка сообщений производится секретным ключом получателя а не промежуточным сервером - человеком посредине
  • Без идентификации факта контакта и разговора между лицами: трафик JabberX шифруется 4 раза и каждый раз пропускается по разному сетевому Tor маршруту, неизвестно, что вы вообще с кем-то говорили и соединялись с jabber сервером в такое-то время
  • Без протоколирования трафика провайдером и VPN сервисом - трафик JabberX через Tor шифруется 4 раза и меняет сетевую цепочку при каждом новом соединении
  • Без подделки ключей на стороне сервера и посредине в сети: никнеймы JabberX содержат присоединённый публичный ключ и ключ таким образом передаётся по любому текстовому каналу: сайту, форуму, email, социальной сети, блогу
  • Без молчания: вы можете включить Text-To-Speech галочку в JabberX и все ваши и чужие сообщения будут автоматически озвучиваться синтезатором речи
  • С поддержкой всех языков планеты: JabberX использует кодировку символов Unicode с поддержкой всех языков мира
  • С передачей файлов одной кнопкой и юникоде-смайлами: jabberX будет поддерживать и это
  • Без уродливого дизайна: JabberX пишется программистом с 30-летним опытом и мастером в проектировании интерфейсов приложения для рабочего стола
  • Без серых схем монетизации: JabberX зарабатывает на регистрациях копий программы за $15 и не занимается чёрными и серыми схемами заработка на мессенджере


Итак, вот именно эти идеи, убивают приложения Skype и Telegram и сдувают мыльный пузырь на акциях. Спешите продавать акции уже сегодня, нисходящая тенденция уже началась! До встречи с коричневым медведем....


ФОТКИ ЭСКИЗА JabberX-0.1



11 августа 2022 г., 10:14
У нужного не может быть ненужных последствий.

Администратор

ПЕРВЫЙ ДЕНЬ ВТОРОЙ ПОДХОД


Увеличил пропорции основного окна до 1000x600, убрал запуск в полноэкранном режиме - окно в нормальном состоянии выглядит лучше, чем в полноэкранном.


Сделал озвучку добавления сообщений в чат при стоящей галочке Voice, отправитель - английским языком, сообщение - текущей локалью.


Теперь надо делать JSON файл конфигурации с чтением при запуске и записью при выходе и при изменении настроек, также - перенос настроек из конфига в действия программы, в окно настроек и из окна настроек - в конфиг.



11 августа 2022 г., 14:46
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 14:49
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 15:18
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 15:19
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 15:39
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 15:47
У нужного не может быть ненужных последствий.

Администратор

ПЕРВЫЙ ДЕНЬ, ТРЕТИЙ ПОДХОД


Добавил пиктограмму-графику искусственного интеллекта и заменил кнопки на кастомные, сделанные в GIMP+Paint. Получилось красивее...


11 августа 2022 г., 20:08
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 20:09
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 20:16
У нужного не может быть ненужных последствий.

Администратор

@Talomir Добавил кнопки Picture и Sound, для посылки в чат картинок и музыки (обычные файлы сохраняются в папку Downloads и не показываются в чате, а картинки - показываются, музыка WAV и MP3 - автоматически проигрывается)


11 августа 2022 г., 20:24
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 21:02
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

11 августа 2022 г., 21:51
У нужного не может быть ненужных последствий.

Администратор

@Talomir 

12 августа 2022 г., 7:37
У нужного не может быть ненужных последствий.

Администратор

ВТОРОЙ ДЕНЬ ПОЕДИНКА: СОСТОЯНИЕ РИНГА


На второй день поединка стало понятно, что победа - за Таломиром Мироталом.


Разработчик Microsoft Skype споткнулся и упал на походе к рингу, вызов скорой и нокаут без участия.


Telegram Дурова получил тройной нокдаун, и, если не отыграется в следующих раундах - проигрывает соревнование. Первый нокдаун провели идеи JabberX, два вторых нокдауна проведены созданием более лучшего интерфейса. Дальше Таломир Миротал, после набора очков, планирует просто плавно довести поединок до конца, добавив полу-готовую сетевую часть сетевого протокола, и - до своей победы.


Болельщики Дурова могли-бы порекомендовать спустить TelegramPlus с отвязкой от телефона и без расшифровки сообщений на сервере, и с более качественным дизайном интерфейса, но фамилия соперника Таломира Миротала всем подсказывает, что противник по рингу не прислушается к выкрикам из зала - у него "связаны" руки постановлениями ФСБ, ФАПСИ, полиции и РосКомНадзор'а. Так что победу следует ожидать за разработчиком JabberX, хоть до окончания спаринга ещё 3-6 недель. Следим за разработкой, брокеры продолжают принимать ставки на рост и падение акций Telegram.


ФИНАЛЬНАЯ ВЕРСИЯ ИНТЕРФЕЙСА JabberX НА СЕГОДНЯ



12 августа 2022 г., 12:36
У нужного не может быть ненужных последствий.

Администратор

ТРЕТИЙ ДЕНЬ ПОЕДИНКА: ОПЯТЬ НОКДАУН ДУРОВУ


На третий день разработки я опять нокаутировал соперника, определив json-формат пакета мессенджера и методы преобразования пакета в строку для передачи и строку в пакет при приёме. Такие пакеты JabberX/1.0 могут ездить по любому транспортному протоколу, ориентированному на соединение: TCP, TCP/6, IRC, Jabber, ICQ, Discord и даже поверх стандартного Telegram. То есть транспортный уровень - любой, допускающий передачу последовательности символов, в которых будут передаваться сообщения, файлы, картинки, музыка. Да, внутри текстовых последовательностей, что элементарно делается с форматом и библиотеками JSON. JabberX будет поддерживать передачу по IRC, Jabber и возможно Discord, с шифрованием в коммерческой версии и без шифрования в бесплатной демо-версии, поддержка шифрования с затычкой NoCrypt уже сделана.


Дальше я планирую добавить не симметричное шифрование в класс Packet и потом перейти к классу Protocol. Протокол JabberX будет принимать в конструкторе объект Stream, то есть любой файловый или сетевой поток, будь то сокет TCP или поток протокола уровня приложения одного из мессенджеров.


Ниже я публикую класс Packet и тест TestPacket, чтобы было понятно, о чём идёт речь, вся логика работы универсального мессенджера будет собрана в библиотеке JabberXlibrary.dll, интерфейсная часть и транспортные уровни - отдельно от логики работы протокола с потоком байтов.


Packet.cs


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;


namespace JabberXlibrary
{
    public class Packet
    {
        public enum PacketType
        {
            Reserved = 0,
            TextMessage = 1,
            Picture = 2,
            Music = 3,
            File = 4,
            FilePart = 5
        };


        internal delegate byte[] CryptDelegate(byte[] data, byte[] Key);


        internal CryptDelegate Encrypt;


        internal CryptDelegate Decrypt;


        internal byte[] PublicKey = new byte[] { };


        internal byte[] SecretKey = new byte[] { };


        public string MessageType = "Packet";


        public string ProtocolName = "JabberX/1.0";


        public PacketType TypeOfPacket = PacketType.Reserved;


        public bool Encrypted = false;


        public byte[] From = new byte[] { };


        public byte[] To = new byte[] { };


        public byte[] Text = new byte[] { };


        public byte[] Data = new byte[] { };


        public Packet() { this.Encrypt = NoCrypt; this.Decrypt = NoCrypt; }


        internal Packet(byte[] PublicKey = null, CryptDelegate Encrypt = null)
        {
            if (PublicKey == null || PublicKey.Length < 1 || Encrypt == null)
            {
                Encrypted = false;
                this.Encrypt = NoCrypt;
                this.Decrypt = NoCrypt;
            }
            else
            {
                this.Encrypt = Encrypt;
                this.PublicKey = PublicKey;
            }
        }


        internal Packet(string TextLine, byte[] SecretKey, CryptDelegate Decrypt)
        {
            Packet p = FromString(TextLine);


            if (!p.Encrypted) return;


            p.From = Decrypt(p.From, SecretKey);


            p.To = Decrypt(p.To, SecretKey);


            if (p.Text.Length > 0) p.Text = Decrypt(p.Text, SecretKey);


            if (p.Data.Length > 0) p.Data = Decrypt(p.Data, SecretKey);
        }


        public virtual byte[] NoCrypt(byte[] data, byte[] Key)
        {
            return data;
        }


        public virtual Packet TextMessage(string from, string to, string message)
        {
            try
            {
                byte[] FromBytes = Encoding.Unicode.GetBytes(from);
                byte[] ToBytes = Encoding.Unicode.GetBytes(to);
                byte[] MessageBytes = Encoding.Unicode.GetBytes(message);


                this.TypeOfPacket = PacketType.TextMessage;
                this.Text = Encrypt(MessageBytes, PublicKey);
                this.From = Encrypt(FromBytes, PublicKey);
                this.To = Encrypt(ToBytes, PublicKey);


                return this;


            } catch
            {
                return new Packet();
            }
        }


        public virtual Packet DataMessage(string from, string to, string FileName, byte[] data, PacketType t)
        {
            try
            {
                byte[] FromBytes = Encoding.Unicode.GetBytes(from);
                byte[] ToBytes = Encoding.Unicode.GetBytes(to);
                byte[] TextBytes = Encoding.Unicode.GetBytes(FileName);


                this.TypeOfPacket = PacketType.Music;


                this.Text = Encrypt(TextBytes, PublicKey);
                this.Data = Encrypt(data, PublicKey);
                this.From = Encrypt(FromBytes, PublicKey);
                this.To = Encrypt(ToBytes, PublicKey);


                return this;


            } catch
            {
                return new Packet();
            }
        }


        public virtual Packet PictureMessage(string from, string to, string PictureFileName, byte[] data)
        {
            return DataMessage(from, to, "PICTURE: "+PictureFileName, data, PacketType.Picture);
        }


        public virtual Packet MusicMessage(string from, string to, string MusicFileName, byte[] data)
        {
            return DataMessage(from, to, "MUSIC: " + MusicFileName, data, PacketType.Music);
        }


        public virtual Packet FileMessage(string from, string to, string FileName, byte[] data)
        {
            return DataMessage(from, to, "FILE: " + FileName, data, PacketType.File);
        }


        public virtual Packet FilePartMessage(string from, string to, string FileName, byte[] data, long offset)
        {
            return DataMessage(from, to, "FILE-PART OFFSET " + offset  + " NAME: " + FileName,
                data, PacketType.FilePart);
        }


        public override string ToString()
        {
            try
            {
                string s = JsonConvert.SerializeObject(this, Formatting.Indented);
                return s;


            } catch { return ""; }
        }


        public static Packet FromString(string text)
        {
            try
            {
                Packet p = (Packet)JsonConvert.DeserializeObject(text, typeof(Packet));
                return p;


            } catch { return new Packet(); }
        }


        public string Print()
        {
            try
            {
                string s = "PACKET PRINT:\r\n";
                s += "MessageType=" + MessageType + "\r\n";
                s += "ProtocolName=" + ProtocolName + "\r\n";
                s += "TypeOfPacket=" + TypeOfPacket + "\r\n";
                s += "Encrypted=" + Encrypted + "\r\n";
                s += "From=" + Encoding.Unicode.GetString(From) + "\r\n";
                s += "To=" + Encoding.Unicode.GetString(To) + "\r\n";
                s += "Text=" + Encoding.Unicode.GetString(Text) + "\r\n";
                s += "Data=" + Encoding.Unicode.GetString(Data) + "\r\n";
                return s;
            }
            catch { return ""; }
        }
    }
}


TestPacket.cs


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JabberXlibrary;


namespace TestPacket
{
    class Program
    {
        static void Main(string[] args)
        {
            Packet p1 = new Packet();
            p1.TextMessage("[email protected]", "[email protected]", "No vulnerabilities found!");
            string s1 = "" + p1;
            Console.WriteLine(s1+"\r\n");


            Packet p11 = Packet.FromString(s1);
            Console.WriteLine(p11.Print());


            Packet p2 = new Packet();
            p2.FileMessage("[email protected]", "[email protected]", "C:\\WINDOWS\\System32\\calc.exe", new byte[] { 0,1,2,3 });
            string s2 = "" + p2;
            Console.WriteLine(s2+"\r\n");


            Packet p22 = Packet.FromString(s2);
            Console.WriteLine(p22.Print());


            Packet p3 = new Packet();
            p3.FilePartMessage("[email protected]", "[email protected]", "C:\\WINDOWS\\System32\\calc.exe", new byte[] { 0,1,2,3 }, 0);
            string s3 = "" + p3;
            Console.WriteLine(s3+"\r\n");


            Packet p33 = Packet.FromString(s3);
            Console.WriteLine(p33.Print());


            Packet p4 = new Packet();
            p4.MusicMessage("[email protected]", "[email protected]", "C:\\MUSIC\\Tupak_1.mp3", new byte[] { 0,1,2,3 });
            string s4 = "" + p4;
            Console.WriteLine(s4+"\r\n");


            Packet p44 = Packet.FromString(s4);
            Console.WriteLine(p44.Print());


            Packet p5 = new Packet();
            p5.PictureMessage("[email protected]", "[email protected]", "C:\\CyberFile-2\\DEMOS\\avatar.gif", new byte[] { 0,1,2,3});
            string s5 = "" + p5;
            Console.WriteLine(s5+"\r\n");


            Packet p55 = Packet.FromString(s5);
            Console.WriteLine(p55.Print());
        }
    }
}



13 августа 2022 г., 14:39
У нужного не может быть ненужных последствий.