Статья Реверс-инжиниринг для начинающих [Часть 4 \ -EXE-]

-EXE-

RAID-массив
Пользователь
Регистрация
07.08.2022
Сообщения
55
Реакции
349
rvs-4.png

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

Все началось с того что я искал интересный программный образец для будущей статьи и наткнулся в сети на программу под названием Antiplagiat Killer,
понимаете какое название у программы :). Разработчик программы утверждает, на своем сайте https://анти-антиплагиат.рф/blog/programma-dlya-kopirajtinga-2020-skachat-besplatno, что аналогов его детищу НЕТ и Точка!

Кстати, программу рассматриваю актуальной версии, та что сейчас доступна на сайте разработчика. В процессе анализа сможете сами проверить и убедится .

ONE.jpg


Ну слушайте, утверждая такое, нужно как минимум иметь весомые причины, может это какой то искусственный интеллект ?. Я к таким словам всегда отношусь скептически и в первую очередь, если софт есть на руках, обязательно его начну смотреть изнутри. Верить в гадалок, чудо или что то сверхъестественное это не мое, не дано мне это в жизни ;) .

А теперь начинается самое интересное, а мы даже еще не приступили к анализу программы. Ну я подумал, минут 15 от силы, и сам себе задал несколько вопросов. Первое, что чуда не бывает в 99% случаях и скорее всего у программы имеется своя база синонимов, или же база словосочетаний. И софт работает по такому принципу что берет фразы или слова из этой базы и подставляет в текст. Вот это скорее всего логичней ;). И второе база данных (или же словарь) может быть расположен или возле программы или же напрямую берется с сайта (сервера) разработчика.

В итоге, надумал, просто автору (Разработчику программы) отписать и задать ему парочку вопросов. Ну чисто по человечески что он ответит, было сначала интересно. Тем более что на сайте этого же разработчика говорится что они предоставляют программу на тест, на сутки - Бесплатно. И тут внимание, как только я спросил у разработчика по какому принципу работает программа то разработчик быстренька пошел в откат и сказал что по собственному алгоритму. А когда спросил за тест, так он ответил что тест платный (999 рублей), минуточку :cool: но на сайте указано же что даете тест бесплатно на сутки. И у меня сложилось впечатление что меня пытаются (и не только меня) а и большинство людей ввести в ЗАБЛУЖДЕНИЕ.

Переписка на официальном сайте программы (с разработчиком) там все и так предельно понятно что он и суппорт и разработчик в одном лице.

Ant-1.jpg


Ant-2.jpg


Ant-3.jpg


Ant-4.jpg


Ant-5.jpg


Ну ок если я что то попутал то ничего, сделаем вид что я этого не заметил :D

Ant-6.jpg

Вывод ? Что то не чисто тут, скорее всего есть (как всегда) не один подводный камень. Что написано ВЫШЕ я не спроста огласил, все взаимосвязано.
А теперь давайте же приступим к анализу программы.

Для начала давайте запустим программу и посмотрим визуально на принцип активации программы. И уже от этого будем отталкиваться, анализируя защиту софта.

Запускаем программу и смотрим что у нас происходят за чудеса при запуске o_O:smile10:. Тут все просто, загружается некая форма активации и далее идет проверка
какого то там файла с колючем активации
, пока что предельно все понятно. И если этого файла нет то программа просто не запускается, а отсылает нас - обратится к
разработчику программы ;). Как бы не так.

Antiplag-1.jpg

Это все то что изначально, нам, удалось выяснить. Уже неплохо и Мы хотя бы визуально понимаем как происходит активации программы ;). Ну а теперь, как обычно, давайте посмотрим что за информацию о исполняемом файле AntiplagiatT.exe (наш пациент) покажет утилита ExeInfo PE. Перетаскиваем исполняемый файл AntiplagiatT.exe на форму утилиты ExeInfo PE.

Antiplag-2.jpg

А видим мы вот такую картину
  1. Имя исполняемого файла, в нашем случае: AntiplagiatT.exe
  2. Разрядность: утилита определила что это 32 разрядное (32-битное) приложение Windows.
  3. Язык программирования и есть ли упаковка (сжатие), защита на программе: Язык программирования С# \ а вот защиты нет, упаковки или обфускации кода.
  4. Ну и последний пункт: В роли отладчика нам рекомендуют использовать Net Reflector, версии 11. А как по мне так DnSpy будет.

Отлично, информацию собрали, подготовились, приступаем к просмотру внутренностей программы . Запускаем отладчик DnSpy x32 (так как мы выяснили, выше, что наш пациент это 32-битное приложения) и закидываем туда исполняемый файл программы, в нашем случае это AntiplagiatT.exe.


