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

Как заморозить таймер в игре?


VinDronix

Рекомендуемые сообщения

Если найденое число это только экранное. И при создании скрипта и его активности число на экране меняется, но продолжает заканчиваться на самом деле. Как найти зашифрованное число?

Ссылка на комментарий
Поделиться на другие сайты

Спойлер

 

Спойлер
[ENABLE]
aobscanmodule(TimerMss,DriverParallelLines.exe,D9 01 D8 64 24 04)
alloc(newmem,$1000)
label(return)
registersymbol(TimerMss)

newmem:
  mov [ecx],(float)6250
  fld dword ptr [ecx]
  fsub dword ptr [esp+04]//Можно просто её занопить
  jmp return

TimerMss:
  jmp newmem
  nop
return:

[DISABLE]
TimerMss:
db D9 01 D8 64 24 04
unregistersymbol(TimerMss)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: DriverParallelLines.exe+6B0CC
DriverParallelLines.exe+6B0B1: C2 04 00                 - ret 0004
DriverParallelLines.exe+6B0B4: 80 79 05 00              - cmp byte ptr [ecx+05],00
DriverParallelLines.exe+6B0B8: 74 04                    - je DriverParallelLines.exe+6B0BE
DriverParallelLines.exe+6B0BA: D9 01                    - fld dword ptr [ecx]
DriverParallelLines.exe+6B0BC: EB 14                    - jmp DriverParallelLines.exe+6B0D2
DriverParallelLines.exe+6B0BE: 80 79 06 00              - cmp byte ptr [ecx+06],00
DriverParallelLines.exe+6B0C2: 74 08                    - je DriverParallelLines.exe+6B0CC
DriverParallelLines.exe+6B0C4: D9 44 24 04              - fld dword ptr [esp+04]
DriverParallelLines.exe+6B0C8: D8 01                    - fadd dword ptr [ecx]
DriverParallelLines.exe+6B0CA: EB 06                    - jmp DriverParallelLines.exe+6B0D2
// ---------- INJECTING HERE ----------
DriverParallelLines.exe+6B0CC: D9 01                    - fld dword ptr [ecx]
// ---------- DONE INJECTING  ----------
DriverParallelLines.exe+6B0CE: D8 64 24 04              - fsub dword ptr [esp+04]
DriverParallelLines.exe+6B0D2: C2 04 00                 - ret 0004
DriverParallelLines.exe+6B0D5: A1 B0 C5 70 00           - mov eax,[DriverParallelLines.exe+30C5B0]
DriverParallelLines.exe+6B0DA: F3 0F 2A 40 04           - cvtsi2ss xmm0,[eax+04]
DriverParallelLines.exe+6B0DF: F3 0F 59 05 F4 13 64 00  - mulss xmm0,[DriverParallelLines.exe+2413F4]
DriverParallelLines.exe+6B0E7: 32 C0                    - xor al,al
DriverParallelLines.exe+6B0E9: F3 0F 11 01              - movss [ecx],xmm0
DriverParallelLines.exe+6B0ED: 88 41 04                 - mov [ecx+04],al
DriverParallelLines.exe+6B0F0: C6 41 05 01              - mov byte ptr [ecx+05],01
DriverParallelLines.exe+6B0F4: 88 41 06                 - mov [ecx+06],al
}

 

Время хранится как 3 разных числа

1 чило минуты 2 секунды и тд.

хранятся они как float но заморозить их не выйдет.

Как ломал

От инструкции сработавщей на секундах трейсил и шёл вверх по коду.

И снова трейсил от начала вызова. 

И наткнулся на это.

Изменено пользователем Partizan
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Спасибо дружище выручил. мнеб конечно ещё бы нерушимый авто т.к. сам пробовал найти но неполучилось по причине постоянного крэша

Смог тока здоровье, убить всех, деньги, отмена полиции и то когда у копов машину забираешь то розыск отменить нельзя почемуто

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Привет!

 

