{"id":490581,"date":"2026-08-11T14:09:24","date_gmt":"2026-08-11T14:09:24","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=490581"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2026-08-11T14:09:24","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=490581","title":{"rendered":"\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f VDD: \u041a\u0430\u043a \u044f \u043d\u0430\u0448\u0435\u043b RCE \u0432 \u0444\u043e\u0440\u043a\u0435 Telegram, \u0430 Google Security \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b \u00ab\u043d\u0438\u0447\u0435\u0433\u043e \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e\u00bb"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>TL;DR \u0412\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 ExteraGram \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0430\u0432\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0430 \u0432\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430, \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u043a\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 (can_not_skip) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0441 \u0435\u0433\u043e UID \u0438 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438). \u0412 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044f \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0411\u044b\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u0435\u0447\u0435\u0440, \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u0447\u0435\u0433\u043e. \u042f \u0441\u0430\u043c \u0441\u0438\u0434\u0435\u043b \u043d\u0430 ExteraGram, \u0438 \u0432\u0434\u0440\u0443\u0433 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e &#8212; \u0430 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e? (\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u0442\u0430\u043c \u0443\u0432\u0438\u0434\u0435\u043b, \u044f \u0435\u0433\u043e \u0441\u043d\u0435\u0441).<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5df\/bd8\/f3e\/5dfbd8f3e5b34714d1ef5c102f6c5e8c.png\" alt=\"\u0427\u0430\u0442 exteraGram Forum, 10 \u0430\u043f\u0440\u0435\u043b\u044f\" title=\"\u0427\u0430\u0442 exteraGram Forum, 10 \u0430\u043f\u0440\u0435\u043b\u044f\" width=\"526\" height=\"413\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5df\/bd8\/f3e\/5dfbd8f3e5b34714d1ef5c102f6c5e8c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5df\/bd8\/f3e\/5dfbd8f3e5b34714d1ef5c102f6c5e8c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/t.me\/exteraForum\/1\/426918\" rel=\"noopener noreferrer nofollow\">\u0427\u0430\u0442 exteraGram Forum, 10 \u0430\u043f\u0440\u0435\u043b\u044f<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 immat0x1 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u044e. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f exteraGram 12.9.0 \u043e\u0442 31 \u0438\u044e\u043b\u044f 2026 \u0433\u043e\u0434\u0430<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043d\u0430\u0442\u0440\u0430\u0432\u043b\u0438\u0432\u0430\u044e JADX \u043d\u0430 \u0441\u0432\u0435\u0436\u0438\u0439 APK, \u0436\u0434\u0443 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438&#8230; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0430\u0434\u0430\u044e \u0432 \u0441\u0442\u0443\u043f\u043e\u0440. \u0410\u0432\u0442\u043e\u0440\u044b \u043e\u0431\u043c\u0430\u0437\u0430\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043f\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0412\u0435\u0441\u044c Java-\u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442 \u0432 \u0436\u0435\u0441\u0442\u043e\u0447\u0430\u0439\u0448\u0438\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440\u00a0<strong>LSParanoid<\/strong>. \u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, Python-\u043c\u043e\u0434\u0443\u043b\u0438 SDK \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 Cython \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043b\u0438\u0431\u044b\u00a0<code>.so<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 OLLVM \u0441 Control Flow Flattening, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u0431\u0438\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0442\u0443\u0434\u0430 \u043b\u0435\u0437\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u044f \u0437\u0430\u0448\u0435\u043b \u0432 \u0438\u0445 \u0447\u0430\u0442 \u0438 \u0443\u0432\u0438\u0434\u0435\u043b \u0437\u0430\u0431\u0430\u0432\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u043e\u0442 \u043b\u0438\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u0430:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ed3\/577\/aab\/ed3577aab5bedd58ae2c1bc35a6ca647.png\" alt=\"\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0447\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430\" title=\"\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0447\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430\" width=\"521\" height=\"162\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ed3\/577\/aab\/ed3577aab5bedd58ae2c1bc35a6ca647.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ed3\/577\/aab\/ed3577aab5bedd58ae2c1bc35a6ca647.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0447\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0443\u0442 \u0432\u0441\u0451 \u0432\u0441\u0442\u0430\u043b\u043e \u043d\u0430 \u0441\u0432\u043e\u0438 \u043c\u0435\u0441\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0448\u044c \u044d\u0442\u043e \u0432 \u0436\u0435\u0441\u0442\u043e\u0447\u0430\u0439\u0448\u0438\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440, \u0440\u0435\u0448\u0438\u0432, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043f\u0430\u0441\u0451\u0442 \u043e\u0442 \u0432\u0437\u043b\u043e\u043c\u0430 &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c.<\/p>\n<p>\u041d\u0430\u0439\u0434\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u044d\u043a\u0434\u043e\u0440 \u0438 RCE (Remote Code Execution) \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0431\u043e\u0440\u043a\u0435, \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0440\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 Google Android Security Team. \u0418 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438?<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25a\/2a6\/921\/25a2a69214d5997beea9237f923670a6.png\" alt=\"\u041e\u0442\u0432\u0435\u0442 The Play and Android Security Team\" title=\"\u041e\u0442\u0432\u0435\u0442 The Play and Android Security Team\" width=\"797\" height=\"181\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/25a\/2a6\/921\/25a2a69214d5997beea9237f923670a6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25a\/2a6\/921\/25a2a69214d5997beea9237f923670a6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0442\u0432\u0435\u0442 The Play and Android Security Team<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 Google, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0438\u0437 Telegram-\u043f\u043e\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a JVM \u0431\u0435\u0437 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u043b\u0432\u0430\u0440\u044c. \u0427\u0442\u043e \u0436, \u0440\u0430\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0434\u0430\u043b\u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0441\u0432\u0435\u0442 \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p><strong>\u0427\u0442\u043e \u043e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0438 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u043e\u0434\u0435<\/strong><br \/>\u0412\u0441\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u043d\u0438\u0436\u0435 \u2014 \u044d\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 JADX \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c APK \u0432\u0435\u0440\u0441\u0438\u0438 12.9.0 (\u0441\u0431\u043e\u0440\u043a\u0430 20260731). \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0432\u0441\u0451 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043f\u0440\u044f\u043c\u043e \u0441 \u0442\u043e\u043d\u043d\u043e\u0439 \u0448\u0438\u0444\u0440\u0430\u0442\u043e\u0440\u0430 LSParanoid.<\/p>\n<p>\u0412 \u0447\u0430\u0442\u0430\u0445 \u0430\u0432\u0442\u043e\u0440\u044b \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0438\u0445 \u043a\u0440\u0443\u0442\u044b\u0435 \u0437\u0430\u0449\u0438\u0442\u044b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a bleizix \u043f\u0438\u0441\u0430\u043b \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f39\/a33\/3bd\/f39a333bde1906e3f21c5126f79087fe.png\" alt=\"\u0447\u0430\u0442 exteraGram Forum, 8 \u043c\u0430\u044f\" title=\"\u0447\u0430\u0442 exteraGram Forum, 8 \u043c\u0430\u044f\" width=\"513\" height=\"122\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f39\/a33\/3bd\/f39a333bde1906e3f21c5126f79087fe.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f39\/a33\/3bd\/f39a333bde1906e3f21c5126f79087fe.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/t.me\/exteraForum\/69759\/457514\" rel=\"noopener noreferrer nofollow\">\u0447\u0430\u0442 exteraGram Forum, 8 \u043c\u0430\u044f<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u043e\u043d\u0438 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u0443, \u043a\u0430\u043a \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 DRM:<\/p>\n<p>\u0421\u043b\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 (Cython + OLLVM): Python-\u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043e\u043d\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 .so, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 OLLVM (Control Flow Flattening). \u041f\u0430\u0440\u0430\u043d\u043e\u0439\u044f \u0432 Java (LSParanoid): \u0412\u0441\u044f Java-\u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u043d\u0430\u0433\u043b\u0443\u0445\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0430. \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0441\u043c\u0435\u0448\u043d\u043e\u0435 \u2014 \u043e\u043d\u0438 \u0442\u0430\u043a \u0443\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0435\u0439, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c strip \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p>\u041e\u043d\u0438 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438 Control Flow Flattening \u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0435\u0449\u044c \u2014 strip. \u042d\u0442\u043e \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u0432\u0435\u0440\u044c \u0441\u0435\u0439\u0444\u043e\u0432\u044b\u0439 \u0437\u0430\u043c\u043e\u043a \u0442\u043e\u043b\u0449\u0438\u043d\u043e\u0439 \u0432 \u043c\u0435\u0442\u0440, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u043f\u043e\u0434 \u043a\u043e\u0432\u0440\u0438\u043a\u043e\u043c \u0441 \u043d\u0430\u0434\u043f\u0438\u0441\u044c\u044e \u2018Welcome\u2019. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 strip \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432. \u0415\u0451 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e OLLVM-\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u0431\u043b\u044e\u0434\u0435\u0447\u043a\u0435.<\/p>\n<p>\u0412\u0441\u044f \u0438\u0445 \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u044f \u043d\u0430 \u044d\u043b\u0438\u0442\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u00ab\u0437\u0430\u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443\u00bb \u0441\u044b\u043f\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 metadata_parser.so (\u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0431\u044b\u0442\u044c \u0441\u0443\u043f\u0435\u0440-\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u043c. \u0417\u0430\u0431\u044b\u0442\u044b\u0439 strip \u0432\u044b\u0434\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441 \u043f\u043e\u0442\u0440\u043e\u0445\u0430\u043c\u0438:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3c0\/893\/868\/3c0893868c2ca2d39c3010ca7d80b96e.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\" title=\"\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\" width=\"1478\" height=\"180\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3c0\/893\/868\/3c0893868c2ca2d39c3010ca7d80b96e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3c0\/893\/868\/3c0893868c2ca2d39c3010ca7d80b96e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Cython, \u0442\u0430\u043a \u0435\u0449\u0435 \u0438 \u043f\u0430\u043b\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043a OLLVM \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430 (luluovo1\/ollvm-ndk30), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438. \u0418 \u0442\u0430\u043c \u0436\u0435 \u0440\u044f\u0434\u043e\u043c \u0442\u043e\u0440\u0447\u0430\u0442 \u043f\u0443\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0445 SDK:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25e\/c86\/163\/25ec8616318f4c33676a5650d5f04b39.png\" alt=\"\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\" title=\"\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\" width=\"1556\" height=\"89\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/25e\/c86\/163\/25ec8616318f4c33676a5650d5f04b39.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25e\/c86\/163\/25ec8616318f4c33676a5650d5f04b39.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0442\u0447\u043d\u043e\u0443\u0442\u0435 12.9.0 \u043e\u043d\u0438 \u0441 \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u044f\u0432\u043b\u044f\u043b\u0438:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a3\/2a2\/31e\/1a32a231e0a16a39362aa96d2c92eb50.png\" alt=\"\u0447\u0430\u0442 exteraGram Forum, 31 \u0438\u044e\u043b\u044f\" title=\"\u0447\u0430\u0442 exteraGram Forum, 31 \u0438\u044e\u043b\u044f\" width=\"415\" height=\"65\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1a3\/2a2\/31e\/1a32a231e0a16a39362aa96d2c92eb50.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a3\/2a2\/31e\/1a32a231e0a16a39362aa96d2c92eb50.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/t.me\/exteraForum\/19\/554593\" rel=\"noopener noreferrer nofollow\">\u0447\u0430\u0442 exteraGram Forum, 31 \u0438\u044e\u043b\u044f<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u042f \u043f\u043e\u043b\u0435\u0437 \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0432 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0434\u0438\u043d if (safeMode) return;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0430\u0432 \u0447\u0435\u0440\u0435\u0437 SecurityManager. \u041b\u0438\u0431\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043b\u0438\u0431\u043e \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p><strong>\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043e\u0434\u0430 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Telegram <\/strong><br \/>\u0410\u0432\u0442\u043e\u0440\u044b \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 LSParanoid \u0441\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u043e\u0439 \u0431\u0440\u043e\u043d\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0443\u044e \u0431\u0430\u0437\u0443: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442.<\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044f PythonPluginsEngine.java, \u043c\u044b \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u0441\u0451 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2db\/800\/d6a\/2db800d6afad9e82a983107975d50e55.png\" alt=\"PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"1716\" height=\"881\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2db\/800\/d6a\/2db800d6afad9e82a983107975d50e55.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2db\/800\/d6a\/2db800d6afad9e82a983107975d50e55.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>LSParanoid \u043f\u0440\u044f\u0447\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0438\u0445 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u0430\u00a0<code>getString(long seed)<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u044b\u00a0<code>DeobfuscatorHelper<\/code>\u00a0\u0438\u00a0<code>RandomHelper<\/code>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u0438\u043d\u043d\u044b\u0439\u00a0<code>seed<\/code>\u00a0\u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043a\u0441\u0435\u0440 \u0432 \u0441\u0442\u0438\u043b\u0435 SplitMix64 (XOR \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043c\u0438 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435\u00a0<code>7109453100751455733L<\/code>). \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0442\u0435\u0439\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u0440\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 64-\u0431\u0438\u0442\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438, \u0430 \u043d\u0430 16-\u0431\u0438\u0442\u043d\u044b\u0435\u00a0<code>short<\/code>-\u0431\u043b\u043e\u043a\u0438. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0433\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432: \u0431\u043b\u043e\u043a\u0438 \u043a\u0441\u043e\u0440\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 (<code>^<\/code>), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u043b\u0435\u0432\u043e \u0438 \u0432\u043f\u0440\u0430\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439\u00a0<code>rotl<\/code>\u00a0\u043d\u0430 \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f (9, 10, 13).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0445\u0430\u043e\u0441\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043d\u043e\u0432\u0430 XOR-\u0438\u0442\u0441\u044f. \u041d\u043e \u0441 \u0447\u0435\u043c? \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a (<code>chunks<\/code>), \u0431\u0435\u0440\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u00a0<code>8191<\/code>) \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 XOR. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>deobf.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import osimport reimport structdef to_int(val: int) -&gt; int:    val &amp;= 0xFFFFFFFF    return val - 0x100000000 if val &gt;= 0x80000000 else valdef to_short(val: int) -&gt; int:    val &amp;= 0xFFFF    return val - 0x10000 if val &gt;= 0x8000 else valdef rotl_short(val: int, shift: int) -&gt; int:    val_int = to_int(to_short(val))    unsigned = val_int &amp; 0xFFFFFFFF    return to_short((unsigned &gt;&gt; (32 - shift)) | (val_int &lt;&lt; shift))def calc_seed(val: int) -&gt; int:    val &amp;= 0xFFFFFFFFFFFFFFFF    j2 = ((val ^ (val &gt;&gt; 33)) * 7109453100751455733) &amp; 0xFFFFFFFFFFFFFFFF    mult = ((j2 ^ (j2 &gt;&gt; 28)) * -3808689974395783757) &amp; 0xFFFFFFFFFFFFFFFF    return mult &gt;&gt; 32def next_state(state: int) -&gt; int:    state &amp;= 0xFFFFFFFFFFFFFFFF    s1 = to_short(state &amp; 0xFFFF)    s2 = to_short((state &gt;&gt; 16) &amp; 0xFFFF)    s_sum = to_short(to_int(s1) + to_int(s2))    s_rotl = to_short(to_int(rotl_short(s_sum, 9)) + to_int(s1))    s_xor = to_short(to_int(s2) ^ to_int(s1))    a_b = (rotl_short(s_xor, 10) &amp; 0xFFFFFFFFFFFFFFFF) | ((s_rotl &amp; 0xFFFFFFFFFFFFFFFF) &lt;&lt; 16)    d_val = (a_b &lt;&lt; 16) &amp; 0xFFFFFFFFFFFFFFFF    e_val = to_short(to_int(rotl_short(s1, 13)) ^ to_int(s_xor))    g_val = to_short(to_int(e_val) ^ (to_int(s_xor) &lt;&lt; 5))    return d_val | (g_val &amp; 0xFFFFFFFFFFFFFFFF)def read_char(idx: int, chunks: list[list[int]], state: int) -&gt; tuple[int, int]:    chunk = chunks[idx \/\/ 8191][idx % 8191]    nxt = next_state(state)    res = ((chunk &lt;&lt; 32) &amp; 0xFFFFFFFF00000000) ^ nxt    return res, nxtdef decrypt_string(string_id: int, chunks: list[list[int]]) -&gt; str:    raw_id = string_id &amp; 0xFFFFFFFFFFFFFFFF    nxt1 = next_state(calc_seed(raw_id &amp; 0xFFFFFFFF))    nxt2 = next_state(nxt1)    part1 = (raw_id &gt;&gt; 32) ^ ((nxt1 &gt;&gt; 32) &amp; 0xFFFF)    part2 = (nxt2 &gt;&gt; 16) &amp; 0xFFFF0000    start_idx = to_int(part1 ^ part2)    header, current_state = read_char(start_idx, chunks, nxt2)    length = (header &gt;&gt; 32) &amp; 0xFFFF    chars = []    for offset in range(length):        ch_data, current_state = read_char(start_idx + offset + 1, chunks, current_state)        chars.append((ch_data &gt;&gt; 32) &amp; 0xFFFF)    return struct.pack(f'&lt;{len(chars)}H', *chars).decode('utf-16-le')def parse_java_chars(raw: str) -&gt; list[int]:    cleaned = re.sub(r'\\\\u([0-9a-fA-F]{4})', lambda m: chr(int(m.group(1), 16)), raw)    escapes = {'\\\\n': '\\n', '\\\\r': '\\r', '\\\\t': '\\t', '\\\\\"': '\"', '\\\\\\\\': '\\\\', \"\\\\'\": \"'\", '\\\\b': '\\b', '\\\\f': '\\f'}    for src, dst in escapes.items():        cleaned = cleaned.replace(src, dst)    chars = []    for ch in cleaned:        cp = ord(ch)        if cp &lt;= 0xFFFF:            chars.append(cp)        else:            cp -= 0x10000            chars.append(0xD800 + (cp &gt;&gt; 10))            chars.append(0xDC00 + (cp &amp; 0x3FF))    return charsdef escape_string(text: str) -&gt; str:    table = {'\\\\': '\\\\\\\\', '\"': '\\\\\"', '\\n': '\\\\n', '\\r': '\\\\r', '\\t': '\\\\t'}    res = []    for ch in text:        if ch in table:            res.append(table[ch])        elif ord(ch) &lt; 32 or ord(ch) == 127:            res.append(f'\\\\u{ord(ch):04x}')        else:            res.append(ch)    return \"\".join(res)def load_chunks(target_dir: str) -&gt; dict[str, list[list[int]]]:    chunks_db = {}    array_re = re.compile(r'String\\[\\]\\s+\\w+\\s*=\\s*(?:new\\s+String\\[\\]\\s*)?\\{([^}]+)\\}')    str_re = re.compile(r'\"((?:[^\"\\\\]|\\\\.)*)\"')    for root, _, files in os.walk(target_dir):        for file in files:            if not file.endswith(\".java\") or \"Helper\" in file:                continue            path = os.path.join(root, file)            try:                with open(path, encoding=\"utf-8\", errors=\"ignore\") as f:                    content = f.read()            except OSError:                continue            for match in array_re.finditer(content):                raw_strings = str_re.findall(match.group(1))                if any(len(s) &gt; 1000 for s in raw_strings):                    cls_name = file[:-5]                    chunks_db[cls_name] = [parse_java_chars(s) for s in raw_strings]                        return chunks_dbdef deobfuscate_dir(target_dir: str = \"sources\"):    chunks_db = load_chunks(target_dir)    if not chunks_db:        return    call_re = re.compile(r'([A-Za-z0-9_$.]+)?getString\\s*\\(\\s*(?:\\(\\s*long\\s*\\)\\s*)?(-?\\s*\\d+)L?\\s*\\)')    ternary_re = re.compile(r'([A-Za-z0-9_$.]+)?getString\\s*\\(\\s*([^?]+?)\\s*\\?\\s*(-?\\s*\\d+)L?\\s*:\\s*(-?\\s*\\d+)L?\\s*\\)')    for root, _, files in os.walk(target_dir):        for file in files:            if not file.endswith(\".java\") or \"Deobfuscator\" in file:                continue            path = os.path.join(root, file)            try:                with open(path, encoding=\"utf-8\", errors=\"ignore\") as f:                    content = f.read()            except OSError:                continue            if \"getString(\" not in content:                continue            keys_to_try = [k for k in chunks_db if k in content] + [k for k in chunks_db if k not in content]                        def replace_call(m: re.Match) -&gt; str:                full_match, raw_id = m.group(0), m.group(2)                try:                    str_id = int(raw_id.replace(\" \", \"\"))                    if \"Deobfuscator\" not in full_match and abs(str_id) &lt;= 0xFFFFFFFF:                        return full_match                    for key in keys_to_try:                        try:                            decrypted = decrypt_string(str_id, chunks_db[key])                            return f'\"{escape_string(decrypted)}\"'                        except Exception:                            continue                    return full_match                except ValueError:                    return full_match                                def replace_ternary(m: re.Match) -&gt; str:                full_match = m.group(0)                condition = m.group(2).strip()                try:                    id1 = int(m.group(3).replace(\" \", \"\"))                    id2 = int(m.group(4).replace(\" \", \"\"))                    dec1, dec2 = None, None                    for key in keys_to_try:                        if dec1 is None:                            try: dec1 = decrypt_string(id1, chunks_db[key])                            except Exception: pass                        if dec2 is None:                            try: dec2 = decrypt_string(id2, chunks_db[key])                            except Exception: pass                        if dec1 is not None and dec2 is not None:                            break                    if dec1 is not None and dec2 is not None:                        return f'{condition} ? \"{escape_string(dec1)}\" : \"{escape_string(dec2)}\"'                    return full_match                except ValueError:                    return full_match            new_content = call_re.sub(replace_call, content)            new_content = ternary_re.sub(replace_ternary, new_content)            if new_content != content:                with open(path, \"w\", encoding=\"utf-8\") as f:                    f.write(new_content)if __name__ == \"__main__\":    deobfuscate_dir()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u0438\u0437\u00a0<code>RandomHelper<\/code>, \u043c\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u044e \u044d\u0442\u0443 \u00ab\u043d\u0435\u043f\u0440\u043e\u0431\u0438\u0432\u0430\u0435\u043c\u0443\u044e\u00bb \u0431\u0440\u043e\u043d\u044e. \u0418 \u0432\u043e\u0442 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f4\/b9a\/aaa\/0f4b9aaaaadc857a2f6ca1aa2bd951f4.png\" alt=\"PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"1591\" height=\"875\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0f4\/b9a\/aaa\/0f4b9aaaaadc857a2f6ca1aa2bd951f4.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0f4\/b9a\/aaa\/0f4b9aaaaadc857a2f6ca1aa2bd951f4.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0418\u0418, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u00ab\u043d\u0435 \u0434\u0443\u043c\u0430\u0435\u0442\u00bb<\/strong><br \/>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0445\u0432\u0430\u043b\u0435\u043d\u044b\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 AI. \u0412 \u043a\u043e\u0434\u0435 com\/exteragram\/messenger\/ai\/network\/Client.java \u043e\u043d\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043b\u044f \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u0438\u044f \u0442\u0435\u0433\u043e\u0432 \u2026 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439!<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c API-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u0432\u0440\u043e\u0434\u0435 DeepSeek \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043f\u043e-\u0436\u0438\u0432\u043e\u043c\u0443 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/538\/787\/6b5\/5387876b518ee0ae2a4df2902508e42c.png\" alt=\"Client.java, 467-488 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"Client.java, 467-488 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"735\" height=\"431\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/538\/787\/6b5\/5387876b518ee0ae2a4df2902508e42c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/538\/787\/6b5\/5387876b518ee0ae2a4df2902508e42c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>Client.java, 467-488 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u0443: \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u044b\u0436\u0438\u0442\u0441\u044f, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0442\u0440\u0430\u0442\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0410 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0438\u0434\u0438\u0442 while (true) \u0441 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 +7 \u0438 +8 \u0438 \u043d\u0435\u0438\u0441\u0442\u043e\u0432\u043e \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u043c\u044b\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0436\u0430\u0432\u044b\u043c \u043b\u043e\u0431\u0437\u0438\u043a\u043e\u043c. \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442, \u043c\u043e\u0436\u0435\u0442, \u0438 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0442\u044c, \u043d\u043e \u043f\u0430\u0446\u0430\u043d\u0430\u043c \u0438\u0437 ExteraGram \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2014 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443, \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u043c\u0438\u0439. \u0418\u043b\u043b\u044e\u0437\u0438\u044f \u0432\u0441\u0435\u0437\u043d\u0430\u043d\u0438\u044f \u0441\u043f\u0430\u0441\u0435\u043d\u0430 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043c \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a!<\/p>\n<p><strong>\u0418\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u0442\u044c \u043a\u043e\u0434 \u0432 Telegram? \u041b\u0435\u0433\u043a\u043e!<\/strong><\/p>\n<p>\u042f \u0441\u0442\u0430\u043b \u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a Updater. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043e\u0431\u043d\u043e\u0432\u044b \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0442 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043f\u043e\u0441\u0442\u043e\u0432 \u0432 Telegram-\u043a\u0430\u043d\u0430\u043b\u0435:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7e\/83e\/701\/a7e83e701939f398b5a63fbd363fc9e2.png\" alt=\"UpdaterUtils.java, 109-135 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"UpdaterUtils.java, 109-135 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"691\" height=\"522\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a7e\/83e\/701\/a7e83e701939f398b5a63fbd363fc9e2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a7e\/83e\/701\/a7e83e701939f398b5a63fbd363fc9e2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UpdaterUtils.java, 109-135 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0413\u0434\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0430\u0442\u0430\u043a\u0438? \u0412\u0441\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u043f\u043e\u0441\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0442\u0435\u0447\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u0430 \u0431\u043e\u0442\u0430, \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u044b, \u0438\u043b\u0438 \u0443\u0433\u043e\u043d \u0441\u0435\u0441\u0441\u0438\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043a\u0430\u043d\u0430\u043b\u0430), \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u043c SDK.<\/p>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0446\u0438\u0444\u0440\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u0438 \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 ID \u0447\u0430\u0442\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (chat_id) \u043d\u0430 \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u0448\u0438\u0442\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b. \u041e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u0442 \u043f\u043e\u0441\u0442 \u0438 \u0441\u043b\u0435\u043f\u043e \u0436\u0440\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u043e \u2014 \u0438 \u044d\u0442\u043e\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0443\u043b\u0435\u0442\u0438\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b \u0441\u043e\u0442\u0435\u043d \u0442\u044b\u0441\u044f\u0447 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0451. \u0421\u0430\u043c\u043e\u0435 \u0441\u043c\u0435\u0448\u043d\u043e\u0435 \u0432 UpdaterUtils.java &#8212; \u044d\u0442\u043e \u0442\u043e, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0430\u043c \u0434\u0438\u0430\u043b\u043e\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u044d\u043a\u0434\u043e\u0440\u0430. \u041f\u043e\u043a\u0430 \u0432\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 APK, \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0441\u0442\u0438\u043a\u0435\u0440 \u0443\u0442\u043a\u0438:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c07\/43d\/7ca\/c0743d7cae9012501712b4e435a5f47e.png\" alt=\"UpdaterUtils.java, 221-225 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"UpdaterUtils.java, 221-225 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"1011\" height=\"87\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c07\/43d\/7ca\/c0743d7cae9012501712b4e435a5f47e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c07\/43d\/7ca\/c0743d7cae9012501712b4e435a5f47e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>UpdaterUtils.java, 221-225 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0430\u0441 \u0445\u0430\u043a\u0430\u044e\u0442, \u0430 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0442\u0430\u043d\u0446\u0443\u0435\u0442 \u0443\u0442\u0435\u043d\u043e\u043a. \u0413\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p><strong>\u0411\u044d\u043a\u0434\u043e\u0440 \u201c\u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445\u201d<\/strong><br \/>\u0412 \u0444\u0430\u0439\u043b\u0435 BadgesController.java (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0430\u0435\u0442 \u0431\u0435\u0439\u0434\u0436\u0438\u043a\u0438 Trusted, Developer, Supporter) \u044f \u043d\u0430\u0448\u0435\u043b \u0442\u0443\u043f\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0439 ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d11\/7d2\/2ac\/d117d22acf3ddc8fdb76597dc2713952.png\" alt=\"BadgesController.java, 90-99 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"BadgesController.java, 90-99 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"967\" height=\"203\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d11\/7d2\/2ac\/d117d22acf3ddc8fdb76597dc2713952.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d11\/7d2\/2ac\/d117d22acf3ddc8fdb76597dc2713952.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>BadgesController.java, 90-99 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0447\u0443\u0432\u0430\u043a \u0441 ID 2562664432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u201cTrusted\u201d (\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c). \u041b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u043e\u0433\u043b\u043e\u0442\u0438\u0442 \u0431\u0435\u0437 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0439. \u0412\u043e\u0442 \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u043d\u044f enterprise!<\/p>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u043e\u043d\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong><br \/>\u041d\u043e \u0438 \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0435. \u042f \u043f\u043e\u0448\u0435\u043b \u0433\u043b\u0443\u0431\u0436\u0435 \u0438 \u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u0434\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u2014 PythonPluginsEngine.java. \u0420\u0430\u0437\u0440\u0430\u0431\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u043f\u043a-\u0448\u0435\u043a \u0438\u043c \u043c\u0430\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 (SDK) \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 Telegram-\u043f\u043e\u0441\u0442\u043e\u0432.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a9\/38f\/b7b\/6a938fb7b36776ef9db0ab1476b8c06f.png\" alt=\"PythonPluginsEngine.java, 2727-2746 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"PythonPluginsEngine.java, 2727-2746 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"1763\" height=\"412\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6a9\/38f\/b7b\/6a938fb7b36776ef9db0ab1476b8c06f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a9\/38f\/b7b\/6a938fb7b36776ef9db0ab1476b8c06f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2727-2746 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0449\u0435\u0442 \u043f\u043e\u0441\u0442\u044b \u0441 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0435\u0433\u0430\u043c\u0438 python_sdk_stable \u0447\u0435\u0440\u0435\u0437 MTProto. \u0418 \u0442\u0443\u0442 \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0434\u0432\u0435 \u0432\u0435\u0449\u0438, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u044f \u0438\u0445 \u0437\u0430\u0449\u0438\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u042f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438 \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u044d\u0442\u043e\u0442 \u0430\u0440\u0445\u0438\u0432. \u0422\u0438\u0445\u0430\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430. \u0412 \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0430\u043f\u0434\u0435\u0439\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0433:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d1\/6c5\/228\/4d16c5228319f09573300d6af9893969.png\" alt=\"PythonPluginsEngine.java, 2877-2881 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"PythonPluginsEngine.java, 2877-2881 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"717\" height=\"153\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4d1\/6c5\/228\/4d16c5228319f09573300d6af9893969.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d1\/6c5\/228\/4d16c5228319f09573300d6af9893969.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2877-2881 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432 \u043e\u0431\u0445\u043e\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ed\/c9a\/dc0\/0edc9adc0b759ff759d0ad10a07b7393.png\" alt=\"PythonPluginsEngine.java, 2749-2788 \u0441\u0442\u0440\u043e\u043a\u0430\" title=\"PythonPluginsEngine.java, 2749-2788 \u0441\u0442\u0440\u043e\u043a\u0430\" width=\"1567\" height=\"818\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0ed\/c9a\/dc0\/0edc9adc0b759ff759d0ad10a07b7393.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ed\/c9a\/dc0\/0edc9adc0b759ff759d0ad10a07b7393.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2749-2788 \u0441\u0442\u0440\u043e\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u043e\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u043e\u044f\u0442\u044c can_not_skip=true, \u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442. \u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0438\u043f\u0430\u0435\u0442\u0441\u044f, \u0438 \u0430\u0440\u0445\u0438\u0432 \u0443\u043b\u0435\u0442\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0432 savePythonSdkArchive. (\u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438, \u0434\u043b\u044f 100% \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u201c\u0442\u0438\u0445\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\u201d \u043d\u0443\u0436\u0435\u043d \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0430\u0442\u0447\u0438\u043d\u0433 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u043d\u043e \u0441\u0442\u0430\u0442\u0438\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u0430\u043c\u0430 \u0437\u0430 \u0441\u0435\u0431\u044f).<\/p>\n<p>\u0412 \u043c\u0438\u0440\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043b\u0430\u0433 force_update \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0434\u043d\u044f, \u0438 \u0434\u0430\u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u0412 ExteraGram \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u201c\u041e\u0442\u043c\u0435\u043d\u0430\u201d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u201c\u0412\u044b \u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435?\u201d. \u0414\u0435\u043c\u043e\u043a\u0440\u0430\u0442\u0438\u044f? \u041d\u0435\u0442, \u044d\u0442\u043e \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043f\u0434\u0435\u0439\u0442 \u0441 \u0443\u0442\u0451\u043d\u043a\u043e\u043c \u043d\u0430 \u0444\u043e\u043d\u0435.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0430\u0440\u0445\u0438\u0432\u044b \u0442\u0443\u043f\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0444\u0430\u0439\u043b\u044b:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/412\/db4\/c2f\/412db4c2fe79dbf32995f5b7f7e66068.png\" alt=\"PythonPluginsEngine.java, 2957-2976\" title=\"PythonPluginsEngine.java, 2957-2976\" width=\"1097\" height=\"391\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/412\/db4\/c2f\/412db4c2fe79dbf32995f5b7f7e66068.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/412\/db4\/c2f\/412db4c2fe79dbf32995f5b7f7e66068.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 2957-2976<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u043e\u0431\u0445\u043e\u0434 Google Play \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 Device and Network Abuse.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c\u0443<\/strong><\/p>\n<p>\u0418\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 MVEL \u0424\u0430\u0439\u043b ClassProxy.java (\u0441\u0442\u0440\u043e\u043a\u0430 631) \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 executeMvelMethod, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Java-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 org.mvel2.MVEL.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c43\/b0c\/1f2\/c43b0c1f2bd5399dda79b2610a8e6dbd.png\" alt=\"ClassProxy.java, 631-656 \u0441\u0442\u0440\u043e\u043a\u0438\" title=\"ClassProxy.java, 631-656 \u0441\u0442\u0440\u043e\u043a\u0438\" width=\"1449\" height=\"502\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c43\/b0c\/1f2\/c43b0c1f2bd5399dda79b2610a8e6dbd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c43\/b0c\/1f2\/c43b0c1f2bd5399dda79b2610a8e6dbd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>ClassProxy.java, 631-656 \u0441\u0442\u0440\u043e\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p> \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0444\u0430\u043a\u0442\u044b: \u042f \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043e\u0442 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e MVEL.executeExpression(). \u041d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ParserContext \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u0434\u0435 \u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f obj \u0438 obj2 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 java \u0438 python, \u0447\u0442\u043e \u043f\u0440\u044f\u043c\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f. \u0415\u0441\u043b\u0438 \u0431\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u0438 \u0431\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (whitelist) \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 compileExpression. \u042d\u0442\u043e\u0433\u043e \u043d\u0435\u0442.<\/p>\n<p>\u041e\u043d\u0438 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u043b\u0438 MVEL: \u201c\u0412\u043e\u0442 \u0442\u0435\u0431\u0435, \u0431\u0440\u0430\u0442, \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a JVM. \u0420\u0430\u0431\u043e\u0442\u0430\u0439, \u044f \u0434\u043e\u0432\u0435\u0440\u044f\u044e \u0442\u0435\u0431\u0435, \u043a\u0430\u043a \u0440\u043e\u0434\u043d\u043e\u043c\u0443\u201d. \u042d\u0442\u043e \u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u044d\u0442\u043e \u043d\u0435\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u043a\u0441 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c. \u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430? \u041d\u0435\u0442, \u044d\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u043e\u0439 \u00ab\u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0432\u043e\u0440\u0443\u044e\u0442, \u0447\u0435\u0441\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e\u00bb.<\/p>\n<p><strong>PoC: \u041a\u0430\u043a \u043f\u043b\u0430\u0433\u0438\u043d \u0443\u0433\u043e\u043d\u044f\u0435\u0442 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong><\/p>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043e\u0449\u0440\u044f\u0442\u044c\u0441\u044f \u0441 \u0445\u0430\u043a\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u00ab\u041f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b\u00bb \u0432 Android-\u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435\u0442. \u041f\u043b\u0430\u0433\u0438\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0441 \u0435\u0433\u043e UID, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (sandbox Android).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 Python-\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0435\u0440\u043d\u0443\u0442\u044c executeMvelMethod \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u043e\u0441\u0442 Chaquopy\/JNI. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0439 Proof-of-Concept \u043d\u0430 Python:<\/p>\n<pre><code class=\"python\"># \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 ExteraGramfrom java.lang import Classfrom java.lang import Objectfrom java.lang import String# \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e (\u043f\u043b\u0430\u0433\u0438\u043d \u0443\u0436\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 Telegram!)ClassProxy = Class.forName(\"com.exteragram.messenger.plugins.utils.ClassProxy\")# \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c MVEL-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 (\u0447\u0438\u0442\u0430\u0435\u043c \u0431\u0430\u0437\u0443 \u044e\u0437\u0435\u0440\u043e\u0432 Telegram)mvel_payload = \"\"\"org.telegram.messenger.MessagesStorage.getInstance(0).getDatabase().queryFinalized(\"SELECT uid, name FROM users LIMIT 1\", new Object[0]);\"\"\"# \u0418\u0449\u0435\u043c \u043c\u0435\u0442\u043e\u0434method = ClassProxy.getMethod(\"executeMvelMethod\", [Object, Object, String, Class.forName(\"[Ljava.lang.String;\"), Class.forName(\"[Ljava.lang.Object;\")])# \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c. \u0411\u0430\u0437\u0430 \u0432 \u0432\u0430\u0448\u0438\u0445 \u0440\u0443\u043a\u0430\u0445.result = method.invoke(None, [None, None, mvel_payload, None, None])print(\"Stolen DB Data:\", result)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u044d\u0442\u043e \u0435\u0449\u0451 \u0446\u0432\u0435\u0442\u043e\u0447\u043a\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043b\u0430\u0433\u0438\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430, \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0443 \u0438\u0437 \u0431\u0430\u0437\u044b, \u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b tgnet.dat (\u0438\u043b\u0438 \u043a\u043b\u044e\u0447\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 MTProto) \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u044d\u0442\u0438 \u043a\u043b\u044e\u0447\u0438, \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0433\u043d\u0430\u0442\u044c \u0432\u0430\u0448\u0443 Telegram-\u0441\u0435\u0441\u0441\u0438\u044e \u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0421\u041c\u0421, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 2FA-\u043f\u0430\u0440\u043e\u043b\u0435\u0439 &#8212; \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430.<\/p>\n<p><strong>\u041a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432\u00bb<\/strong><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u043a\u0430\u043a \u043e\u043d\u0438 \u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0435\u0449\u044c. \u042f \u043d\u0430\u0448\u0435\u043b \u043a\u043b\u0430\u0441\u0441 InvisibleEncryptor.java (\u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u00ab\u041d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0428\u0438\u0444\u0440\u0430\u0442\u043e\u0440\u00bb).<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u0434\u0430\u0451\u0442 100% \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0435\u043c\u0443 \u0432\u044b\u0432\u043e\u0434\u0443 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438: \u043a\u043e\u0434 \u0438\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u043b\u0430 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u0441\u0430\u043c\u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0445\u0432\u0430\u0441\u0442\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0443 \u043d\u0438\u0445 \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u201c\u043a\u043b\u043e\u0434\u0438\u043a\u043e\u043c\u201d (Claude AI).<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044f \u0438 \u0441\u0442\u0435\u0433\u0430\u043d\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u0430 \u043d\u0435 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f (\u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441 AES). \u041d\u043e \u0440\u0430\u0437 \u0443\u0436 \u0430\u0432\u0442\u043e\u0440 \u043f\u0430\u0444\u043e\u0441\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043b \u043a\u043b\u0430\u0441\u0441 InvisibleEncryptor, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0443\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0435\u0440\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442\u2026 \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 Unicode-\u0441\u0438\u043c\u0432\u043e\u043b\u044b (zero-width spaces). \u0414\u043b\u044f \u0448\u043a\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043e\u043a\u0443\u0441\u0430 \u044d\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043b\u044f production-\u043a\u043e\u0434\u0430 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u043e\u0440.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0443\u0441\u043e\u043a \u0438\u0437 \u0438\u0445 YandexMapsProvider.java:<\/p>\n<pre><code class=\"java\">\/\/ \u0422\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0432\u044b\u0447\u0435\u043a \u0438\u0434\u0443\u0442 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \"\u0441\u043f\u0440\u044f\u0442\u0430\u043d\" \u043a\u043b\u044e\u0447private static final String YANDEX_API_KEY = InvisibleEncryptor.decode(\"\\u2001\\u2002\\u206a\\u200c\\u2000\\u206e...\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u2014 \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u201c\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u0445\u0430\u043a\u0435\u0440 \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u0444\u0430\u0439\u043b, \u0443\u0432\u0438\u0434\u0438\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443, \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u0441\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440, \u0438 \u0443\u0439\u0434\u0435\u0442 \u0432 \u043c\u043e\u043d\u0430\u0441\u0442\u044b\u0440\u044c\u201d. (\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \\u2001 \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0445\u0438\u0442\u0440\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u2014 \u043d\u0435\u0442, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u201cEM QUAD\u201d. \u041e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 Unicode \u0443\u0436\u0435 \u043b\u0435\u0442 30. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044e, \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0441\u043b\u043e\u0432\u0430 \u201czero-width spaces\u201d \u0438 \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0438 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u044b).<\/p>\n<p>\u041e\u043d\u0438 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u0435\u0440\u044c\u0451\u0437\u0435 \u043f\u0440\u044f\u0447\u0443\u0442 \u044d\u0442\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0435 API-\u043a\u043b\u044e\u0447\u0438, \u043d\u043e \u0438 \u0431\u044d\u043a\u0430\u043f\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439! \u041b\u044e\u0431\u043e\u043c\u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u0443 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c API \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0451\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 InvisibleEncryptor.decode(), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0438\u0440\u043e\u043d\u0438\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u043f\u0440\u044f\u0442\u0430\u043b\u0438 \u043a\u043b\u044e\u0447\u0438 \u043e\u0442 \u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442 \u0432 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u0433\u043b\u0430\u0432\u043d\u044b\u0435 API-\u043a\u043b\u044e\u0447\u0438 \u043e\u0442 Telegram (APP_ID \u0438 APP_HASH) \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f Firebase \u043b\u0435\u0436\u0430\u0442 \u0432 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u043c BuildConfig.java \u0438 strings.xml. \u0411\u0440\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0432\u0435\u0440\u044c \u043d\u0430 \u043a\u043b\u0430\u0434\u043e\u0432\u043a\u0435 \u0441\u043e \u0448\u0432\u0430\u0431\u0440\u0430\u043c\u0438, \u0430 \u0432\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0432\u0435\u0440\u044c \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u0441\u043d\u044f\u0442\u0430 \u0441 \u043f\u0435\u0442\u0435\u043b\u044c.<\/p>\n<p><strong>DevServer: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043f\u0440\u043e\u0434\u0435<\/strong><\/p>\n<p>\u0412 PythonPluginsEngine.java \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d29\/9c9\/9d7\/d299c99d7df9466df5a00a5d7b84c054.png\" alt=\"PythonPluginsEngine.java, 652-674 \u0441\u0442\u0440\u043e\u043a\u0438\" title=\"PythonPluginsEngine.java, 652-674 \u0441\u0442\u0440\u043e\u043a\u0438\" width=\"991\" height=\"442\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/d29\/9c9\/9d7\/d299c99d7df9466df5a00a5d7b84c054.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d29\/9c9\/9d7\/d299c99d7df9466df5a00a5d7b84c054.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>PythonPluginsEngine.java, 652-674 \u0441\u0442\u0440\u043e\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u043f\u0440\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (<code>start_server<\/code>). \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0442 \u0444\u043b\u0430\u0433\u043e\u043c\u00a0<code>pluginsDevMode<\/code>. \u041d\u043e \u0443 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0436\u0435 \u0435\u0441\u0442\u044c MVEL. \u041b\u044e\u0431\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435:\u00a0<em>&#171;\u041d\u0443 \u043e\u043a, \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u043d\u043e \u043a\u0430\u043a \u0436\u0435 \u043f\u043e\u0440\u0442\u044b \u0438 NAT? \u041a \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0443 \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f!&#187;<\/em>\u00a0&#8212; \u0432\u044b \u043c\u044b\u0441\u043b\u0438\u0442\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f\u043c\u0438 \u0437\u0430\u0449\u0438\u0442\u044b, \u0430 \u043d\u0435 \u0430\u0442\u0430\u043a\u0438.<\/p>\n<p>\u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438\u0441\u044c \u043a \u043d\u0435\u043c\u0443 \u0441\u043d\u0430\u0440\u0443\u0436\u0438. \u0421\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 (\u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u00a0<code>127.0.0.1<\/code>\u00a0\u0438\u043b\u0438\u00a0<code>0.0.0.0<\/code>). \u041f\u043b\u0430\u0433\u0438\u043d \u0441\u0430\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0441\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043e\u0436\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 (reverse shell) \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0430, \u043e\u0431\u0445\u043e\u0434\u044f \u043b\u044e\u0431\u044b\u0435 NAT \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u044b, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 TCP-\u0441\u043e\u043a\u0435\u0442 \u0434\u043b\u044f \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0430\u043b\u0432\u0430\u0440\u044f\u043c\u0438 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.<\/p>\n<p><strong>\u041a\u0430\u043a \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c\u0441\u044f<\/strong><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0432\u043e\u043c, \u0432\u043e\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 ExteraGram (\u0438 \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043a\u043e\u0432), \u043a\u0430\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u0438\u044f\u044e\u0449\u0443\u044e \u0434\u044b\u0440\u0443:<\/p>\n<ol>\n<li>\n<p> \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 (Signature Verification). \u041b\u044e\u0431\u043e\u0439 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u043d\u0435 \u0441\u043e\u0448\u043b\u0430\u0441\u044c, \u0444\u0430\u0439\u043b \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438. <\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (chat_id). \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438\u0448\u043b\u043e \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c ID, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430. \u0418\u043d\u0430\u0447\u0435 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0431\u043e\u0442\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0447\u0430\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u0412\u043c\u0435\u0441\u0442\u043e MVEL \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a JVM \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 WebView \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c JavaScript, \u0433\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 addJavascriptInterface \u0432\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 UI). \u041b\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u044f\u0436\u0435\u043b\u043e\u0432\u0435\u0441, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 V8 (LiquidCore). <\/p>\n<\/li>\n<li>\n<p>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432. \u041f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b. \u041a\u043b\u044e\u0447\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432 NDK\/JNI (\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043b\u043e\u0439) \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Android Keystore. <\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u043e\u0432. \u0412\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0431\u044d\u043a\u0434\u043e\u0440\u044b (DevServer) \u0438\u0437 production-\u0441\u0431\u043e\u0440\u043e\u043a \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 ProGuard\/R8 \u043f\u0440\u0430\u0432\u0438\u043b\u0430). <\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0427\u0442\u043e \u0432 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435<\/strong><\/p>\n<p>\u042f \u0441\u043e\u0431\u0440\u0430\u043b \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u0448\u0435\u043b, \u0432 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0438\u0445\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0430\u043f\u0434\u0435\u0439\u0442\u043e\u0432. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/118\/891\/fec\/118891fec9513e4d4419f0fa9790c508.png\" alt=\"\u0427\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 20 \u044f\u043d\u0432\u0430\u0440\u044f\" title=\"\u0427\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 20 \u044f\u043d\u0432\u0430\u0440\u044f\" width=\"533\" height=\"78\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/118\/891\/fec\/118891fec9513e4d4419f0fa9790c508.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/118\/891\/fec\/118891fec9513e4d4419f0fa9790c508.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0427\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 20 \u044f\u043d\u0432\u0430\u0440\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0434\u0435\u0441\u044c \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u0430\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0438. \u041e\u0448\u0438\u0431\u043a\u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0441\u0435. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c. \u0417\u0430\u0442\u043e \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u044b\u0440\u044b \u0432 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441\u00bb \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u0430\u043c\u043e\u043d\u0430\u0434\u0435\u044f\u043d\u043d\u043e. \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043d\u043e \u043e\u043d \u043d\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0435\u0451 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p><strong>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c ExteraGram<\/strong> <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0432\u0435\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u044b\u0448\u0435, \u0430 \u0432\u043e\u0442 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439:<\/p>\n<ol>\n<li>\n<p>\u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u0435 \u043a\u043b\u0438\u0435\u043d\u0442 \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. <\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0439\u0434\u0438\u0442\u0435 \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Telegram -&gt; \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -&gt; \u041a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c -&gt; \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0430\u043d\u0441\u044b -&gt; \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0441\u0435\u0430\u043d\u0441 ExteraGram \u0438 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 \u00ab\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u0435\u0430\u043d\u0441\u00bb. (\u041f\u0440\u043e\u0441\u0442\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0441\u0435\u0441\u0441\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 Telegram, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0433\u043e\u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0439 \u043a \u043d\u0435\u0439 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f). <\/p>\n<\/li>\n<li>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 Google Play Protect \u043f\u043e \u043f\u0440\u043e\u0441\u044c\u0431\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>P.S. \u0410\u0432\u0442\u043e\u0440 \u0430\u0443\u0434\u0438\u0442\u0430 \u2014 15-\u043b\u0435\u0442\u043d\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u042d\u0442\u043e\u0442 \u0440\u0430\u0437\u0431\u043e\u0440 \u0431\u044b\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445. \u041c\u043e\u0440\u0430\u043b\u044c: \u043d\u0438\u043a\u0430\u043a\u0438\u0435 OLLVM \u0438 LSParanoid \u043d\u0435 \u0441\u043f\u0430\u0441\u0443\u0442 \u0432\u0430\u0441, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439, \u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438.<br \/>P.P.S. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c lead-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 ExteraGram (<a class=\"mention\" href=\"\/users\/immat0x1\">@immat0x1<\/a>) \u0437\u0430 \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b \u043f\u0440\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u00ab\u043a\u043b\u043e\u0434\u0438\u043a\u043e\u043c\u00bb, \u0431\u0430\u043d\u044b \u0437\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u2014 \u0432\u044b \u043b\u0443\u0447\u0448\u0438\u0439 \u043c\u043e\u0442\u0438\u0432\u0430\u0442\u043e\u0440 \u0432 \u043c\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438. \u041e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u043b\u0434:\u00a0pixwet, bleizix, alexeyzavar, ireina, the8055u, Windukk, yzewe, hehcker, ampliation, iwill, kvuco, &#171;i miss her&#187;.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1069358\/\">https:\/\/habr.com\/ru\/articles\/1069358\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TL;DR \u0412\u043d\u0443\u0442\u0440\u0438 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 ExteraGram \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0430\u0432\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0430 \u0432\u0430\u0448 \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Telegram-\u043a\u0430\u043d\u0430\u043b\u0430, \u043e\u0431\u043e\u0439\u0442\u0438 \u043e\u043a\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 (can_not_skip) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u0441 \u0435\u0433\u043e UID \u0438 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0430\u043c\u0438). \u0412 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044f \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u041f\u0440\u0438 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u043a\u0430\u043d\u0430\u043b\u0430 \u0438\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c.\u041a\u0430\u043a \u0432\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0411\u044b\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u0435\u0447\u0435\u0440, \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u0440\u043e\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u0447\u0435\u0433\u043e. \u042f \u0441\u0430\u043c \u0441\u0438\u0434\u0435\u043b \u043d\u0430 ExteraGram, \u0438 \u0432\u0434\u0440\u0443\u0433 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e &#8212; \u0430 \u043a\u0430\u043a \u043e\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e? (\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044f \u0442\u0430\u043c \u0443\u0432\u0438\u0434\u0435\u043b, \u044f \u0435\u0433\u043e \u0441\u043d\u0435\u0441).\u0427\u0430\u0442 exteraGram Forum, 10 \u0430\u043f\u0440\u0435\u043b\u044f\u041d\u0443 immat0x1 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u044e. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f exteraGram 12.9.0 \u043e\u0442 31 \u0438\u044e\u043b\u044f 2026 \u0433\u043e\u0434\u0430\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043d\u0430\u0442\u0440\u0430\u0432\u043b\u0438\u0432\u0430\u044e JADX \u043d\u0430 \u0441\u0432\u0435\u0436\u0438\u0439 APK, \u0436\u0434\u0443 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438&#8230; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u043f\u0430\u0434\u0430\u044e \u0432 \u0441\u0442\u0443\u043f\u043e\u0440. \u0410\u0432\u0442\u043e\u0440\u044b \u043e\u0431\u043c\u0430\u0437\u0430\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043f\u043e \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0412\u0435\u0441\u044c Java-\u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442 \u0432 \u0436\u0435\u0441\u0442\u043e\u0447\u0430\u0439\u0448\u0438\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440\u00a0LSParanoid. \u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, Python-\u043c\u043e\u0434\u0443\u043b\u0438 SDK \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 Cython \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043b\u0438\u0431\u044b\u00a0.so, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 OLLVM \u0441 Control Flow Flattening, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u0431\u0438\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0442\u0443\u0434\u0430 \u043b\u0435\u0437\u0442\u044c.\u041f\u043e\u0442\u043e\u043c \u044f \u0437\u0430\u0448\u0435\u043b \u0432 \u0438\u0445 \u0447\u0430\u0442 \u0438 \u0443\u0432\u0438\u0434\u0435\u043b \u0437\u0430\u0431\u0430\u0432\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u043e\u0442 \u043b\u0438\u0434-\u0440\u0430\u0437\u0440\u0430\u0431\u0430:\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0447\u0430\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043a\u0430, 3 \u0430\u0432\u0433\u0443\u0441\u0442\u0430\u0422\u0443\u0442 \u0432\u0441\u0451 \u0432\u0441\u0442\u0430\u043b\u043e \u043d\u0430 \u0441\u0432\u043e\u0438 \u043c\u0435\u0441\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0448\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u043c\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0448\u044c \u044d\u0442\u043e \u0432 \u0436\u0435\u0441\u0442\u043e\u0447\u0430\u0439\u0448\u0438\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440, \u0440\u0435\u0448\u0438\u0432, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043f\u0430\u0441\u0451\u0442 \u043e\u0442 \u0432\u0437\u043b\u043e\u043c\u0430 &#8212; \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c.\u041d\u0430\u0439\u0434\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u044d\u043a\u0434\u043e\u0440 \u0438 RCE (Remote Code Execution) \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0441\u0431\u043e\u0440\u043a\u0435, \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0440\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 Google Android Security Team. \u0418 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043c\u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438?\u041e\u0442\u0432\u0435\u0442 The Play and Android Security Team\u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 Google, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0444\u0443\u0441\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0438\u0437 Telegram-\u043f\u043e\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a JVM \u0431\u0435\u0437 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u044b \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u043b\u0432\u0430\u0440\u044c. \u0427\u0442\u043e \u0436, \u0440\u0430\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0434\u0430\u043b\u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0441\u0432\u0435\u0442 \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u043e\u0434\u0445\u043e\u0434\u0443, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u043d\u0443\u0442\u0440\u0438.\u0427\u0442\u043e \u043e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0438 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043a\u043e\u0434\u0435\u0412\u0441\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u043d\u0438\u0436\u0435 \u2014 \u044d\u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 JADX \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c APK \u0432\u0435\u0440\u0441\u0438\u0438 12.9.0 (\u0441\u0431\u043e\u0440\u043a\u0430 20260731). \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u0434\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0432\u0441\u0451 \u043a\u0430\u043a \u0435\u0441\u0442\u044c, \u043f\u0440\u044f\u043c\u043e \u0441 \u0442\u043e\u043d\u043d\u043e\u0439 \u0448\u0438\u0444\u0440\u0430\u0442\u043e\u0440\u0430 LSParanoid.\u0412 \u0447\u0430\u0442\u0430\u0445 \u0430\u0432\u0442\u043e\u0440\u044b \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u043b\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0438\u0445 \u043a\u0440\u0443\u0442\u044b\u0435 \u0437\u0430\u0449\u0438\u0442\u044b. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a bleizix \u043f\u0438\u0441\u0430\u043b \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435:\u0447\u0430\u0442 exteraGram Forum, 8 \u043c\u0430\u044f\u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u043e\u043d\u0438 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u0443, \u043a\u0430\u043a \u0432 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0445 DRM:\u0421\u043b\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 (Cython + OLLVM): Python-\u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043e\u043d\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 .so, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 OLLVM (Control Flow Flattening). \u041f\u0430\u0440\u0430\u043d\u043e\u0439\u044f \u0432 Java (LSParanoid): \u0412\u0441\u044f Java-\u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u043d\u0430\u0433\u043b\u0443\u0445\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0430. \u041d\u043e \u0441\u0430\u043c\u043e\u0435 \u0441\u043c\u0435\u0448\u043d\u043e\u0435 \u2014 \u043e\u043d\u0438 \u0442\u0430\u043a \u0443\u0432\u043b\u0435\u043a\u043b\u0438\u0441\u044c \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0435\u0439, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c strip \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432.\u041e\u043d\u0438 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438 Control Flow Flattening \u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0432\u0435\u0449\u044c \u2014 strip. \u042d\u0442\u043e \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0434\u0432\u0435\u0440\u044c \u0441\u0435\u0439\u0444\u043e\u0432\u044b\u0439 \u0437\u0430\u043c\u043e\u043a \u0442\u043e\u043b\u0449\u0438\u043d\u043e\u0439 \u0432 \u043c\u0435\u0442\u0440, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u043f\u043e\u0434 \u043a\u043e\u0432\u0440\u0438\u043a\u043e\u043c \u0441 \u043d\u0430\u0434\u043f\u0438\u0441\u044c\u044e \u2018Welcome\u2019. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 strip \u0432\u044b\u043f\u0438\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432. \u0415\u0451 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e OLLVM-\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u0438 \u0438\u043c\u0435\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u0431\u043b\u044e\u0434\u0435\u0447\u043a\u0435.\u0412\u0441\u044f \u0438\u0445 \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u044f \u043d\u0430 \u044d\u043b\u0438\u0442\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0438 \u00ab\u0437\u0430\u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0449\u0438\u0442\u0443\u00bb \u0441\u044b\u043f\u0435\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 metadata_parser.so (\u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0431\u044b\u0442\u044c \u0441\u0443\u043f\u0435\u0440-\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u043c. \u0417\u0430\u0431\u044b\u0442\u044b\u0439 strip \u0432\u044b\u0434\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441 \u043f\u043e\u0442\u0440\u043e\u0445\u0430\u043c\u0438:\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u041c\u0430\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e\u0447\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Cython, \u0442\u0430\u043a \u0435\u0449\u0435 \u0438 \u043f\u0430\u043b\u0438\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043a OLLVM \u0441 \u0433\u0438\u0442\u0445\u0430\u0431\u0430 (luluovo1\/ollvm-ndk30), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0446\u0438\u0438. \u0418 \u0442\u0430\u043c \u0436\u0435 \u0440\u044f\u0434\u043e\u043c \u0442\u043e\u0440\u0447\u0430\u0442 \u043f\u0443\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0445 SDK:\u0412\u044b\u0432\u043e\u0434 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430\u0412 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0442\u0447\u043d\u043e\u0443\u0442\u0435 12.9.0 \u043e\u043d\u0438 \u0441 \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u044f\u0432\u043b\u044f\u043b\u0438:\u0447\u0430\u0442 exteraGram Forum, 31 \u0438\u044e\u043b\u044f\u042f \u043f\u043e\u043b\u0435\u0437 \u0438\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0432 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0434\u0438\u043d if (safeMode) return;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0430\u0432 \u0447\u0435\u0440\u0435\u0437 SecurityManager. \u041b\u0438\u0431\u043e \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043b\u0438\u0431\u043e \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.\u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043e\u0434\u0430 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Telegram \u0410\u0432\u0442\u043e\u0440\u044b \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b\u0438 \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 LSParanoid \u0441\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u043e\u0439 \u0431\u0440\u043e\u043d\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0443\u044e \u0431\u0430\u0437\u0443: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0438 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442.\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044f PythonPluginsEngine.java, \u043c\u044b \u043d\u0435 \u0432\u0438\u0434\u0438\u043c \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u0441\u0451 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e:PythonPluginsEngine.java, 2851-2895 \u0441\u0442\u0440\u043e\u043a\u0430LSParanoid \u043f\u0440\u044f\u0447\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u0438\u0445 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u0430\u00a0getString(long seed). \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u044b\u00a0DeobfuscatorHelper\u00a0\u0438\u00a0RandomHelper, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432\u0441\u044e \u0438\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435.\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u0438\u043d\u043d\u044b\u0439\u00a0seed\u00a0\u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0438\u043a\u0441\u0435\u0440 \u0432 \u0441\u0442\u0438\u043b\u0435 SplitMix64 (XOR \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043c\u0438 \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432\u0440\u043e\u0434\u0435\u00a07109453100751455733L). \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0442\u0435\u0439\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u0440\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 64-\u0431\u0438\u0442\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438, \u0430 \u043d\u0430 16-\u0431\u0438\u0442\u043d\u044b\u0435\u00a0short-\u0431\u043b\u043e\u043a\u0438. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u0430\u0433\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432: \u0431\u043b\u043e\u043a\u0438 \u043a\u0441\u043e\u0440\u044f\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 (^), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u043b\u0435\u0432\u043e \u0438 \u0432\u043f\u0440\u0430\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439\u00a0rotl\u00a0\u043d\u0430 \u0436\u0435\u0441\u0442\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f (9, 10, 13).\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0445\u0430\u043e\u0441\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0441\u043d\u043e\u0432\u0430 XOR-\u0438\u0442\u0441\u044f. \u041d\u043e \u0441 \u0447\u0435\u043c? \u0414\u0435\u043e\u0431\u0444\u0443\u0441\u043a\u0430\u0442\u043e\u0440 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a (chunks), \u0431\u0435\u0440\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u00a08191) \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 XOR. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c.deobf.pyimport osimport reimport structdef to_int(val: int) -&gt; int:    val &amp;= 0xFFFFFFFF    return val &#8212; 0x100000000 if val &gt;= 0x80000000 else valdef to_short(val: int) -&gt; int:    val &amp;= 0xFFFF    return val &#8212; 0x10000 if val &gt;= 0x8000 else valdef rotl_short(val: int, shift: int) -&gt; int:    val_int = to_int(to_short(val))    unsigned = val_int &amp; 0xFFFFFFFF    return to_short((unsigned &gt;&gt; (32 &#8212; shift)) | (val_int &lt;&lt; shift))def calc_seed(val: int) -&gt; int:    val &amp;= 0xFFFFFFFFFFFFFFFF    j2 = ((val ^ (val &gt;&gt; 33)) * 7109453100751455733) &amp; 0xFFFFFFFFFFFFFFFF    mult = ((j2 ^ (j2 &gt;&gt; 28)) * -3808689974395783757) &amp; 0xFFFFFFFFFFFFFFFF    return mult &gt;&gt; 32def next_state(state: int) -&gt; int:    state &amp;= 0xFFFFFFFFFFFFFFFF    s1 = to_short(state &amp; 0xFFFF)    s2 = to_short((state &gt;&gt; 16) &amp; 0xFFFF)    s_sum = to_short(to_int(s1) + to_int(s2))    s_rotl = to_short(to_int(rotl_short(s_sum, 9)) + to_int(s1))    s_xor = to_short(to_int(s2) ^ to_int(s1))    a_b = (rotl_short(s_xor, 10) &amp; 0xFFFFFFFFFFFFFFFF) | ((s_rotl &amp; 0xFFFFFFFFFFFFFFFF) &lt;&lt; 16)    d_val = (a_b &lt;&lt; 16) &amp; 0xFFFFFFFFFFFFFFFF    e_val = to_short(to_int(rotl_short(s1, 13)) ^ to_int(s_xor))    g_val = to_short(to_int(e_val) ^ (to_int(s_xor) &lt;&lt; 5))    return d_val | (g_val &amp; 0xFFFFFFFFFFFFFFFF)def read_char(idx: int, chunks: list[list[int]], state: int) -&gt; tuple[int, int]:    chunk = chunks[idx \/\/ 8191][idx % 8191]    nxt = next_state(state)    res = ((chunk &lt;&lt; 32) &amp; 0xFFFFFFFF00000000) ^ nxt    return res, nxtdef decrypt_string(string_id: int, chunks: list[list[int]]) -&gt; str:    raw_id = string_id &amp; 0xFFFFFFFFFFFFFFFF    nxt1 = next_state(calc_seed(raw_id &amp; 0xFFFFFFFF))    nxt2 = next_state(nxt1)    part1 = (raw_id &gt;&gt; 32) ^ ((nxt1 &gt;&gt; 32) &amp; 0xFFFF)    part2 = (nxt2 &gt;&gt; 16) &amp; 0xFFFF0000    start_idx = to_int(part1 ^ part2)    header, current_state = read_char(start_idx, chunks, nxt2)    length = (header &gt;&gt; 32) &amp; 0xFFFF    chars = []    for offset in range(length):        ch_data, current_state = read_char(start_idx + offset + 1, chunks, current_state)        chars.append((ch_data &gt;&gt; 32) &amp; 0xFFFF)    return struct.pack(f'&lt;{len(chars)}H&#8217;, *chars).decode(&#8216;utf-16-le&#8217;)def parse_java_chars(raw: str) -&gt; list[int]:    cleaned = re.sub(r&#8217;\\\\u([0-9a-fA-F]{4})&#8217;, lambda m: chr(int(m.group(1), 16)), raw)    escapes = {&#8216;\\\\n&#8217;: &#8216;\\n&#8217;, &#8216;\\\\r&#8217;: &#8216;\\r&#8217;, &#8216;\\\\t&#8217;: &#8216;\\t&#8217;, &#8216;\\\\&#187;&#8216;: &#8216;&#187;&#8216;, &#8216;\\\\\\\\&#8217;: &#8216;\\\\&#8217;, &#171;\\\\'&#187;: &#171;&#8216;&#187;, &#8216;\\\\b&#8217;: &#8216;\\b&#8217;, &#8216;\\\\f&#8217;: &#8216;\\f&#8217;}    for src, dst in escapes.items():        cleaned = cleaned.replace(src, dst)    chars = []    for ch in cleaned:        cp = ord(ch)        if cp &lt;= 0xFFFF:            chars.append(cp)        else:            cp -= 0x10000            chars.append(0xD800 + (cp &gt;&gt; 10))            chars.append(0xDC00 + (cp &amp; 0x3FF))    return charsdef escape_string(text: str) -&gt; str:    table = {&#8216;\\\\&#8217;: &#8216;\\\\\\\\&#8217;, &#8216;&#187;&#8216;: &#8216;\\\\&#187;&#8216;, &#8216;\\n&#8217;: &#8216;\\\\n&#8217;, &#8216;\\r&#8217;: &#8216;\\\\r&#8217;, &#8216;\\t&#8217;: &#8216;\\\\t&#8217;}    res = []    for ch in text:        if ch in table:            res.append(table[ch])        elif ord(ch) &lt; 32 or ord(ch) == 127:            res.append(f&#8217;\\\\u{ord(ch):04x}&#8217;)        else:            res.append(ch)    return &#171;&#187;.join(res)def load_chunks(target_dir: str) -&gt; dict[str, list[list[int]]]:    chunks_db = {}    array_re = re.compile(r&#8217;String\\[\\]\\s+\\w+\\s*=\\s*(?:new\\s+String\\[\\]\\s*)?\\{([^}]+)\\}&#8217;)    str_re = re.compile(r'&#187;((?:[^&#187;\\\\]|\\\\.)*)&#187;&#8216;)    for root, _, files in os.walk(target_dir):        for file in files:            if not file.endswith(&#171;.java&#187;) or &#171;Helper&#187; in file:                continue            path = os.path.join(root, file)            try:                with open(path, encoding=&#187;utf-8&#8243;, errors=&#187;ignore&#187;) as f:                    content = f.read()            except OSError:                continue            for match in array_re.finditer(content):                raw_strings = str_re.findall(match.group(1))                if any(len(s) &gt; 1000 for s in raw_strings):                    cls_name = file[:-5]                    chunks_db[cls_name] = [parse_java_chars(s) for s in raw_strings]                        return chunks_dbdef deobfuscate_dir(target_dir: str = &#171;sources&#187;):    chunks_db = load_chunks(target_dir)    if not chunks_db:        return    call_re = re.compile(r'([A-Za-z0-9_$.]+)?getString\\s*\\(\\s*(?:\\(\\s*long\\s*\\)\\s*)?(-?\\s*\\d+)L?\\s*\\)&#8217;)&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-490581","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=490581"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490581\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=490581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=490581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=490581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}