И сразу же переходим к точке входа программы , адресу с которого начинается выполнения программы (инициализация функций, процедур). Для этого нажимаем правой кнопкой мышки в отладчике по нашему файлу и выбираем, в меню, перейти к точке входа.

Antiplag-3.jpg



И начинаем смотреть что тут у нас происходит. Поскольку, выше, мы уже знаем что при запуске программа проверяет некий файл лицензии и если его нет то просто не запускается то посмотрев на код мы видим что LoadLicence уже само собой понятно за что отвечает ?, загрузка лицензии, правильно.

Но тут не спешите, давайте разложим все по винтикам. Немного ниже мы видим запуск, загрузку некой формы Application.Run(new PreForm());. Давайте кликнем по ней левой кнопкой мышки и посмотрим что там происходит внутри.
Antiplag-4.jpg


PreForm() вот кусок кода. :cool:
C#:
public PreForm()
        {
            base.Visible = false;
            bool isLoadCompleate = false;
            ThreadPool.QueueUserWorkItem(delegate(object state)
            {
                bool flag8 = PreForm.loader != null;
                if (flag8)
                {
                    this.CloseFormLoader();
                }
                Guid id = Guid.NewGuid();
                PreForm.loader = new Loader("Antiplagiat v" + Assembly.GetExecutingAssembly().GetName().Version.ToString(), "Идет инициализация программы...", id);
                PreForm.loader.Show();
                while (!isLoadCompleate)
                {
                    Application.DoEvents();
                    Thread.Sleep(100);
                }
                bool flag9 = PreForm.loader.Id == id;
                if (flag9)
                {
                    this.CloseFormLoader();
                }
            });
            this.InitializeComponent();
            IEnumerable<string> ligins = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains("BoardShowCaseLogin"));
            bool firstItem = true;
            foreach (string item in ligins)
            {
                string[] value = ConfigurationManager.AppSettings.GetValues(item);
                string _boardName = item.Replace("BoardRegister", "").Replace("BoardShowCaseLogin", "").Replace("[", "")
                    .Replace("]", "");
                ServerProvider licenseProvider = new ServerProvider();
                string ProcessorId = PreForm.GetProcessorId();
                string motherId = PreForm.GetMotherId();
                string computerId = ProcessorId + "|" + motherId;
                string boardToken = null;
                string boardShowCaseLogin = null;
                Dictionary<string, string> resources = new Dictionary<string, string>();
                string[] ar = item.Split(new char[] { ']' });
                ar[1] = ar[1].Replace("[", "").Replace("]", "");
                string boardName = ar[0].Replace("BoardShowCaseLogin", "").Replace("[", "").Replace("]", "");
                bool flag = ar.Length > 2;
                if (flag)
                {
                    bool flag2 = item == ar[1];
                    if (flag2)
                    {
                        boardShowCaseLogin = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardShowCaseLogin[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardShowCaseLoginValue = ConfigurationManager.AppSettings[boardShowCaseLogin];
                        string boardShowCasePassword = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardShowCasePassword[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardShowCasePasswordValue = ConfigurationManager.AppSettings[boardShowCasePassword];
                        boardToken = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardToken[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardTokenValue = ConfigurationManager.AppSettings[boardToken];
                    }
                }
                else
                {
                    boardToken = ConfigurationManager.AppSettings[string.Format("BoardToken[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperToken"];
                    boardShowCaseLogin = ConfigurationManager.AppSettings[string.Format("BoardShowCaseLogin[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperShowCaseLogin"];
                    string text = ConfigurationManager.AppSettings[string.Format("BoardShowCasePassword[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperShowCasePassword"];
                }
                string rucapthakey = string.Empty;
                try
                {
                    bool flag3 = licenseProvider.OpenBoardRegisterSession(boardToken, computerId);
                    if (!flag3)
                    {
                        throw new Exception("Ваша лицензия не позволяет работать с ресурсом " + item + " или отсутствует интернет соединение.");
                    }
                    CheckAllowPublichAdResponse checkResult = licenseProvider.CheckAccessToBoard(boardShowCaseLogin, boardName);
                    bool flag4 = checkResult.State == RequestState.OK;
                    if (!flag4)
                    {
                        throw new Exception("Ваша лицензия не позволяет работать с ресурсом " + item + " или отсутствует интернет соединение.");
                    }
                    PreForm.dicResourcesData.Add(boardName, new PreForm.resourceData(checkResult.SiteLogin, checkResult.SitePassword, new PreForm.resourceProxyData(checkResult.ProxyIp, Convert.ToInt32(checkResult.ProxyPort), checkResult.ProxyLogin, checkResult.ProxyPassword)));
                }
                catch (Exception ex)
                {
                    Exception ex3;
                    Exception ex2 = ex3;
                    Exception ex = ex2;
                    base.Visible = false;
                    isLoadCompleate = true;
                    Program.isError = true;
                    ThreadPool.QueueUserWorkItem(delegate(object state)
                    {
                        MessageBox.Show(ex.Message + ", для продолжения работы, пожалуйста обратитесь на \r\nE-mail: support@antiplagiat-killer.com и перезагрузите файл лицензии.", "Ошибка лицензирования продукта", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    });
                    new LoadLicence
                    {
                        TopMost = true
                    }.ShowDialog();
                    base.Close();
                    break;
                }
                bool flag5 = !Program.isError;
                if (flag5)
                {
                    this.Text = this.Text + ": " + value[0];
                    bool flag6 = ligins.Count<string>() == 1;
                    if (flag6)
                    {
                        bool flag7 = firstItem;
                        if (flag7)
                        {
                            PreForm.currentResourceKey = boardName;
                            firstItem = false;
                        }
                    }
                    base.Visible = true;
                    isLoadCompleate = true;
                    base.Focus();
                    base.Activate();
                }
            }
        }

Мы видим что тут у нас идет не маленький кусок кода и в самом начале "Идет инициализация программы...". О чем это говорит если посмотреть полностью кусок кода? О том что перед стартом основной формы программы, нам загружается PreForm и уже в ней начинаются разные манипуляции в виде проверок файла лицензии. Сами проверки идут в виде флагов. То есть if (если) (!flag) какое то условие не соответствует или возникло исключение. Конструкция защиты не такая сложная как кажется на первый взгляд, просто начинающему человеку может показаться это все дело запутанным, держать строй и спокойствие! ;). Не нужно опускать руки по пустякам а нужно включить логику :cool:.

Antiplag-5.jpg


Antiplag-6.jpg


Из километрового кода o_O ;) в функции PreForm() сразу становится понятно что далее не нужно бегать а править код именно тут. Но что за что отвечает и как быть?. В предыдущих статьях я всегда говорил что ? - нужно думать логически а не просто наугад ковырять код. Так вот давайте посмотрим, еще раз на то что у нас загружается при запуске программы:

Antiplag-7.jpg


Изначально у нас запускается PreForm, то есть Application.Run(new PreForm()) и внутри её идут разные проверки в виде флагов как я выше говорил.
А если обратить внимание на Form1 (Палец вверх на картинке) то тут становится интересно. Что именно ? А теперь ВНИМАНИЕ - это это у нас и есть форма что должна запускаться если ключ активации у программы верный. Почему я так уверен, ну если даже посмотреть на кнопку Обработать основной формы программы то она принадлежит Form1.

Antiplag-8.jpg


Давайте подумаем ?, а если мы просто возьмем и поменяем приоритеты при загрузке форм. Форму с активацией вообще исключим из жизни программы, то есть просто заменим Application.Run(new PreForm()); на Application.Run(new Form1()); и после запустим программу и посмотрим что получилось. А что, проанализировав логику работы программы можно себе многое позволить.

Как это сделать ? очень просто, вот наглядный пример в Gif Анимации. Думаю особо сложного ничего нет, делов то на 10 секунд а вот польза какая :cool:.

Primer1.gif


После этого сохраняем изменения в исполняемый файл. И давайте же посмотрим как поведен наша программа себя после такого минимального, хирургического вмешательства в структуру кода. Запускаем программу и ?

О чудо :))
программа запустилась, окна с проверкой лицензии исчезли, пациент запускается и чуствует себя хорошо после микро-операции :). И можно было сказать на этом все. Но нет же, самое интересное еще впереди !, так что читаем статью далее и не пропускаем ничего!.

Давайте же проверим нашу программу в действии и попробуем сделать уникальным какой ни будь кусочек текста и посмотрим действительности наша программа так хороша и не соврал ли нам разработчик о чудо алгоритме программы, которому нет аналогов ?.

Для теста я написал вот такой текст (как на картинке) и обработал его программой. Заметно что текст после обработки программой изменился. Про качество перевода и
этот, в кавычках, уникальный алгоритм работы программы, поговорим ниже.

Antiplag-9.jpg

Хорошо, значит софт работает но есть один вопрос, который меня до сих пор волнует :). Программа использует свой словарь или же обращается к сайту разработчика и туда делает запрос и получает ответ ?. Давайте это выясним, что бы уже разобраться до конца и развеять все сомнения.