Есть такая игра "Forever Skies Demo" (можно скачать в steam бесплатно) с ограничением по времени в 40 мин.
Судя по размеру в 9 Гб, игра скорее всего полная но с ограничением по таймеру. Пробовал искать только по цифре
минут, не получается найти даже экранное значение. Также пробовал искать секунды (когда оставалось меньше минуты),
тоже без результатов. Даже пробовал делать сохранения в разное время и потом сравнивать файлы сохранений, дабы
найти байты разницы времени, но размер отличий между сохранёнками сильно отличаются друг от друга.

 

Возможно более опытные взломщики смогут с этой задачкой справится. Готов предоставить файлы сохранений:
1-й: где до конца осталось 25 сек таймера.
2-й: где до конца осталось 25 мин таймера.

 

ЗЫ: Таймер в игре стартует не сразу, а только после определённых действий в игре (по сюжету). И хранится точно в

сохранёнке, т.к. я могу каждый раз загружая одно и то же сохранение, начинать с этого времени.

Ссылка на комментарий
Поделиться на другие сайты

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

Если время в игре также переведется на пять минут назад, то по идее игра считывает системное время. А если нет, то по идее игра ведет свой собственный отсчет от момента запуска игры, прибавив предварительно офсет из файла сохранения.

Скорее всего значение шифруется. Если получится у тебя найти, напиши, интересно, что там и как.

 

Еще помню, где-то в WinAPI мне попадалась на глаза функция возвращающая время работы процесса, то есть например игры. Может с ней поработать еще. Или не с ней конкретно, а с той которую она вызывает, из Kernel.

 

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Antonshka сказал:

Если время в игре также переведется на пять минут назад,

навряд ли, так как
 

7 часов назад, Эдвард сказал:

хранится точно в

сохранёнке, т.к. я могу каждый раз загружая одно и то же сохранение, начинать с этого времени.

 

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Эдвард сказал:

ограничением по времени

Это ограничение времени с сервера идёт, а файлы игры обращаются к серверу. Такое мало кто может ломать. Может те кто онлайн ломает посоветует чего.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Pitronic сказал:

Это ограничение времени с сервера идёт, а файлы игры обращаются к серверу. Такое мало кто может ломать. Может те кто онлайн ломает посоветует чего.

Я тоже так подумал, поскольку в папке сохранений есть файл БД ga.sqlite3 в котором есть поле server_ts: 1670615969. Изменение этого timestamp в БД не приводит

к увеличению таймера. Других интересных полей в БД нет. Самое логичное это найти значение таймера в сохранёнке, поскольку оно от туда при загрузке начинает

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

Изменено пользователем Эдвард
Добавление информации
Ссылка на комментарий
Поделиться на другие сайты

Включи скрипт а потом добавь адреса

Спойлер
[ENABLE]
aobscanmodule(World,ProjectZeppelin-Win64-Shipping.exe,48 8B ? ? ? ? ? 40 88 ? ? ? ? ? 48 85 ? 74 ? 48 8B ? ? ? ? ? EB)
alloc(newmem,$1000,World)
label(return)
label(_World)
registersymbol(_World)
registersymbol(World)

newmem:
  mov [_World],rdi
  mov rax,[rdi+00000180]
  jmp return

_World:
dq 00

World:
  jmp newmem
  nop 2
return:

[DISABLE]
World:
db 48 8B 87 80 01 00 00
unregistersymbol(*)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E28C
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26A: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26D: 74 15                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26F: 48 8B 80 88 00 00 00  - mov rax,[rax+00000088]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E276: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E279: 74 09                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E27B: 83 B8 34 01 00 00 03  - cmp dword ptr [rax+00000134],03
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E282: 75 05                 - jne ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E289
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284: 40 B6 01              - mov sil,01
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E287: EB 03                 - jmp ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E28C
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E289: 40 32 F6              - xor sil,sil
// ---------- INJECTING HERE ----------
ProjectZeppelin-Win64-Shipping.exe+307E28C: 48 8B 87 80 01 00 00  - mov rax,[rdi+00000180]
// ---------- DONE INJECTING  ----------
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E293: 40 88 B5 40 01 00 00  - mov [rbp+00000140],sil
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29A: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29D: 74 09                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A8
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29F: 48 8B 80 D8 00 00 00  - mov rax,[rax+000000D8]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A6: EB 07                 - jmp ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2AF
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A8: 48 8D 87 70 03 00 00  - lea rax,[rdi+00000370]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2AF: 48 8B C8              - mov rcx,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2B2: 48 89 45 A0           - mov [rbp-60],rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2B6: E8 65 B5 FE FF        - call ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+3069820
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2BB: 40 84 F6              - test sil,sil
}

 

