В этом посте несколько слов о защите торгового советника SHARK 7.0. Начну с того, что прочитать рекламу и полезную информационную можно на сайте разработчика http://www.forexeasystems.com/forex-expert-advisor-ea-shark/.

Стоит 269 USD. Советник показывает достаточно хорошую торговлю на счете http://www.forexeasystems.com/forex-expert-advisor-ea-shark/live-results, поэтому не удивительно, что есть желающие получить версию советника на халяву, то есть даром. На форуме http://pitforex.com/index.php?topic=1336.0 выложен декомпилированный вариант mq4, полученный из ex4. Посмотрим, насколько это облегчает жизнь взломщику, и сколько будет стоить взлом такой защиты. Если нет mq4, а есть ex4, то можно взять EX4-TO-MQ4 Decompiler 4.0.427 (последняя версия на 26.07.2012) стоит $799, но можно заказать только декомпил (Decompile of one file) $39.
Защита Shark 7.0 написана достаточно грамотно. Замечу, что программы для декомпилирования последней версии у меня нет, так же как нет и последней версии декомпилятора dll библиотек. С устаревшими версиями декомпиляторов декомпиляция не проходит. Если посмотреть вариант mq4, полученный из ex4, который был выложен на форуме, то можно выделить следующие моменты:
1. Большое число функций, в которые спрятан критически важный код