Если у программы свой словарь то он как минимум должен быть расположен возле самой программы и весить не мало, не один Гигабайт так точно. А поскольку установочный файл программы весит всего то 112 мегабайт то значит остается одно - скорее всего программа стучится на сайт разработчика и от туда черпает информацию для перевода.

Давайте это проверим и в этом нам поможет программа HTTP Analyzer - это софт что может проводить мониторинг HTTP и HTTPS трафика, причем в режиме реального времени. Ну что же поехали, давайте посмотрим что программа отправляет в сеть и что получает. Порядок действий таков:

  1. Сначала запускаем HTTP Analyzer и нажимаем в панели управления кнопку Start.
  2. И только после этого запускаем наш чудо-софт Antiplagiat Killer, вводим туда текст и нажимаем кнопку Обработать.

И что же МЫ ВИДИМ - ОБРАТИТЕ ВНИМАНИЕ!: :) Никакого обращения к сайту разработчика нет, никакого словаря нет. А просто обращения программы к Яндекс переводчику и перевод текста сначала с Русского на Турецкий а Потом наоборот с Турецкого на Русский.

А вот Вам разбор (Подробный от меня ;)) этого всего стыда :)

1. Тут показано что программа отправляет запрос на translate.yandex с текстом на Русском.
Antiplag-10.jpg