[[_World]+120]+278 PlayTime

[[_World]+118]+48C PlayTimeLimit

Спойлер

qwe213423.png

 

Изменено пользователем Partizan
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Partizan сказал:

Включи скрипт а потом добавь адреса

  Показать контент
[ENABLE]
aobscanmodule(World,ProjectZeppelin-Win64-Shipping.exe,48 8B ? ? ? ? ? 40 88 ? ? ? ? ? 48 85 ? 74 ? 48 8B ? ? ? ? ? EB)
alloc(newmem,$1000,World)
label(return)
label(_World)
registersymbol(_World)
registersymbol(World)

newmem:
  mov [_World],rdi
  mov rax,[rdi+00000180]
  jmp return

_World:
dq 00

World:
  jmp newmem
  nop 2
return:

[DISABLE]
World:
db 48 8B 87 80 01 00 00
unregistersymbol(*)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E28C
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26A: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26D: 74 15                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E26F: 48 8B 80 88 00 00 00  - mov rax,[rax+00000088]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E276: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E279: 74 09                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E27B: 83 B8 34 01 00 00 03  - cmp dword ptr [rax+00000134],03
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E282: 75 05                 - jne ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E289
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E284: 40 B6 01              - mov sil,01
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E287: EB 03                 - jmp ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E28C
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E289: 40 32 F6              - xor sil,sil
// ---------- INJECTING HERE ----------
ProjectZeppelin-Win64-Shipping.exe+307E28C: 48 8B 87 80 01 00 00  - mov rax,[rdi+00000180]
// ---------- DONE INJECTING  ----------
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E293: 40 88 B5 40 01 00 00  - mov [rbp+00000140],sil
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29A: 48 85 C0              - test rax,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29D: 74 09                 - je ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A8
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E29F: 48 8B 80 D8 00 00 00  - mov rax,[rax+000000D8]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A6: EB 07                 - jmp ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2AF
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2A8: 48 8D 87 70 03 00 00  - lea rax,[rdi+00000370]
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2AF: 48 8B C8              - mov rcx,rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2B2: 48 89 45 A0           - mov [rbp-60],rax
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2B6: E8 65 B5 FE FF        - call ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+3069820
ProjectZeppelin-Win64-Shipping.exe.unpacked.exe+307E2BB: 40 84 F6              - test sil,sil
}

 

[[_World]+120]+278 PlayTime

[[_World]+118]+48C PlayTimeLimit

  Показать контент

qwe213423.png

 

Круто! А можно чуть подробнее? Я с CE только 2 дня как общаюсь, ещё не разобрался.

При попытке выполнить скрипт получаю следующее - https://disk.yandex.ru/i/KIPBa99O8E3TyQ

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Эдвард сказал:

Круто! А можно чуть подробнее? Я с CE только 2 дня как общаюсь, ещё не разобрался.

При попытке выполнить скрипт получаю следующее - https://disk.yandex.ru/i/KIPBa99O8E3TyQ

Спойлер

 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Эдвард сказал:

[[_World]+120]+278 PlayTime

[[_World]+118]+48C PlayTimeLimit

Спасибо за видео! Век живи - век учись 🧐

Изменено пользователем Эдвард
Пока писал уже ответили
  • Понравилось 1
Ссылка на комментарий
Поделиться на другие сайты

Как нашёл таймер. Воспользовался инструментом от Cake-san.

И так-как уже не раз ковырял игры на Unreal Engine решил просмотреть наиболее очевидные разделы в структуре от "Мира"

И таки да. Наткнулся на таймер.

Спойлер

 

 

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Держи ещё скрипт на Халявный крафт.(его было сделать сложней чем таймер)

Для "приятной игры"

