Май 4

Можно ли взломать защиту от MQLLock?

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

Некоторые орлы пишут мне о том, что защиту на HASP SL (HL) взломать можно (хотя практические примеры взлома опускают), а вот MQLLock чудо, которое не ломается в принципе. С удовольствием бы стал пользоваться только им, отказавшись от ключей HASP, но… Посмотрим более подробно на существующую ситуацию, а она такова, что совершенно 100% надежной защиты в настоящее время нет. Можно использовать комбинацию защит для их взаимного усиления. О HASP рассказывал достаточно давно и подробно, рассказывал о MQLLock, но случай не появлялся проанализировать защиту MQLLock именно с позиции взломщика.

Несколько дней назад ко мне обратился человек со следующей проблемой. У человека есть индикатор честно им купленный. В лицензионном соглашении нет информации о том, что изменять код запрещено. Есть возможность прикрепить один вариант индикатора к реальному счету, другой к демо. Человеку потребовалось создать советник на основе индикатора. Замечу, что если в лицензии к программе ее создатель и распространитель забыл или не счел нужным оговорить, что программу нельзя декомпилировать, анализировать, выполнять обратный инжиниринг и т.д. и т.п., то он сам и виноват. Пользователь, купивший программу, может изменять ее для собственных нужд с целью улучшения скорости работы, проверки на наличие уязвимостей и т.д. и т.п. Вот если запрещено по соглашению, тогда да – нельзя. В общем, пришел запрос на анализ кода и два файла ex4 и dll. Защита, как уже догадались, MQLLock.
Что необходимо для успешного анализа.

Во-первых, наличие исходного mq4 файла или декомпилированного ex4 файла к виду исходного mq4. У меня декомпилятора ex4 к mq4 последней версии нет, но человек нашел решение и эта составляющая была решена. Типичная ошибка продавца ПО – не поставить в лицензию запрет на декомпиляцию!

Во-вторых, для анализа MQLLock необходимо наличие работающей на счете программы (индикатора, в данном случае). Почему, сейчас поясню. Приступаем к разбору кода.

#import «aiv123.dll» // Библиотека с функциями MQLLock
int MqlLock_50FFDED8_25_I1ii1iIII1(); // Функция 1
int MqlLock_50FFDED8_25_i11ii1iI1i(int a0); // Функция 2
double MqlLock_50FFDED8_25_iiI111IIIi(double a0, int a1); // Функция 3
void MqlLock_50FFDED8_25_11i1II1i1i(int a0, int a1); // Функция 4
….