2. А вот тут мы видим что она получает в ответ, то есть уже переведенный текст с Русского на Турецкий.

Antiplag-11.jpg


3. Далее программа снова делает запрос на translate.yandex но уже с текстом на Турецком.

Antiplag-12.jpg


И в финале получает ответ, уже переведенный текст обратно то есть с Турецкого на Русский.

Antiplag-13.jpg

ВОТ ВАМ КАКОЕ РАЗОЧАРОВАНИЕ и СТЫД РАЗРАБОТЧИКУ. Который говорил что его софт не имеет аналогов, уже понятно каких :D. А еще он продает этот же софт за 7000 рублей, это же вообще возмутительно. o_O

Ну давайте уже в крышку гроба программы вобьем последние гвозди :cool:, что бы уже наверняка показать весь этот стыд и уже на 1000% убедится что я не вру и ничего не придумал ;). Поиском по основной форме программы Form1 (ищем translate.yandex) и в результате попадаем на функцию что отвечает за перевод текста с Русского на Турецкий и потом наоборот.

Antiplag-14.jpg


С таким же успехом можно сделать проще и бесплатно :) просто зайти в переводчик Yandex и сначала перевести с Русского на Турецкий.

Antiplag-15.jpg


а потом наоборот, понимаете о чем я ? :D

Antiplag-16.jpg


Сравните результаты преобразования текста в самой программе и в Яндекс переводчике и я уверяю Вас что разницу Вы не найдете. :cool:

Но и перед тем как подвести итоги добавим копирайт Форума xss.pro в название главной формы программы. Поиском по Form1 (ищем Antiplagiat), находим. Нажимаем правую кнопку мышки и выбираем изменить метод и добавляем копирайт. В моем случае я добавил свое авторство и смотрится вот так.

Antiplag-17.jpg


Сохраняем и запускаем программу и смотрим что получилось. А получилось так как и в предыдущих статьях, все то что и мы планировали.

Antiplag-18.jpg

Ну а теперь уже подведем итоги :cool:.
Мы рассмотрели очередную защиту программы, принцип защиты был построен категорически неправильно и не грамотно. Я показал всякие логические штуки и надеюсь Вам понравилось ;), старался подавать текст максимально просто и без нагрузки мозга. Про то что разработчик на мыльном пузере решил подзаработать Вы узнали и теперь понимаете что всегда нужно присматриваться к софту а то можно купить и кота в мешке :cool: не зная про это. Хорошего настроения и приятного рабочего времени!

Что в архиве, скриншот:
pc.jpg


Наш пациент (Antiplagiat Killer) / virustotal:
https://www.virustotal.com/gui/file/577cd657eb68f3d80300355c59798fdf62c58ffc54c8b2e6ed7df6513f31dd8f
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
dnSpy x64 / virustotal: https://www.virustotal.com/gui/file/cc15f3f7836f5c976e058aabdd55af8635b484a6b9a5e94a2cb048856965f9e2
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd

Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 

Вложения

  • Ant-5.jpg
    Ant-5.jpg
    93.4 КБ · Просмотры: 16
  • Antiplag-17.jpg
    Antiplag-17.jpg
    168.6 КБ · Просмотры: 16
Пишешь интересно) только в след статьях, сделай пожалуйста по-меньше разноцветных букв всех мастей (имхо) глаза взрываются от буйства цветов;(
 
Написана статья просто и непринуждённо, вполне зашла, но есть несколько нюансов. Первым чередом идёт пёстрость текста, у меня стоит тёмная тема, там вообще нечитаемо, плюсом идёт куча смайликов. Уйма стрелочек, выделяй, пожалуйста, только самое главное, то, про что идёт речь далее. И последнее - грамотность, пунктуация и орфография прихрамывают. Я пишу это не радт хейта, а для будущего усовершенствования, не судите строго)
 