Спойлер
[ENABLE]
aobscanmodule(FreeCraft,ProjectZeppelin-Win64-Shipping.exe,44 8B 43 08 48 8B CF 48 8B 13 E8 F1)
alloc(newmem,$1000,FreeCraft)
label(return)
registersymbol(FreeCraft)

newmem:
  mov [rbx+08],00
  mov r8d,[rbx+08]
  mov rcx,rdi
  jmp return

FreeCraft:
  jmp newmem
  nop 2
return:

[DISABLE]
FreeCraft:
db 44 8B 43 08 48 8B CF
unregistersymbol(FreeCraft)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+30
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+11: 48 8B FA        - mov rdi,rdx
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+14: 48 89 02        - mov [rdx],rax
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+17: 48 89 42 08     - mov [rdx+08],rax
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+1B: 48 8B 59 50     - mov rbx,[rcx+50]
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+1F: 48 63 71 58     - movsxd  rsi,dword ptr [rcx+58]
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+23: 48 C1 E6 04     - shl rsi,04
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+27: 48 03 F3        - add rsi,rbx
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+2A: 48 3B DE        - cmp rbx,rsi
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+2D: 74 19           - je ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+48
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+2F: 90              - nop 
// ---------- INJECTING HERE ----------
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+30: 44 8B 43 08     - mov r8d,[rbx+08]
// ---------- DONE INJECTING  ----------
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+34: 48 8B CF        - mov rcx,rdi
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+37: 48 8B 13        - mov rdx,[rbx]
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+3A: E8 F1 A0 FE FF  - call ProjectZeppelin-Win64-Shipping.exe+1383C80
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+3F: 48 83 C3 10     - add rbx,10
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+43: 48 3B DE        - cmp rbx,rsi
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+46: 75 E8           - jne ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+30
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+48: 48 8B 5C 24 30  - mov rbx,[rsp+30]
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+4D: 48 8B C7        - mov rax,rdi
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+50: 48 8B 74 24 38  - mov rsi,[rsp+38]
ProjectZeppelin-Win64-Shipping.UCraftingRecipe::GetIngredientSet+55: 48 83 C4 20     - add rsp,20
}

 

 

Изменено пользователем Partizan
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

18 часов назад, Partizan сказал:

Держи ещё скрипт на Халявный крафт.(его было сделать сложней чем таймер)

Ага, спасибки!

Сейчас пытаюсь сделать отдельный трейнер в виде EXE файла, хочу замораживать таймер, но не работает, подозреваю, что трейнер не верно собирается.

Ткни плиз носом на может какой гайд, как правильно это дело собрать, чтобы допустим по Alt+Z включалась заморозка.

Ссылка на комментарий
Поделиться на другие сайты

Партизан, привет!

 

А подскажи ещё где взять такие-же скрипты по UE, чтобы искать сущности по игре, хочу попробовать снять ограничение по весу корабля в 700Кг, чтобы попытаться расстроить его по более.

Ссылка на комментарий
Поделиться на другие сайты

Я тут раздампил объекты из структуры демки и увидел интересную ветку:

Спойлер

[00025273] 0000019E7FBCF7E0 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Standing Shelf (Item_ShelfStanding)
[00025274] 0000019E7FBCF920 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Shelf (Item_ShelfHanging)
[00025275] 0000019E7FBCF880 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Wall Lamp (Item_WallLamp)
[00025276] 0000019E7FBCF9C0 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Placeholder (Item_DeskLamp)
[00025277] 0000019E7FBCFA60 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Stool (Item_Stool)
[00025278] 0000019E7FBCFBA0 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Placeholder (Item_StandingLightA)
[00025279] 0000019E7FBCFCE0 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Placeholder (Item_WallShelf_A)
[00025280] 0000019E7FBCFD80 SimpleDelegateCheat /Game/ProjectZeppelin/Maps/WorldMap_Main.WorldMap_Main.VisualCheatManager.Grey Storage Rack (Item_StorageRack_B)

...

 

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

Т.е. разрабы себе сделали инструментарий, чтобы всем этим делом рулить.

Ссылка на комментарий
Поделиться на другие сайты

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

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

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