Первая строка, подключение библиотеки с функциями. Все функции можно разделить на 4-ре группы. Функции первой группы – возвращают переменную и не имеют входных параметров. Функция 1 возвращает целое число (int), причем всегда одно и тоже! Ведь входного аргумента нет. Узнать какое – очень просто.
Для этого пишу такой код Comment(«MqlLock_50FFDED8_25_I1ii1iIII1()=”,MqlLock_50FFDED8_25_I1ii1iIII1()); Установили, что функция возвращает 0. Отлично. Функция вызывается в фрагменте
for (li_8 = MqlLock_50FFDED8_25_I1ii1iIII1(); li_8 < li_4; li_8++) {

Зная, что она всегда возвращает 0, обходимся без нее и получаем код:
for (li_8 = 0; li_8 < li_4; li_8++) {
С функцией группы 2 – сложнее. Если функция получает аргумент одного типа и возвращает точно такого, то, весьма вероятно, функция только для красоты. Вернее для привязки, чтобы без ее вызова было не обойтись, а для вызова нужна dll.
Li2=MqlLock_50FFDED8_25_i11ii1iI1i(li_3); Проведя анализ получили, что все в точности, как у ослика Иа, когда он опускал лопнувший шарик в горшочек со словами. Входит и выходит, входи и выходит! В общем, правим код до уровня Li2=li_3; и двигаемся к функциям третьей группы.

double MqlLock_50FFDED8_25_iiI111IIIi(double a0, int a1); - учитывая, что функции генерируются автоматически, то выбор результата не велик. Будет что-то из четырех вариантов

a0 + a1

или a0 – a1

или a0 / a1

или a0 * a1.

Надо вызвать функцию с известными аргументами и посмотреть результат. Первый аргумент 2 второй 3, функция вернул 5. Как Вы думаете, какую операцию она реализует?

Функции 4-й группы, которые с . void. Они ничего не возвращают и работают только на закачку информации в DLL. В общем, о функциях, которые имеют непосредственное отношение к собственно к защите я ничего рассказывать не буду, так как не ставлю задачу разделать систему защиты под орех. Чужой бизнес, авторские права и все такое прочее. В общем, эти функции непосредственно к восстанавливаемому коду отношения не имеют.
Так взломать MQLLock просто? Увы, возможно, но при наличии свободного времени, исходника и работающей программы. Есть несколько неприятных моментов. Как проанализировать вот такой фрагмент
if (MqlLock_50FFDED8_25_111i1i1ii1(g_ibuf_104[li_8], gd_164, gd_132, li_8))
Только выполнив предположение, что может быть:
if (g_ibuf_104[li_8] < gd_164 – gd_132 ) if (g_ibuf_104[li_8] > gd_164 – gd_132 )
if (g_ibuf_104[li_8] < gd_164 + gd_132 ) if (g_ibuf_104[li_8] > gd_164 – gd_132 )
if (g_ibuf_104[li_8] + gd_164 > gd_132 )
if (g_ibuf_104[li_8] – gd_164 > gd_132 )
if (g_ibuf_104[li_8] + gd_164 < gd_132 )
if (g_ibuf_104[li_8] – gd_164 < gd_132 ) …

Практика показала, что правильный вариант первый
if (g_ibuf_104[li_8] < gd_164 – gd_132 )


Отмечу, что так как MQLLock слывет системой не ломаемой в принципе, то разработчики предусмотрели не так уж и много вариантов разнообразия. Замечу, что я не анализировал dll, мне было проще и удобнее посмотреть, что происходит, сравнимая поведение изменяемого кода с работой эталона. Естественно, что я иногда ошибался.

Шедевров в коде типа
gd_196 = MqlLock_50FFDED8_25_111I1I1I1i(
MqlLock_50FFDED8_25_iiI1iiIiI1((gd_140 – g_ibuf_104[li_8] – gd_164) / g_ibuf_104[li_8]), g_ibuf_104[li_8], gd_140, li_8, gd_164);

Которые с известным трудом приходилось преобразовывать к виду
gd_196 = MathCeil((gd_140 – g_ibuf_104[li_8] – gd_164) / g_ibuf_104[li_8]) + g_ibuf_104[li_8] + gd_140 – gd_164;
оказалось совсем не много, но это именно то, на чем может застрять “кодер обыкновенный”, готовый выполнять преобразования только по шаблону.
Итого, подводя итоги.
MQLLock – это один из вариантов защиты, но панацея, в чем еще раз убедился, передав человеку полностью восстановленный и очищенный от MQLLock код. MQLLock тупо проводит обфускацию, пользуясь формальными правилами. С учетом этого взломщик (ай, ай, ай! Ломать не хорошо!) может не менее тупо составить программу, которая значительно облегчит процесс взлома. Как вариант, нанять фрилансера сделать очевидные преобразования. Получается подготовительный этап дешево и сердито. Затем собственно взлом, который не будет архисложным если dll только от MQLLock, а если есть еще и собственно от разработчика, да еще и шифрована AES, а ключ в аппаратном HASP, а аппаратного ключа нет, то это уже из серии “приплыли тазики…”. Код я восстановил потратив на него примерно сутки, работа на 90% рутинная и на 10% творческая, но в сумме времени занимает до хрена. Поэтому, если продаете советник за баксов за 35, то человеку проще будет его купить, чем заказывать взлом MQLLock. Если ваш советник “отрывают с руками” хотя бы за $300, то не доверяйте только MQLLock и используйте его для усиления защиты, но не в качестве основной.
Вот собственно и все, что хотел сказать про MQLLock.

Успехов, удачи, всех благ!

Поделитесь статьей со своими друзьями
Общайтесь со мной:
comments: Closed

Comments are closed.