Интересное исследование. В будущем проверяй орфографию и пунктуацию, чтобы было проще читать текст. Также советую вместо желтого текста использовать какой нибудь другой цвет, так как на белой теме он сложно читается. Искренне желаю тебе успехов и творческого вдохновения, продолжай писать!✊🔥
 
Видел программу в сети и думал что реально такое возможно и разработка чего то крутого но нет же просто переводчик янд. За статью спасибище огромнейшее бро. Приятно читать такое и что есть такие люди как ты. Ресспектик тебе за материал.
 
Всем доброго времени суток, сегодня представляю очень интересный образец, экспонат, так сказать - софта. Почему я так говорю и выделяю этот софт,
узнаете, прочитав статью до конца. Советую Вам это сделать так как будет интересно так точно.

Все началось с того что я искал интересный программный образец для будущей статьи и наткнулся в сети на программу под названием Antiplagiat Killer,
понимаете какое название у программы :). Разработчик программы утверждает, на своем сайте https://анти-антиплагиат.рф/blog/programma-dlya-kopirajtinga-2020-skachat-besplatno, что аналогов его детищу НЕТ и Точка!

Кстати, программу рассматриваю актуальной версии, та что сейчас доступна на сайте разработчика. В процессе анализа сможете сами проверить и убедится .

Посмотреть вложение 50026


Ну слушайте, утверждая такое, нужно как минимум иметь весомые причины, может это какой то искусственный интеллект ?. Я к таким словам всегда отношусь скептически и в первую очередь, если софт есть на руках, обязательно его начну смотреть изнутри. Верить в гадалок, чудо или что то сверхъестественное это не мое, не дано мне это в жизни ;) .

А теперь начинается самое интересное, а мы даже еще не приступили к анализу программы. Ну я подумал, минут 15 от силы, и сам себе задал несколько вопросов. Первое, что чуда не бывает в 99% случаях и скорее всего у программы имеется своя база синонимов, или же база словосочетаний. И софт работает по такому принципу что берет фразы или слова из этой базы и подставляет в текст. Вот это скорее всего логичней ;). И второе база данных (или же словарь) может быть расположен или возле программы или же напрямую берется с сайта (сервера) разработчика.

В итоге, надумал, просто автору (Разработчику программы) отписать и задать ему парочку вопросов. Ну чисто по человечески что он ответит, было сначала интересно. Тем более что на сайте этого же разработчика говорится что они предоставляют программу на тест, на сутки - Бесплатно. И тут внимание, как только я спросил у разработчика по какому принципу работает программа то разработчик быстренька пошел в откат и сказал что по собственному алгоритму. А когда спросил за тест, так он ответил что тест платный (999 рублей), минуточку :cool: но на сайте указано же что даете тест бесплатно на сутки. И у меня сложилось впечатление что меня пытаются (и не только меня) а и большинство людей ввести в ЗАБЛУЖДЕНИЕ.

Переписка на официальном сайте программы (с разработчиком) там все и так предельно понятно что он и суппорт и разработчик в одном лице.


Вывод ? Что то не чисто тут, скорее всего есть (как всегда) не один подводный камень. Что написано ВЫШЕ я не спроста огласил, все взаимосвязано.
А теперь давайте же приступим к анализу программы.

Для начала давайте запустим программу и посмотрим визуально на принцип активации программы. И уже от этого будем отталкиваться, анализируя защиту софта.

Запускаем программу и смотрим что у нас происходят за чудеса при запуске o_O:smile10:. Тут все просто, загружается некая форма активации и далее идет проверка
какого то там файла с колючем активации
, пока что предельно все понятно. И если этого файла нет то программа просто не запускается, а отсылает нас - обратится к
разработчику программы ;). Как бы не так.

Это все то что изначально, нам, удалось выяснить. Уже неплохо и Мы хотя бы визуально понимаем как происходит активации программы ;). Ну а теперь, как обычно, давайте посмотрим что за информацию о исполняемом файле AntiplagiatT.exe (наш пациент) покажет утилита ExeInfo PE. Перетаскиваем исполняемый файл AntiplagiatT.exe на форму утилиты ExeInfo PE.

А видим мы вот такую картину
  1. Имя исполняемого файла, в нашем случае: AntiplagiatT.exe
  2. Разрядность: утилита определила что это 32 разрядное (32-битное) приложение Windows.
  3. Язык программирования и есть ли упаковка (сжатие), защита на программе: Язык программирования С# \ а вот защиты нет, упаковки или обфускации кода.
  4. Ну и последний пункт: В роли отладчика нам рекомендуют использовать Net Reflector, версии 11. А как по мне так DnSpy будет.

Отлично, информацию собрали, подготовились, приступаем к просмотру внутренностей программы . Запускаем отладчик DnSpy x32 (так как мы выяснили, выше, что наш пациент это 32-битное приложения) и закидываем туда исполняемый файл программы, в нашем случае это AntiplagiatT.exe.