#import «Shark7.dll»
bool Init(int a0, int a1, string a2, …
void SynchronizeOrder(int a0, int a1,…
void Start(int a0, int a1, double a2, …
int GetOrderAction(int a0);
int GetActionalOrderTicket(int a0);
int GetActionalOrderType(int a0);
double GetActionalOrderNumLots(int a0);
double GetActionalOrderPrice(int a0);
double GetActionalOrderStopLoss(int a0);
double GetActionalOrderTakeProfit(int a0);
int SetExecutedOrderTicket(int a0, int a1);
void CompleteOrderAction(int a0, int a1);
void Stop(int a0);
bool HasMessage(int a0);
string GetMessage(int a0);
bool HasChartLabel(int a0);
string GetChartLabelText(int a0);
int GetChartLabelYDistance(int a0);
int GetChartLabelColorType(int a0);
void NextChartLabel(int a0);
void Deinit(int a0);
#import


2. Функция инициализации включает в себя большое число параметров.
Это не позволяет подобрать номер счета, так как необходимо подбирать не только номер счета AccountNumber(), но и информацию об аккаунте AccountName(). Конечно можно было накидать такой код (фрагмент на Delphi):

Form1: TForm1;
{ bool Init(int a0, int a1, string a2, int a3, string a4, int a5, int a6, double a7, int a8, double a9, double a10,

double a11, double a12, double a13, double a14, double a15, int a16);
gi_164 = Init(gi_152, AccountNumber(), AccountName(), MarketInfo(gs_144, MODE_DIGITS), gs_144, timeframe_0, IsTradeAllowed(), MaxSpread / 10000.0, MoneyManagement.Enabled,
MoneyManagement.RiskPerTrade, Order.Lots, MarketInfo(gs_144, MODE_LOTSIZE), MarketInfo(gs_144, MODE_LOTSTEP), MarketInfo(gs_144, MODE_MINLOT), MarketInfo(gs_144,
MODE_MAXLOT), MarketInfo(gs_144, MODE_STOPLEVEL) * MarketInfo(gs_144, MODE_POINT), g_bool_156); }
implementation
function Init(a0:integer;a1:integer;a2:string;a3:integer;a4:string;

a5:integer;a6:integer;a7:real;a8:integer;a9:real;

a10:real;a11:real;a12:real;a13:real;a14:real;a15:real;a16:integer): boolean;
external ‘Shark7.dll’;
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
Label l1;
var
n1,n2,nomer,reg:longint;
rez:boolean;
a0:integer;a1:integer;a2:string;a3:integer;
a4:string;a5:integer;a6:integer;
a7:real;a8:integer;a9:real;
a10:real;a11:real;a12:real;a13:real;
a14:real;a15:real;a16:integer;
begin
a0:=265002;
a1:=12345;
a2:=’Ivan Ivanoff’;
a3:=5;
a4:=’EURUSD’;
a5:=30;
a6:=1;
a7:=0.0001;
a8:=1;
a9:=0.005;
a10:=0.1;
a11:=100000;
a12:=0.01;
a13:=1000;
a14:=0;
a15:=0;
a16:=0;
nomer:=StrToInt(Edit3.Text);
n1:=StrToInt(Edit1.Text);
n2:=StrToInt(Edit2.Text);
label1.Caption:=’???’;
for reg:=n1 to n2 do
begin
rez:=Init(a0,reg,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);
if rez=true then begin
label1.Caption:=’Номер счета =’+IntToStr(reg);
Edit4.Text:=IntToStr(reg);
goto l1;
end;
end;
label1.Caption:=’Номер счета в диапазоне N1-N2 не найден’;
l1:;
end;


3. Однако код не только неэффективен, но и сразу получаем ошибку при обращении к библиотеке. Хотя подобный подход работал на ура для всяких там Граалей, Прогрессоров и прочих. Смотрите скриншот.


4. Еще один интересный момент. Откроем dll’ку в любом редакторе, пусть будет обычный блокнот, а не хаквью какой-то. Логично, что если советник торгует, то доступ к Интеренту есть, а раз есть… Не продолжаю дальше, так как не занимаюсь разделыванием защиты под орех, а указываю ее сильные стороны. Замечу, что все же можно было скрыть в библиотеке ссылку для скачивания новой версии, которая элементарно просматривается, как www.forexeasystems.com/shark-version При переходе видим Shark 7 0 2 http://www.forexeasystems.com/downloads/shark-7.0.2.9.msi

Подводим итоги. Так хороша защита или нет?
Защита хорошая, хотя и не обеспечивает того уровня, который можно достичь, используя аппаратные ключи HASP HL или программный HASP SL. Стоимость взлома защиты (трудоемкость) превосходит стоимость покупки программы. С этой позиции все сделано правильно. Можно ли взломать защиту и какой мог бы быть алгоритм взлома? Не буду останавливаться на самом очевидном, а, именно, полная декомпиляция dll и подробное ее изучение. Слишком дорого, трудоемко, длительно по времени. Более простой способ. Хакер покупает программу или кто-то добровольно передает ему информацию о номере счета и AccountName, который ему соответствует. Хакер правит обращения Init(gi_152, AccountNumber(), AccountName(), подставляя вместо них полученную информацию. Подстановка делается и далее в нужных местах. Должно работать. Отслеживается поведение программы, в частности, что она передает и как. Возможно, что создатели программы получают информацию о том, на каких компьютерах с какими IP она запущена, а валидность запуска программы проверяется на их сервере в сети Интернет. Согласитесь, что весьма странно, если программу продали одному пользователю, а работает сразу из многих мест. Реакция очевидна – выявить и заблокировать. Кто-то потеряет свои 269 USD. Что может сделать хакер при таком раскладе, если не хочет досконально прорывать dll? Что такое копировщик сделок все хорошо знают. Если есть возможность отслеживать сделки на уровне исходного кода mq4, то можно было сделать так, что модернизированная SHARK торгует на одном счете, для которого и была куплена с одного IP, но на все другие компьютеры раздается информация об открытии и закрытии ордеров. Решение плохое в том плане, что могут быть проблемы у всех, если зависнет главный сервер, раздающий сигналы.
На этом по обзору все. Замечу, что моей целью было посмотреть, как устроена защита и каковы ее сильные и слабые стороны. Не ставил своей целью взлом защиты, так как не планировал и не планирую использовать SHARK или продавать хакнутую программу. Изучение существующих защит использую для того, чтобы совершенствовать свою собственную.
В завершении поста полезная ссылка на ресурс сети Интернет. Она пригодится тем жителям Москвы и ее ближайших пригородов, для кого актуальна позиция: iPhone 4S замена стекла. Можно выполнить не только эту операцию, но другие связанные с ремонтом и обслуживанием iPhone 4S.

Ананченко Игорь Викторович Контактная информация Моб. телефон: +79213201586 ICQ: 361916132 Веб-сайт: http://anantchenko.ru E-mail: igor@anantchenko.ru Вконтакте: http://vkontakte.ru/id8574436 https://mcp.microsoft.com/authenticate/validatemcp.aspx Transcript ID 793398 and the Access Code 9213201586 Microsoft Certification Status: Microsoft Certified IT Professional, Microsoft Certified Technology Specialist, Microsoft Certified Desktop Support Technician, Microsoft Certified Professional, Microsoft Certified Trainer

1 comment

  1. Не могли бы вы поделиться mq4 файл после обучения шт акулы? спасибо

Comments are closed.