узнаете, прочитав статью до конца. Советую Вам это сделать так как будет интересно так точно.
Все началось с того что я искал интересный программный образец для будущей статьи и наткнулся в сети на программу под названием Antiplagiat Killer,
понимаете какое название у программы
Кстати, программу рассматриваю актуальной версии, та что сейчас доступна на сайте разработчика. В процессе анализа сможете сами проверить и убедится .
Ну слушайте, утверждая такое, нужно как минимум иметь весомые причины, может это какой то искусственный интеллект ?. Я к таким словам всегда отношусь скептически и в первую очередь, если софт есть на руках, обязательно его начну смотреть изнутри. Верить в гадалок, чудо или что то сверхъестественное это не мое, не дано мне это в жизни
А теперь начинается самое интересное, а мы даже еще не приступили к анализу программы. Ну я подумал, минут 15 от силы, и сам себе задал несколько вопросов. Первое, что чуда не бывает в 99% случаях и скорее всего у программы имеется своя база синонимов, или же база словосочетаний. И софт работает по такому принципу что берет фразы или слова из этой базы и подставляет в текст. Вот это скорее всего логичней
В итоге, надумал, просто автору (Разработчику программы) отписать и задать ему парочку вопросов. Ну чисто по человечески что он ответит, было сначала интересно. Тем более что на сайте этого же разработчика говорится что они предоставляют программу на тест, на сутки - Бесплатно. И тут внимание, как только я спросил у разработчика по какому принципу работает программа то разработчик быстренька пошел в откат и сказал что по собственному алгоритму. А когда спросил за тест, так он ответил что тест платный (999 рублей), минуточку
Переписка на официальном сайте программы (с разработчиком) там все и так предельно понятно что он и суппорт и разработчик в одном лице.
Ну ок если я что то попутал то ничего, сделаем вид что я этого не заметил
Вывод ? Что то не чисто тут, скорее всего есть (как всегда) не один подводный камень. Что написано ВЫШЕ я не спроста огласил, все взаимосвязано.
А теперь давайте же приступим к анализу программы.
Для начала давайте запустим программу и посмотрим визуально на принцип активации программы. И уже от этого будем отталкиваться, анализируя защиту софта.
Запускаем программу и смотрим что у нас происходят за чудеса при запуске
. Тут все просто, загружается некая форма активации и далее идет проверкакакого то там файла с колючем активации, пока что предельно все понятно. И если этого файла нет то программа просто не запускается, а отсылает нас - обратится к
разработчику программы
- Имя исполняемого файла, в нашем случае: AntiplagiatT.exe
- Разрядность: утилита определила что это 32 разрядное (32-битное) приложение Windows.
- Язык программирования и есть ли упаковка (сжатие), защита на программе: Язык программирования С# \ а вот защиты нет, упаковки или обфускации кода.
- Ну и последний пункт: В роли отладчика нам рекомендуют использовать Net Reflector, версии 11. А как по мне так DnSpy будет.
Отлично, информацию собрали, подготовились, приступаем к просмотру внутренностей программы . Запускаем отладчик DnSpy x32 (так как мы выяснили, выше, что наш пациент это 32-битное приложения) и закидываем туда исполняемый файл программы, в нашем случае это AntiplagiatT.exe.
И сразу же переходим к точке входа программы , адресу с которого начинается выполнения программы (инициализация функций, процедур). Для этого нажимаем правой кнопкой мышки в отладчике по нашему файлу и выбираем, в меню, перейти к точке входа.
И начинаем смотреть что тут у нас происходит. Поскольку, выше, мы уже знаем что при запуске программа проверяет некий файл лицензии и если его нет то просто не запускается то посмотрев на код мы видим что LoadLicence уже само собой понятно за что отвечает ?, загрузка лицензии, правильно.
Но тут не спешите, давайте разложим все по винтикам. Немного ниже мы видим запуск, загрузку некой формы Application.Run(new PreForm());. Давайте кликнем по ней левой кнопкой мышки и посмотрим что там происходит внутри.
PreForm() вот кусок кода.
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) какое то условие не соответствует или возникло исключение. Конструкция защиты не такая сложная как кажется на первый взгляд, просто начинающему человеку может показаться это все дело запутанным, держать строй и спокойствие!
Из километрового кода
Изначально у нас запускается PreForm, то есть Application.Run(new PreForm()) и внутри её идут разные проверки в виде флагов как я выше говорил.
А если обратить внимание на Form1 (Палец вверх на картинке) то тут становится интересно. Что именно ? А теперь ВНИМАНИЕ - это это у нас и есть форма что должна запускаться если ключ активации у программы верный. Почему я так уверен, ну если даже посмотреть на кнопку Обработать основной формы программы то она принадлежит Form1.
Давайте подумаем ?, а если мы просто возьмем и поменяем приоритеты при загрузке форм. Форму с активацией вообще исключим из жизни программы, то есть просто заменим Application.Run(new PreForm()); на Application.Run(new Form1()); и после запустим программу и посмотрим что получилось. А что, проанализировав логику работы программы можно себе многое позволить.
Как это сделать ? очень просто, вот наглядный пример в Gif Анимации. Думаю особо сложного ничего нет, делов то на 10 секунд а вот польза какая
После этого сохраняем изменения в исполняемый файл. И давайте же посмотрим как поведен наша программа себя после такого минимального, хирургического вмешательства в структуру кода. Запускаем программу и ?
О чудо
Давайте же проверим нашу программу в действии и попробуем сделать уникальным какой ни будь кусочек текста и посмотрим действительности наша программа так хороша и не соврал ли нам разработчик о чудо алгоритме программы, которому нет аналогов ?.
Для теста я написал вот такой текст (как на картинке) и обработал его программой. Заметно что текст после обработки программой изменился. Про качество перевода и
этот, в кавычках, уникальный алгоритм работы программы, поговорим ниже.
Если у программы свой словарь то он как минимум должен быть расположен возле самой программы и весить не мало, не один Гигабайт так точно. А поскольку установочный файл программы весит всего то 112 мегабайт то значит остается одно - скорее всего программа стучится на сайт разработчика и от туда черпает информацию для перевода.
Давайте это проверим и в этом нам поможет программа HTTP Analyzer - это софт что может проводить мониторинг HTTP и HTTPS трафика, причем в режиме реального времени. Ну что же поехали, давайте посмотрим что программа отправляет в сеть и что получает. Порядок действий таков:
- Сначала запускаем HTTP Analyzer и нажимаем в панели управления кнопку Start.
- И только после этого запускаем наш чудо-софт Antiplagiat Killer, вводим туда текст и нажимаем кнопку Обработать.
И что же МЫ ВИДИМ - ОБРАТИТЕ ВНИМАНИЕ!:
А вот Вам разбор (Подробный от меня
) этого всего стыда 
1. Тут показано что программа отправляет запрос на translate.yandex с текстом на Русском.
1. Тут показано что программа отправляет запрос на translate.yandex с текстом на Русском.
2. А вот тут мы видим что она получает в ответ, то есть уже переведенный текст с Русского на Турецкий.
3. Далее программа снова делает запрос на translate.yandex но уже с текстом на Турецком.
И в финале получает ответ, уже переведенный текст обратно то есть с Турецкого на Русский.
ВОТ ВАМ КАКОЕ РАЗОЧАРОВАНИЕ и СТЫД РАЗРАБОТЧИКУ. Который говорил что его софт не имеет аналогов, уже понятно каких
Ну давайте уже в крышку гроба программы вобьем последние гвозди
С таким же успехом можно сделать проще и бесплатно
а потом наоборот, понимаете о чем я ?
Сравните результаты преобразования текста в самой программе и в Яндекс переводчике и я уверяю Вас что разницу Вы не найдете.
Но и перед тем как подвести итоги добавим копирайт Форума xss.pro в название главной формы программы. Поиском по Form1 (ищем Antiplagiat), находим. Нажимаем правую кнопку мышки и выбираем изменить метод и добавляем копирайт. В моем случае я добавил свое авторство и смотрится вот так.
Сохраняем и запускаем программу и смотрим что получилось. А получилось так как и в предыдущих статьях, все то что и мы планировали.
Мы рассмотрели очередную защиту программы, принцип защиты был построен категорически неправильно и не грамотно. Я показал всякие логические штуки и надеюсь Вам понравилось
Что в архиве, скриншот:
Наш пациент (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
Файлы к статье:
mega.nz
Наш пациент (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
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.