И сразу же переходим к точке входа программы , адресу с которого начинается выполнения программы (инициализация функций, процедур).
Для этого нажимаем правой кнопкой мышки в отладчике по нашему файлу и выбираем, в меню, перейти к точке входа.

Посмотреть вложение 50035


И начинаем смотреть что тут у нас происходит. Поскольку, выше, мы уже знаем что при запуске программа проверяет некий файл лицензии и если его нет то просто не запускается то посмотрев на код мы видим что LoadLicence уже само собой понятно за что отвечает ?, загрузка лицензии, правильно.

Но тут не спешите, давайте разложим все по винтикам. Немного ниже мы видим запуск, загрузку некой формы Application.Run(new PreForm());. Давайте кликнем по ней левой кнопкой мышки и посмотрим что там происходит внутри.
Посмотреть вложение 50036

PreForm() вот кусок кода. :cool:
C#:
public PreForm()
        {
            base.Visible = false;
            bool isLoadCompleate = false;
            ThreadPool.QueueUserWorkItem(delegate(object state)
            {
                bool flag8 = PreForm.loader != null;
                if (flag8)
                {
                    this.CloseFormLoader();
                }
                Guid id = Guid.NewGuid();
                PreForm.loader = new Loader("Antiplagiat v" + Assembly.GetExecutingAssembly().GetName().Version.ToString(), "Идет инициализация программы...", id);
                PreForm.loader.Show();
                while (!isLoadCompleate)
                {
                    Application.DoEvents();
                    Thread.Sleep(100);
                }
                bool flag9 = PreForm.loader.Id == id;
                if (flag9)
                {
                    this.CloseFormLoader();
                }
            });
            this.InitializeComponent();
            IEnumerable<string> ligins = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains("BoardShowCaseLogin"));
            bool firstItem = true;
            foreach (string item in ligins)
            {
                string[] value = ConfigurationManager.AppSettings.GetValues(item);
                string _boardName = item.Replace("BoardRegister", "").Replace("BoardShowCaseLogin", "").Replace("[", "")
                    .Replace("]", "");
                ServerProvider licenseProvider = new ServerProvider();
                string ProcessorId = PreForm.GetProcessorId();
                string motherId = PreForm.GetMotherId();
                string computerId = ProcessorId + "|" + motherId;
                string boardToken = null;
                string boardShowCaseLogin = null;
                Dictionary<string, string> resources = new Dictionary<string, string>();
                string[] ar = item.Split(new char[] { ']' });
                ar[1] = ar[1].Replace("[", "").Replace("]", "");
                string boardName = ar[0].Replace("BoardShowCaseLogin", "").Replace("[", "").Replace("]", "");
                bool flag = ar.Length > 2;
                if (flag)
                {
                    bool flag2 = item == ar[1];
                    if (flag2)
                    {
                        boardShowCaseLogin = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardShowCaseLogin[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardShowCaseLoginValue = ConfigurationManager.AppSettings[boardShowCaseLogin];
                        string boardShowCasePassword = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardShowCasePassword[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardShowCasePasswordValue = ConfigurationManager.AppSettings[boardShowCasePassword];
                        boardToken = ConfigurationManager.AppSettings.AllKeys.Where((string p) => p.Contains(string.Concat(new string[]
                        {
                            "BoardToken[",
                            boardName,
                            "][",
                            ar[1],
                            "]"
                        }))).FirstOrDefault<string>();
                        string boardTokenValue = ConfigurationManager.AppSettings[boardToken];
                    }
                }
                else
                {
                    boardToken = ConfigurationManager.AppSettings[string.Format("BoardToken[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperToken"];
                    boardShowCaseLogin = ConfigurationManager.AppSettings[string.Format("BoardShowCaseLogin[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperShowCaseLogin"];
                    string text = ConfigurationManager.AppSettings[string.Format("BoardShowCasePassword[{0}]", boardName)] ?? ConfigurationManager.AppSettings["BoardSuperShowCasePassword"];
                }
                string rucapthakey = string.Empty;
                try
                {
                    bool flag3 = licenseProvider.OpenBoardRegisterSession(boardToken, computerId);
                    if (!flag3)
                    {
                        throw new Exception("Ваша лицензия не позволяет работать с ресурсом " + item + " или отсутствует интернет соединение.");
                    }
                    CheckAllowPublichAdResponse checkResult = licenseProvider.CheckAccessToBoard(boardShowCaseLogin, boardName);
                    bool flag4 = checkResult.State == RequestState.OK;
                    if (!flag4)
                    {
                        throw new Exception("Ваша лицензия не позволяет работать с ресурсом " + item + " или отсутствует интернет соединение.");
                    }
                    PreForm.dicResourcesData.Add(boardName, new PreForm.resourceData(checkResult.SiteLogin, checkResult.SitePassword, new PreForm.resourceProxyData(checkResult.ProxyIp, Convert.ToInt32(checkResult.ProxyPort), checkResult.ProxyLogin, checkResult.ProxyPassword)));
                }
                catch (Exception ex)
                {
                    Exception ex3;
                    Exception ex2 = ex3;
                    Exception ex = ex2;
                    base.Visible = false;
                    isLoadCompleate = true;
                    Program.isError = true;
                    ThreadPool.QueueUserWorkItem(delegate(object state)
                    {
                        MessageBox.Show(ex.Message + ", для продолжения работы, пожалуйста обратитесь на \r\nE-mail: support@antiplagiat-killer.com и перезагрузите файл лицензии.", "Ошибка лицензирования продукта", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    });
                    new LoadLicence
                    {
                        TopMost = true
                    }.ShowDialog();
                    base.Close();
                    break;
                }
                bool flag5 = !Program.isError;
                if (flag5)
                {
                    this.Text = this.Text + ": " + value[0];
                    bool flag6 = ligins.Count<string>() == 1;
                    if (flag6)
                    {
                        bool flag7 = firstItem;
                        if (flag7)
                        {
                            PreForm.currentResourceKey = boardName;
                            firstItem = false;
                        }
                    }
                    base.Visible = true;
                    isLoadCompleate = true;
                    base.Focus();
                    base.Activate();
                }
            }
        }

Мы видим что тут у нас идет не маленький кусок кода и в самом начале "Идет инициализация программы...". О чем это говорит если посмотреть полностью кусок кода? О том что перед стартом основной формы программы, нам загружается PreForm и уже в ней начинаются разные манипуляции в виде проверок файла лицензии. Сами проверки идут в виде флагов. То есть if (если) (!flag) какое то условие не соответствует или возникло исключение. Конструкция защиты не такая сложная как кажется на первый взгляд, просто начинающему человеку может показаться это все дело запутанным, держать строй и спокойствие! ;). Не нужно опускать руки по пустякам а нужно включить логику :cool:.

Посмотреть вложение 50038

Посмотреть вложение 50039

Из километрового кода o_O ;) в функции PreForm() сразу становится понятно что далее не нужно бегать а править код именно тут. Но что за что отвечает и как быть?. В предыдущих статьях я всегда говорил что ? - нужно думать логически а не просто наугад ковырять код. Так вот давайте посмотрим, еще раз на то что у нас загружается при запуске программы:

Посмотреть вложение 50040

Изначально у нас запускается PreForm, то есть Application.Run(new PreForm()) и внутри её идут разные проверки в виде флагов как я выше говорил.
А если обратить внимание на Form1 (Палец вверх на картинке) то тут становится интересно. Что именно ? А теперь ВНИМАНИЕ - это это у нас и есть форма что должна запускаться если ключ активации у программы верный. Почему я так уверен, ну если даже посмотреть на кнопку Обработать основной формы программы то она принадлежит Form1.

Посмотреть вложение 50042

Давайте подумаем ?, а если мы просто возьмем и поменяем приоритеты при загрузке форм. Форму с активацией вообще исключим из жизни программы, то есть просто заменим Application.Run(new PreForm()); на Application.Run(new Form1()); и после запустим программу и посмотрим что получилось. А что, проанализировав логику работы программы можно себе многое позволить.

Как это сделать ? очень просто, вот наглядный пример в Gif Анимации. Думаю особо сложного ничего нет, делов то на 10 секунд а вот польза какая :cool:.

Посмотреть вложение 50043

После этого сохраняем изменения в исполняемый файл. И давайте же посмотрим как поведен наша программа себя после такого минимального, хирургического вмешательства в структуру кода. Запускаем программу и ?

О чудо :))
программа запустилась, окна с проверкой лицензии исчезли, пациент запускается и чуствует себя хорошо после микро-операции :). И можно было сказать на этом все. Но нет же, самое интересное еще впереди !, так что читаем статью далее и не пропускаем ничего!.

