Перейти к содержанию

lizzmack

Пользователи
  • Постов

    27
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные lizzmack

  1. хай, видео оказалось полезным. Благодарю.
    насчет задержки - я в этом вопрос очень толерантен, так как время штука такая,вроде есть, но на самом деле неделями его нет. :D

    • Плюс 1
  2. 1 минуту назад, ШАРИК сказал:

    скорее всего цепочку указателей читаешь неправильно .

    Скрытый текст

     

            #region -------Adresses--------
            int MainPlayerBase = 0x509b74;
            int [] MainPlayerMultiLvl = new int[] { 0x30 };
            PlayerDataAddr MainPlayerOffsets = new PlayerDataAddr(0x10, 0x14, 0x4, 0xC, 0x8, 0xC8);


            #region -------Enemy Adresses--------
            List<PlayerData> EnemyAddresses = new List<PlayerData>();
            int [] enOneMultiLvl = new int[] { 0x0, 0x30 };

     

    та не, мои корды норм считывает, программа их выводит абсолютно все. =\

     

  3. Или я под вечер не соображаю, адрес шарика, и адреса с UC - тоже работают, но программа все еще ни в какую. не туда может тыкаю этими адресами?
    адрес тыкаю в 

    Скрытый текст

    private void SetupEnemyVars()
            {
                PlayerData En1 = new PlayerData();
                En1.baseAddress = MyProcess[0].MainModule.BaseAddress.ToInt32() + 0x00110D90;
                En1.multiLevel = enOneMultiLvl;
                En1.offsets = MainPlayer.offsets;
                EnemyAddresses.Add(En1);

            }

    и что-то мне подсказывает, что я делаю не так.

  4. О великие геймхакеры, колдуны и погроммисты. Взываю к вам.
    8 часов головной боли при изучении англоязычных уроков по написанию Аимбота для игры assault cube, чтобы запустить и понять, что эта злючая программа не хочет брать в таргет ботов. Может кто подсказать, где я так упал лицом в грязь?
    исходник прикладываю https://yadi.sk/d/qYr8j9mY3GTwFA
    assault cube с офф сайта качал.

    оффсеты которые я нашел(может они чет неправильные, на всяк случай их тоже прикрепил):
     

    Скрытый текст

    offset = f8
    0281A138
    MainPlayerBase = 509b74
    offset(f8-c8) = 30
    points to 0281a230
    playerBase+
    4 =xpos
    8 = z pos
    c = ypos
    10 =mousex
    14 =mousey
    c8 =Health


    enemy coords
    base "ac_client.exe"+0010F4F8
    4,f8(30) = offsets

    0B807A10

     

  5. 2 минуты назад, what228 сказал:

    Если что-то не получится советую пробовать в игре Assault Cube :) 

    Да-да, нашел канал Guided hacks, он именно на этой игре и показывает :). Правда сегодня уже умственно исчерпал себя, поэтому только теорию смотрю. завтра уже буду пытаться реализовывать практику

    • Плюс 1
  6. 20 минуты назад, what228 сказал:
      Скрыть содержимое

    [sl_Saver] - Сохранить координаты
    [sl_Loader] - Загрузить
    [sl_X] - Координата X
    [sl_Y] - Координата Y
    [sl_Z] - Координата Z
    [sl_Adder] - Число которое добавим к чему либо.
    Инструкция которую я взял для скрипта работает с мобами и нашим игроком. В части BracnhSaver - мы сохраняем координаты нашего игрока в [sl_X]... В части BranchLoader - мы загружаем наши координаты и замещаем координаты мобов нашей сохраненной.

    Как я понял из видео что ты предоставил. Keng ( Михаил ) (Если не правильно указал извините) он взял указатель HP своего игрока и с него вышел на структуру где лежали данные не только его игрока но и остальных игроков ( ботов ). Через каждые 18байт лежали данные другого игрока.

    да, все верно, из указателя на хп он вышел на структуру. В начале темы я точно так же это сделал.( ты еще спросил, зачем указатели)
    насчет каждые 18 байт - это я понял. Сейчас думаю уже как реализовывается аим(все необходимые адреса нашел), и пошел исследовать англоязычные уроки.

  7. 48 минуты назад, what228 сказал:


    Вот к примеру Vacuum:
     

      Скрыть содержимое
    
    
    [ENABLE]
    aobscanmodule(sl_Vacuum,KFGame.exe,F3 41 0F 10 47 08 F3 0F 5C)
    alloc(newmem,$1000,"KFGame.exe"+656AB1)
    
    label(code)
    label(return)
    label(BranchVacuum)
    label(BranchLoader)
    label(BranchSaver)
    label(sl_X)
    label(sl_Y)
    label(sl_Z)
    label(sl_Adder)
    label(sl_Loader)
    label(sl_Saver)
    registersymbol(sl_Loader)
    registersymbol(sl_Saver)
    registersymbol(sl_X)
    registersymbol(sl_Y)
    registersymbol(sl_Z)
    
    newmem:
    
    sl_Saver:
    dd 0
    sl_Loader:
    dd 0
    sl_X:
    dd 0
    sl_Y:
    dd 0
    sl_Z:
    dd 0
    sl_Adder:
    dd (float)100
    
    BranchVacuum:
      cmp [sl_Saver],0
      jne BranchSaver
      cmp [sl_Loader],0
      jne BranchLoader
      jmp code
    
    BranchSaver:
      cmp [r15+B0],000033FA
      jne code
      cmp [r15+AC],00000000
      jne code
      cmp [r15+F4],#22
      jne code
      fld dword ptr [r15]
      fadd dword ptr [sl_Adder]
      fstp dword ptr [sl_X]
      fld dword ptr [r15+04]
      fstp dword ptr [sl_Y]
      fld dword ptr [r15+08]
      fstp dword ptr [sl_Z]
      mov [sl_Saver],0
      jmp code
    
    BranchLoader:
      cmp [r15+AC],00000000
      je code
      cmp [r15+F4],4
      jne code
      fld dword ptr [sl_X]
      fstp dword ptr [r15]
      fld dword ptr [sl_Y]
      fstp dword ptr [r15+04]
      fld dword ptr [sl_Z]
      fstp dword ptr [r15+08]
      jmp code
    
    code:
      movss xmm0,[r15+08]
      jmp return
    
    sl_Vacuum:
      jmp BranchVacuum
      nop
    return:
    registersymbol(sl_Vacuum)
    
    [DISABLE]
    sl_Vacuum:
      db F3 41 0F 10 47 08
    
    unregistersymbol(sl_Vacuum)
    unregistersymbol(sl_Loader)
    unregistersymbol(sl_Saver)
    dealloc(newmem)
    
    {
    // ORIGINAL CODE - INJECTION POINT: "KFGame.exe"+656AB1
    
    "KFGame.exe"+656A81: 41 80 BE C0 00 00 00 01           -  cmp byte ptr [r14+000000C0],01
    "KFGame.exe"+656A89: 75 67                             -  jne KFGame.exe+656AF2
    "KFGame.exe"+656A8B: 41 F7 86 F0 00 00 00 00 10 00 00  -  test [r14+000000F0],1000
    "KFGame.exe"+656A96: 75 53                             -  jne KFGame.exe+656AEB
    "KFGame.exe"+656A98: 85 C9                             -  test ecx,ecx
    "KFGame.exe"+656A9A: 75 4F                             -  jne KFGame.exe+656AEB
    "KFGame.exe"+656A9C: F3 41 0F 10 0F                    -  movss xmm1,[r15]
    "KFGame.exe"+656AA1: F3 0F 5C 4D A0                    -  subss xmm1,[rbp-60]
    "KFGame.exe"+656AA6: F3 41 0F 10 57 04                 -  movss xmm2,[r15+04]
    "KFGame.exe"+656AAC: F3 0F 5C 55 A4                    -  subss xmm2,[rbp-5C]
    // ---------- INJECTING HERE ----------
    "KFGame.exe"+656AB1: F3 41 0F 10 47 08                 -  movss xmm0,[r15+08]
    // ---------- DONE INJECTING  ----------
    "KFGame.exe"+656AB7: F3 0F 5C 45 A8                    -  subss xmm0,[rbp-58]
    "KFGame.exe"+656ABC: F3 44 0F 5E E7                    -  divss xmm12,xmm7
    "KFGame.exe"+656AC1: F3 41 0F 59 CC                    -  mulss xmm1,xmm12
    "KFGame.exe"+656AC6: F3 41 0F 59 D4                    -  mulss xmm2,xmm12
    "KFGame.exe"+656ACB: F3 41 0F 59 C4                    -  mulss xmm0,xmm12
    "KFGame.exe"+656AD0: F3 41 0F 11 8E 8C 01 00 00        -  movss [r14+0000018C],xmm1
    "KFGame.exe"+656AD9: F3 41 0F 11 96 90 01 00 00        -  movss [r14+00000190],xmm2
    "KFGame.exe"+656AE2: F3 41 0F 11 86 94 01 00 00        -  movss [r14+00000194],xmm0
    "KFGame.exe"+656AEB: 45 89 AE 94 01 00 00              -  mov [r14+00000194],r13d
    "KFGame.exe"+656AF2: 49 8B 8E 68 02 00 00              -  mov rcx,[r14+00000268]
    }

     

    Фильтры на быструю руку. Репак от nemos.

    Насчет видео:

      Показать содержимое
    
    
    const DWORD plr_num_offset = 0x93CCB8    -  Адрес библиотеки
    const DWORD plr_list_offset = 0x0089944C    -  Это адрес указателя
    const DWORD hp_offset = 0x214                     -  Это смещение
    const DWORD coords_offset = 0x214              -  Это смещение

     

    Если не так меня поправят.

    Если я правильно понял скрипт - это сохранение-загрузка позиций?
    У меня он не сработал( видать из-за фильтра ) когда ставил на сейвер 1 а потом на лоадер 1 - ничего не произошло
    но в целом кажется понятно как это работает( если я правильно понял, это для игрока). Не совсем то, что я хотел узнать, наверное уже от круглосуточного лазанья в этой игре не смог правильно сформулировать вопрос. Мне свои координаты не очень нужны-то были, скорее коорды мобов, но кажется я почти понял как их записать теперь правильно в с++. За исключением адреса библиотеки - все еще не понял откуда он взялся. 

  8. Только что, what228 сказал:

    Что-то я туплю.. Но для чего ты искал указатель? Просто нашел координату поставил бряк посмотрел. Нашел инструкцию работающую с тобой ( ну или со всеми ). Дальше определяешь структуру на основе этой инструкции. Если инструкция работает только с тобой то фильтры не нужны если со всеми то фильтры пишешь. Можешь сказать что ты хочешь сделать?

    пытаюсь понять откуда у михаила ремизова в видео https://www.youtube.com/watch?v=qzh6nL85SHs взялись оффсеты, если в предыдущей части он говорил только о смещениях в структуре между указателями  на игроков, и внутри них на хп этих игроков. Ибо вот у него таблица , а через момент уже адреса. 
    Конечная цель у меня - получить оффсет мобов. а там уже с ним что-нибудь поделать.

  9. Нашел 2 указателя,
    один с таким же адресом, что и хп
    второй имеет иной адрес, указывает туда же, посмотрел по 10 указателям по этим же смещениям тоже коорды. Получается, что тот который отличается - это оффсет мобов?
     

    Скрытый текст

    16634776.png

     

  10. 12 минуты назад, what228 сказал:

    Не все адреса связаны в одну структуру. Ищи просто координаты через поиск. Float - неизвестное и для быстроты ищи Z координату ( Высота ). Встал повыше? Отсеиваешь значение увеличилось. Встал пониже? Отсеиваешь значение уменьшилось. И так пока не найдешь :) И да не стоит создавать новую тему. Ты мог в старой своей отписать

    Насчет темы, я долго сомневался куда написать(в новую или старую тему), ведь, вопрос должен был бы соответствовать названию темы. Поэтому создал еще одну, с общим названием, куда, если что -  напишу еще вопросы. Извиняйте.
    Сейчас попробую отдельным поиском найти координаты.

  11. И снова приветствую!
    Продолжал разбирать KF2, пытался сейчас освоить курс уроков Михаила Ремизова о создании есп.
    Но вот наткнулся на тупик, не могу найти в структурах позиции (по x y z) себя, а так же мобов.(хотел попробовать аим) 
    Выходил на структуру игрока следующим образом:
    нашел свое хп, указатель 1 уровня на него, добавил сам адрес указателя в таблицу. 

    Скрытый текст

    16633845.png
     

    Затем посмотрел что делает указатель в памяти, открыл "disserect structure", пошел по смещению, которое есть на указателе(384) и нашел свое хп.
     

    Скрытый текст

    16633906.png


    :huh:"Окей" подумал я, вроде правильно иду, искал float'ы позиций (вверх и вниз по структуре), не нашел, или неправильно искал. Дальше смотрю в другие указатели, где по идее должны быть данные о здоровье врагов, но везде 0( открыл первые 10 указателей подряд). Количество врагов - вообще не понял где искать. В общем запутался по-полной в поисках этих оффсетов координат. Подтолкните на правильную дорогу :)

  12. 8 часов назад, what228 сказал:

    Вот работает при получении урона:
     

      Показать содержимое
    
    
    [ENABLE]
    aobscanmodule(PlayerHealth,KFGame.exe,CC 07 89 06 48 83 C4 20)
    alloc(newmem,$1000,"KFGame.exe"+55CD0)
    
    label(code)
    label(return)
    
    newmem:
      cmp [rdi+310],8110C000
      jne code
      cmp [rdi+434],00008387
      jne code
      mov [rdi],64
      jmp code
    
    code:
      mov eax,[rdi]
      mov [rsi],eax
      add rsp,20
      jmp return
    
    PlayerHealth:
      jmp newmem
      nop
      nop
      nop
    return:
    registersymbol(PlayerHealth)
    
    [DISABLE]
    
    PlayerHealth:
      db CC 07 89 06 48 83 C4 20
    
    unregistersymbol(PlayerHealth)
    dealloc(newmem)

     

    Еще на пробу с таким работал но игра крашится не знаю почему:
     

      Показать содержимое
    
    
    [ENABLE]
    aobscanmodule(pl_HP,KFGame.exe,41 8B 00 41 89 02 C3)
    alloc(newmem,$1000,"KFGame.exe"+E8EBE)
    
    label(code)
    label(return)
    
    newmem:
      cmp [r8+310],8110C000
      jne code
      cmp [r8+434],00008387
      jne code
      mov [r8],64
      jmp code
    
    code:
      mov eax,[r8]
      mov [r10],eax
      jmp return
    
    pl_HP:
      jmp newmem
      nop
    return:
    registersymbol(pl_HP)
    
    [DISABLE]
    sl_HP:
      db 41 8B 00 41 89 02
    
    unregistersymbol(pl_HP)
    dealloc(newmem)

     

    Думаю просто нужно еще фильтр накинуть и мб норм будет. Т.к. в самые первые моменты я с скриптом #2 ( mov eax,[r8] ) побегал 2 волны и не вылетало. Потом после первого вылета стало вылетать очень часто. Но не буду этим заниматься т.к. игра мне не понравилась извини.

    Благодарю. многоразовая проверка для фильтра действительно избавила от вылетов,осталось найти значения, которые вообще не меняются, чем сейчас и попробую заняться.

  13. UPD2: сумел найти инструкцию эту же инструкцию,вписал фильтр, вписал значение - РАБОТАЕТ.
    но в силу того, что инструкция вызывается раз в ХЗ сколько времени - ненадежный скрипт получился, хз даже почему он вообще работает. Подозреваю, что мне нужна одна из первых 4 какая-нибудь, которая срабатывает много раз в секунду. но фильтр у меня там не получается написать( все значения меняются бешено быстро). Попробую полазить еще утром уже, поскольку уже хоть какой-то прогресс увидел.

  14. 21 минуты назад, what228 сказал:

    Скрипт примерное такой:
     

      Скрыть содержимое
    
    
    aobscanmodule(INJECT,KFGame.exe,CC 0F 6E 8A 84 03 00 00) // should be unique
    alloc(newmem,$1000,"KFGame.exe"+ACEE82)
    label(code)
    label(return)
    
    newmem:
      fld dword ptr [rdx+388]                           // Берем значение из [rdx+388]
      fstp dword ptr [rdx+384]                         // Помещаем значение из [rdx+388] в [rdx+384]
    
    code:
      movd xmm1,[rdx+00000384]
      jmp return
    
    INJECT:
      jmp newmem
      nop
      nop
      nop
    
    return:
    registersymbol(INJECT)

     

    Для работы с double нужно делать так вроде:
     

      Скрыть содержимое
    
    
    aobscanmodule(INJECT,KFGame.exe,CC 0F 6E 8A 84 03 00 00) // should be unique
    alloc(newmem,$1000,"KFGame.exe"+ACEE82)
    label(Hp_Pl)
    label(code)
    label(return)
    label(ValueOnDouble) // Рандом название
    
    newmem:
    
    ValueOnDouble:
      dq(double)0  // Заместо 0 любое твое число
    
    Hp_Pl:
      fld dword ptr [ValueOnDouble] // Берем значение из [ValueOnDouble]
      fstp dword ptr [rdx+384]      // И помещаем сюда
    
    code:
      movd xmm1,[rdx+00000384]
      jmp return
    
    INJECT:
      jmp Hp_Pl
      nop
      nop
      nop
    
    return:
    registersymbol(INJECT)

     

     

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


    UPD: инструкция, на которую мне говорили писать - за 10 минут не появилась в отладчике. Подозреваю, она упорота. Остается писать фильтр для второй или четвертой, даже если значения в структурке меняются каждые пару минут. 

  15. Скрытый текст

    { Game   : KFGame.exe
      Version: 
      Date   : 2017-03-25
      Author : ??????

      This script does blah blah blah
    }

    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat

     
     
    aobscanmodule(INJECT,KFGame.exe,CC 0F 6E 8A 84 03 00 00) // should be unique
    alloc(newmem,$1000,"KFGame.exe"+ACEE82)

    label(code)
    label(return)

    newmem:
      mov dword ptr [rdx+00000384],(double)100 //на double остановился на момент копирования. по смещению 384 текущее здоровье, 388 - макс.
    code:
      movd xmm1,[rdx+00000384]
      jmp return

    INJECT:
      jmp newmem
      nop
      nop
      nop
    return:
    registersymbol(INJECT)

    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    INJECT:
      db CC 0F 6E 8A 84 03 00 00

    unregistersymbol(INJECT)
    dealloc(newmem)

    {
    // ORIGINAL CODE - INJECTION POINT: "KFGame.exe"+ACEE82

    "KFGame.exe"+ACEE52: 45 0F B6 E0              -  movzx r12d,r8l
    "KFGame.exe"+ACEE56: 48 8B F2                 -  mov rsi,rdx
    "KFGame.exe"+ACEE59: 48 8B E9                 -  mov rbp,rcx
    "KFGame.exe"+ACEE5C: 48 85 D2                 -  test rdx,rdx
    "KFGame.exe"+ACEE5F: 0F 84 C7 02 00 00        -  je KFGame.exe+ACF12C
    "KFGame.exe"+ACEE65: F6 82 E8 00 00 00 02     -  test byte ptr [rdx+000000E8],02
    "KFGame.exe"+ACEE6C: 0F 85 BA 02 00 00        -  jne KFGame.exe+ACF12C
    "KFGame.exe"+ACEE72: 48 8B 81 4C 02 00 00     -  mov rax,[rcx+0000024C]
    "KFGame.exe"+ACEE79: 48 85 C0                 -  test rax,rax
    "KFGame.exe"+ACEE7C: 0F 84 AA 02 00 00        -  je KFGame.exe+ACF12C
    // ---------- INJECTING HERE ----------
    "KFGame.exe"+ACEE82: 66 0F 6E 8A 84 03 00 00  -  movd xmm1,[rdx+00000384]
    // ---------- DONE INJECTING  ----------
    "KFGame.exe"+ACEE8A: 0F 57 C0                 -  xorps xmm0,xmm0
    "KFGame.exe"+ACEE8D: 0F 5B C9                 -  cvtdq2ps xmm1,xmm1
    "KFGame.exe"+ACEE90: 0F 2F C8                 -  comiss xmm1,xmm0
    "KFGame.exe"+ACEE93: 0F 82 93 02 00 00        -  jb KFGame.exe+ACF12C
    "KFGame.exe"+ACEE99: 48 3B D0                 -  cmp rdx,rax
    "KFGame.exe"+ACEE9C: 0F 84 8A 02 00 00        -  je KFGame.exe+ACF12C
    "KFGame.exe"+ACEEA2: 48 89 5C 24 50           -  mov [rsp+50],rbx
    "KFGame.exe"+ACEEA7: 33 DB                    -  xor ebx,ebx
    "KFGame.exe"+ACEEA9: 48 89 7C 24 58           -  mov [rsp+58],rdi
    "KFGame.exe"+ACEEAE: 33 FF                    -  xor edi,edi
    }

     

  16. 5 минут назад, Dison сказал:

    Надо писать так

    newmem:
      mov dword ptr [rdx+00000388],(float)100 - Например устанавливаем 100
    code:
      movd xmm1,[rdx+00000384]
      jmp return

    Попробовал разные типы переменных
    float
    double
    int
    #
    скрипт все еще не реагирует на активацию. =\ (здоровье в 4 байта)

  17. 2 минуты назад, Dison сказал:

    2017032521_9670838_25633792.jpg

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

    UP:
    сумел снова выявить данную инструкцию, но скрипт написанный для нее - даже не включается( ошибка где-то?)

     

    Скрытый текст

    newmem:
      movd xmm1,[rdx+00000388]
    code:
      movd xmm1,[rdx+00000384]
      jmp return

     

  18. 5 минут назад, Dison сказал:

    Попробуй так -  cmp dword ptr [r8+сc],0000008C

    Крашнуло(по калькулятору ввел свое значение с пересчетом на hex), + после перезапуска значение в смещении сс, которое было   0000008C  сменилось на другое (000000F5) ,даже если не перезапускать игру, то значение в фиолетовых областях все равно меняется каждые несколько минут. Или я 

  19. Скрин инструкций

    Скрытый текст

    16597297.png

    пробовал нопить 3 и 4 инструкцию, отнимать 0 от текущего значения и писать максимальное в текущее. но из-за кривого фильтра все пока пустой труд был.
    конкретно одной инструкции на здоровье гг я так и не увидел тут, поэтому сижу, сейчас список указателей делаю.

  20. 6 минут назад, partoftheworlD сказал:

    Ох ну и игру ты выбрал, она на UE написана.

    Извините, не в курсах, с UE что-то не так?
     

    Скрытый текст

    cmp dword ptr [r8+сc], #140

    крашнуло

    сейчас гляну что с другими инструкциями, хотя там все в списке работают более чем 8 адресов

     

  21. Здравия желаю, форумчане.
    В деле геймхакинга зеленый, но пытался ковыряться в современных играх, а не в старых (сложнее - значит опыта в этом деле будет больше)
    Конкретно в Killing Floor 2(steam-версия) столкнулся с проблемой написания фильтра свой\чужой
    Исходя из уроков на канале gamehacklab[ru], для фильтра нужна строка со значениями, которые будут для меня одно, для всех остальных другое. т.е. выделяться фиолетовым.
     

    Скрытый текст

    16596923.gif

    да не тут-то было, почти все "статичные" значения, по ходу игры меняются. Соответственно, каждый раз, когда брал любое из фиолетовых, сравнивал в скрипте 
    например
    cmp dword ptr [r8+сc], 140
    jne code
    то игра вылетала уже сразу на этом этапе, даже не добавляя махинаций со значениями.

    p.s. заодно интересно, как выйти на структуру оружия, если единственный адреc с патронами - экранный, или зашифрованый(не смог понять, но в код выше\ниже смотрел, нигде нет call'ов и xor, бряк на запись выводит указатель на тот же адрес, что у меня в таблице)

    Перенес тему в соответствующий раздел (от MasterGH)

  22. В 15.03.2017в04:47, Garik66 сказал:

    На самом деле там не сложно это сделать, я реализовал добавление одного уровня сразу в моде для этой игры The Hell, в самой Дьябле это сделать проще.

     

    ЗЫ: На выходных запишу видео, если будет время или кто-то ещё не сделает это.

    Оке, посижу пока в других играх, где нет такого выноса мозга с адресами.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.