Доброго времени суток, уважаемые зрители. В этой цепочке сообщений я транслирую бой разработкой, Таломир Миротал против Дурова. Поединок программированием ведётся против основного продукта Дурова - чат-клиента Telegram и одноимённых серверов и протоколов. Таломир Миротал взялся уделать зарвавшегося россиянина, с глупой фамилией и полу-образованием в программировании. Итак, поехали...
ОСНОВНЫЕ ИДЕИ JabberX
Итак, вот именно эти идеи, убивают приложения Skype и Telegram и сдувают мыльный пузырь на акциях. Спешите продавать акции уже сегодня, нисходящая тенденция уже началась! До встречи с коричневым медведем....
ФОТКИ ЭСКИЗА JabberX-0.1
ПЕРВЫЙ ДЕНЬ ВТОРОЙ ПОДХОД
Увеличил пропорции основного окна до 1000x600, убрал запуск в полноэкранном режиме - окно в нормальном состоянии выглядит лучше, чем в полноэкранном.
Сделал озвучку добавления сообщений в чат при стоящей галочке Voice, отправитель - английским языком, сообщение - текущей локалью.
Теперь надо делать JSON файл конфигурации с чтением при запуске и записью при выходе и при изменении настроек, также - перенос настроек из конфига в действия программы, в окно настроек и из окна настроек - в конфиг.
@Talomir
@Talomir
@Talomir
@Talomir
@Talomir
ПЕРВЫЙ ДЕНЬ, ТРЕТИЙ ПОДХОД
Добавил пиктограмму-графику искусственного интеллекта и заменил кнопки на кастомные, сделанные в GIMP+Paint. Получилось красивее...
@Talomir
@Talomir
@Talomir Добавил кнопки Picture и Sound, для посылки в чат картинок и музыки (обычные файлы сохраняются в папку Downloads и не показываются в чате, а картинки - показываются, музыка WAV и MP3 - автоматически проигрывается)
@Talomir
@Talomir
@Talomir
ВТОРОЙ ДЕНЬ ПОЕДИНКА: СОСТОЯНИЕ РИНГА
На второй день поединка стало понятно, что победа - за Таломиром Мироталом.
Разработчик Microsoft Skype споткнулся и упал на походе к рингу, вызов скорой и нокаут без участия.
Telegram Дурова получил тройной нокдаун, и, если не отыграется в следующих раундах - проигрывает соревнование. Первый нокдаун провели идеи JabberX, два вторых нокдауна проведены созданием более лучшего интерфейса. Дальше Таломир Миротал, после набора очков, планирует просто плавно довести поединок до конца, добавив полу-готовую сетевую часть сетевого протокола, и - до своей победы.
Болельщики Дурова могли-бы порекомендовать спустить TelegramPlus с отвязкой от телефона и без расшифровки сообщений на сервере, и с более качественным дизайном интерфейса, но фамилия соперника Таломира Миротала всем подсказывает, что противник по рингу не прислушается к выкрикам из зала - у него "связаны" руки постановлениями ФСБ, ФАПСИ, полиции и РосКомНадзор'а. Так что победу следует ожидать за разработчиком JabberX, хоть до окончания спаринга ещё 3-6 недель. Следим за разработкой, брокеры продолжают принимать ставки на рост и падение акций Telegram.
ФИНАЛЬНАЯ ВЕРСИЯ ИНТЕРФЕЙСА JabberX НА СЕГОДНЯ
ТРЕТИЙ ДЕНЬ ПОЕДИНКА: ОПЯТЬ НОКДАУН ДУРОВУ
На третий день разработки я опять нокаутировал соперника, определив 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()); } } } |