Давайте же проверим нашу программу в действии и попробуем сделать уникальным какой ни будь кусочек текста и посмотрим действительности наша программа так хороша и не соврал ли нам разработчик о чудо алгоритме программы, которому нет аналогов ?.

Для теста я написал вот такой текст (как на картинке) и обработал его программой. Заметно что текст после обработки программой изменился. Про качество перевода и
этот, в кавычках, уникальный алгоритм работы программы, поговорим ниже.

Хорошо, значит софт работает но есть один вопрос, который меня до сих пор волнует :). Программа использует свой словарь или же обращается к сайту разработчика и туда делает запрос и получает ответ ?. Давайте это выясним, что бы уже разобраться до конца и развеять все сомнения.

Если у программы свой словарь то он как минимум должен быть расположен возле самой программы и весить не мало, не один Гигабайт так точно. А поскольку установочный файл программы весит всего то 112 мегабайт то значит остается одно - скорее всего программа стучится на сайт разработчика и от туда черпает информацию для перевода.

Давайте это проверим и в этом нам поможет программа HTTP Analyzer - это софт что может проводить мониторинг HTTP и HTTPS трафика, причем в режиме реального времени. Ну что же поехали, давайте посмотрим что программа отправляет в сеть и что получает. Порядок действий таков:

  1. Сначала запускаем HTTP Analyzer и нажимаем в панели управления кнопку Start.
  2. И только после этого запускаем наш чудо-софт Antiplagiat Killer, вводим туда текст и нажимаем кнопку Обработать.

