Какие могут быть цели и задачи работы, что несет в себе основная часть… Посмотрим все это, в то время, как дети смотрят Мультфильмы 2011 года онлайн . К сожалению, размещать посты в блоге у меня все больше получается на выходных. Если хочется позаниматься чем-то самому, то можно предложить дочкам посмотреть мультики и пока они смотрят, то… хотя, это и методически не правильно…
Итак, цели и задачи – одна страничка, впрочем, кто хочет поставить задачи не на курсовой, а на целую диссертацию, то с него столько и спроситься. Все остальным – соблюдайте чувство меры, ставя цели и задачи….
2. ЦЕЛИ И ЗАДАЧИ РАБОТЫ
Задача курсовой работы – получить практические навыки установки систем защиты, основанной на использовании программно-аппаратных средств. В качестве средства защиты используется программно-аппаратный комплекс защиты HASP SRM. Программное обеспечение HASP SRM Envelope используется для построения автоматической защиты готовых (exe и dll) приложений (в том числе .Net Framework 1.0 – 3.5 и разработанных на Java); HASP SRM Business Studio Server и HASP SRM Business Studio Application используются для работы с лицензиями и построения инфраструктуры продаж; HASP SRM Toolbox используется для работы с HASP SRM API. Комплекс средств защиты HASP SRM поддерживает возможность построения защиты программ на наиболее популярных языках программирования (С, С++, C#, Java, Delphi, Visual Basic, AutoCAD и т.д.).
Задачи работы:
1. Получить практические навыки установки навесной защиты exe и dll исполняемых файлов с использованием HASP SRM Envelope;
2. Рассмотреть уязвимости файлов формата ex4, актуальность защиты исполняемых файлов, выполняемых под управлением терминала MT4;
3. Получить практические навыки разработки dll библиотек, в которые переносится критически важный защищаемый программный код, отвечающий за работу приложения под управлением терминала MT4;
4. Выполнить защиту разработанной dll библиотеки с использованием HASP SRM Envelope
5. Создать защищенную версию приложения, работающего под управлением терминала MT4.
3. ОСНОВНАЯ ЧАСТЬ
Поставлена задача защитить приложение, выполняемое под управлением терминала МТ4. Приложение написано на языке MQL версии 4.0.
3.1 Структура защищаемой программы на языке MQL, выделение критически важного участка программного кода
Представленная для защиты программа работает под управлением терминала МТ4 и является программой-роботом, предназначенной для торговли на рынке Forex. Алгоритм работы программы в контексте выполнения данной работы не рассматривается, так как обсуждение алгоритма выходит за рамки поставленной задачи. Однако, для успешной реализации защиты необходимо знать, какой участок кода является критически важным и должен быть защищен от декомпиляции, то есть от анализа злоумышленником на предмет изучения алгоритма и разработки функционального аналога программы. Предполагается, что при защите реально используемой программы сотрудник, отвечающий за установку защиты, имеет достаточную квалификацию, чтобы самостоятельно выделить фрагменты исходного MQL кода, нуждающегося в защите, или информация об этих участках будет предоставлена сотруднику разработчиком программы, написанной на языке MQL.
Исходный код программы, подлежащей защите, следующий:
//+———————————————————————-+
//| Magistr.mq4 |
//| Copyright 2013, Igor V. Anantchenko |
//| https://www.mctrewards.ru |
//+———————————————————————-+
#property copyright » Copyright 2013, Igor V. Anantchenko»
#property link «https://www.mctrewards.ru»
int h,ii=0,flag=999;
extern int WavePeriod = 10;
extern int AvgPeriod = 21;
extern int SL = 137;
extern int TP = 97;
double buf1[];
double buf3[];
double buf2[];
double buf4[];
double buf5[];
double buf6[];
int pr1 = -50;
int pr2 = 53;
int pr3;
int pr4 = 000000;
int nBars;
int m;
double ind;
int init()
{
nBars=iBars(NULL,0);
ArrayResize(buf1, nBars);
ArrayResize(buf2, nBars);
ArrayResize(buf3, nBars);
ArrayResize(buf4, nBars);
ArrayResize(buf5, nBars);
ArrayResize(buf6, nBars);
return(0);
}
int start()
{
h=TimeHour(TimeCurrent());
if(flag==h)return(0);
nBars=iBars(«EURUSD»,0);
flag=h;
m=nBars;
for (int i = m; i > 0; i—)
{ buf2[i] = iMA(NULL, 0, WavePeriod, 0, MODE_EMA, PRICE_TYPICAL, i); ArraySetAsSeries(buf2, TRUE); }
for (i = m; i > 0; i—) { buf6[i] = MathAbs((iHigh(NULL, 0, i) + iClose(NULL, 0, i) + iLow(NULL, 0, i)) / 3.0 — buf2[i]);
ArraySetAsSeries(buf6, TRUE);
}
for (i = m; i > 0; i—) {
ind = iMAOnArray(buf6, 0, WavePeriod, 0, MODE_EMA, i);
buf4[i] = ind;
ArraySetAsSeries(buf4, TRUE);
}
for (i = m; i > 0; i—) {
if (buf4[i] > 0.0) buf5[i] = ((iHigh(NULL, 0, i) + iClose(NULL, 0, i) + iLow(NULL, 0, i)) / 3.0 — buf2[i]) / (0.015 * buf4[i]);
else buf5[i] = 0;
ArraySetAsSeries(buf5, TRUE);
}
for (i = m; i > 0; i—) {
ind = iMAOnArray(buf5, 0, AvgPeriod, 0, MODE_EMA, i);
buf1[i] = ind;
ArraySetAsSeries(buf1, TRUE);
}
for (i = m; i > 0; i—) {
ind = iMAOnArray(buf1, 0, 4, 0, MODE_SMA, i);
buf3[i] = ind;
ArraySetAsSeries(buf3, TRUE);
}
for (i = m; i > 0; i—) {
if (buf1[i] >= buf3[i] && buf1[i + 1] <= buf3[i + 1] && buf1[i] < pr1 && i==1) {
Print(«Час «,TimeHour(TimeCurrent()),» «,Day( ),»:»,Month( ),»:»,Year( ), » Время (час)=»,h,» Buy «);
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-SL*Point,Ask+TP*Point,»My order BUY»,16384,0,Green); }
if (buf1[i] <= buf3[i] && buf1[i + 1] >= buf3[i + 1] && buf1[i] > pr2 && i==1) {
Print(«Час «,TimeHour(TimeCurrent()),» «,Day( ),»:»,Month( ),»:»,Year( ), » Время (час)=»,h,» Sell «);
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Ask+SL*Point,Bid-TP*Point,»My order BUY»,16384,0,Green); } } return(0); }
Программа, используя информацию о поступающих котировках финансового инструмента пары евро-доллар (EURUSD), работает на часовом графике (таймфрейм H1), открывает сделки на покупку или продажу с учетом текущей ситуации. Сигнал на покупку или продажу осуществляется с учетом анализа функций экспоненциальной скользящей средней и простой скользящей средней Простая скользящая средняя (SMA) вычисляется по формуле: SMA = Sum(Pi)/n, где n — количество дней (параметр средней), Pi — котировки валюты для всех дней, принимающих участие в расчете текущего значения средней. Экспоненциальная скользящая вычисляется по формуле: EMA=EMA(t-1)+(2/(n+1))*(Pt-EMA(t-1)), где Pt — текущая котировка; n — период усреднения. Каждое новое значение EMA содержит в себе информацию о предыдущем — в формуле для расчета текущего EMA используется предшествовавшее текущему значение EMA(t-1). Фрагмент программы, отвечающий за определение сигнала покупки или продажи является важным и подлежит защите (выделен курсивом). Остальной программный код, отвечающий за открытие ордера на покупку или продажу после поступления сигнала, не является уникальным для написанной программы, восстановление взломщиком данного программного кода не позволяет восстановить алгоритм работы защищенной программы. Как было отмечено ранее, в данной работе не рассматриваются методы разработки приложения для автоматизированной торговли, но информация об использованных функциях SMA и EMA приведена, так как при написании фрагмента программного кода на языке паскаль, заменяющего критически важный код на MQL, потребовалась программная реализация стандартных функций MQL: iMAOnArray и iMA средствами языка паскаль. Использование функций обсуждается в работе[5], в которой подробно рассматриваются современные технологии автоматизированного анализа состояния рынков капитала и алгоритмы на основе статистического синтеза управляющих решений.
3.2 Разработка dll библиотеки, содержащей защищаемый программный код
Выделенный для защиты программный код на языке MQL переписывается на другом алгоритмическом языке программирования и оформляется в виде функции, хранящейся в dll библиотеке. Функция вызывается из исполняемого ex4 файла. Библиотека dll была написана на языке паскаль в среде разработки Delphi 6.0. Выбор версии языка в данном случае не принципиален, так как подходит любая версия Delphi, позволяющая создать dll библиотеку требуемой структуры. Принципы разработки dll библиотек с учетом обеспечения совместимости вызываемых процедур из исполняемого ex4 файла, подробно рассмотрены автором в книгах[6-8] по защите программного обеспечения для торговой платформы MT4 с использованием ключей HASP.
Программный модуль dll библиотеки на языке паскаль:
library PROTECTEDLIB;
uses
ShareMem,
SysUtils,
Classes;
{$R *.res}
type
m = array [0..3000] of real;
function signal(bars:integer;cl:m;lw:m;h:m):integer; stdcall;
var
i: Integer;
WavePeriod,AvgPeriod:integer;
buf3,buf1,buf5,buf4,buf6,buf2:array [0..3000] of real;
pr:real;
pr1,pr2,pos:Integer;
label l1,l2,l3,l4,l5,l6;
begin
pr1:=-50;
pr2:= 53;
WavePeriod:=10;
AvgPeriod:=21;
pr:=2.0/(WavePeriod+1.0);
pos:=bars-1;
l1:;
if pos=bars then buf2[pos]:=(cl[pos]+lw[pos]+h[pos])/3.0
else
buf2[pos]:=((cl[pos]+lw[pos]+h[pos])/3.0)*pr+buf2[pos+1]*(1-pr);
pos:=pos-1;
if pos>=0 then goto l1;
i:=bars-1;
l2:;
buf6[i]:=Abs(((h[i]+cl[i]+lw[i])/3.0)-buf2[i]);
i:=i-1;
if i >=0 then goto l2;
i:=bars-1;
l3:;
if(i=bars-1) then buf4[i]:= buf6[bars-1] else
buf4[i]:= buf6[i]*(2.0/(WavePeriod+1))+buf4[i+1]*(1.0-2.0/(WavePeriod+1));
i:=i-1;
if i >=0 then goto l3;
i:=bars-1;
l4:;
if (buf4[i]>0.0) then buf5[i]:=((h[i]+cl[i]+lw[i])/3.0-buf2[i])/(0.015*buf4[i])
else buf5[i]:=0;
i:=i-1;
if i >=0 then goto l4;
i:=bars-1;
l5:;
if(i=bars-1) then buf1[i]:= buf5[bars-1] else
buf1[i]:= buf5[i]*(2.0/(AvgPeriod+1.0))+buf1[i+1]*(1.0-2.0/(AvgPeriod+1.0));
i:=i-1;
if i >=0 then goto l5;
i:=bars-1;
l6:;
if(i=bars-1) then buf3[i]:=buf1[i];
if(i=bars-2) then buf3[i]:=(buf1[i]+buf1[i+1])/2.0;
if(i=bars-3) then buf3[i]:=(buf1[i]+buf1[i+1]+buf1[i+2])/3.0;
if(i=0 then goto l6;
signal:=0;
if (buf1[1] >= buf3[1]) and (buf1[2] <= buf3[2]) and (buf1[1] < pr1) then signal:=1; // BUY
if (buf1[1] <= buf3[1]) and (buf1[2]>= buf3[2]) and (buf1[1]>pr2) then signal:=2; // SELL
end;
exports signal;
begin
end.
—
На этом пост завершен, но практическая часть нет – смотрите продолжение в следующем посте…