И что же МЫ ВИДИМ - ОБРАТИТЕ ВНИМАНИЕ!: :) Никакого обращения к сайту разработчика нет, никакого словаря нет. А просто обращения программы к Яндекс переводчику и перевод текста сначала с Русского на Турецкий а Потом наоборот с Турецкого на Русский.

А вот Вам разбор (Подробный от меня ;)) этого всего стыда :)

1. Тут показано что программа отправляет запрос на translate.yandex с текстом на Русском.
Посмотреть вложение 50045

2. А вот тут мы видим что она получает в ответ, то есть уже переведенный текст с Русского на Турецкий.

Посмотреть вложение 50046

3. Далее программа снова делает запрос на translate.yandex но уже с текстом на Турецком.

Посмотреть вложение 50047

И в финале получает ответ, уже переведенный текст обратно то есть с Турецкого на Русский.

Посмотреть вложение 50048

ВОТ ВАМ КАКОЕ РАЗОЧАРОВАНИЕ и СТЫД РАЗРАБОТЧИКУ. Который говорил что его софт не имеет аналогов, уже понятно каких :D. А еще он продает этот же софт за 7000 рублей, это же вообще возмутительно. o_O

Ну давайте уже в крышку гроба программы вобьем последние гвозди :cool:, что бы уже наверняка показать весь этот стыд и уже на 1000% убедится что я не вру и ничего не придумал ;). Поиском по основной форме программы Form1 (ищем translate.yandex) и в результате попадаем на функцию что отвечает за перевод текста с Русского на Турецкий и потом наоборот.

Посмотреть вложение 50049

С таким же успехом можно сделать проще и бесплатно :) просто зайти в переводчик Yandex и сначала перевести с Русского на Турецкий.

Посмотреть вложение 50050

а потом наоборот, понимаете о чем я ? :D

Посмотреть вложение 50052

Сравните результаты преобразования текста в самой программе и в Яндекс переводчике и я уверяю Вас что разницу Вы не найдете. :cool:

Но и перед тем как подвести итоги добавим копирайт Форума xss.pro в название главной формы программы. Поиском по Form1 (ищем Antiplagiat), находим. Нажимаем правую кнопку мышки и выбираем изменить метод и добавляем копирайт. В моем случае я добавил свое авторство и смотрится вот так.

Посмотреть вложение 50053

Сохраняем и запускаем программу и смотрим что получилось. А получилось так как и в предыдущих статьях, все то что и мы планировали.

Ну а теперь уже подведем итоги :cool:.
Мы рассмотрели очередную защиту программы, принцип защиты был построен категорически неправильно и не грамотно. Я показал всякие логические штуки и надеюсь Вам понравилось ;), старался подавать текст максимально просто и без нагрузки мозга. Про то что разработчик на мыльном пузере решил подзаработать Вы узнали и теперь понимаете что всегда нужно присматриваться к софту а то можно купить и кота в мешке :cool: не зная про это. Хорошего настроения и приятного рабочего времени!

Что в архиве, скриншот:
Посмотреть вложение 50056


Наш пациент (Antiplagiat Killer) / virustotal:
https://www.virustotal.com/gui/file/577cd657eb68f3d80300355c59798fdf62c58ffc54c8b2e6ed7df6513f31dd8f
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
dnSpy x64 / virustotal: https://www.virustotal.com/gui/file/cc15f3f7836f5c976e058aabdd55af8635b484a6b9a5e94a2cb048856965f9e2
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd

Файлы к статье:
Скрытое содержимое​
У меня к тебе просьба не пиши РАЗНЫМИ ЦВЕТАМИ ГЛАЗА ВЫЕДАЕТ
 
Пишешь интересно) только в след статьях, сделай пожалуйста по-меньше разноцветных букв всех мастей (имхо) глаза взрываются от буйства цветов;(
На темной теме фиолетовых букв вообще не видно, приходится выделять их.
По сабжу:
интересное разоблачение получилось, тоже думал, что там какой-то словарь есть, а оказалось, что этот словарь у яндекса)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх