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

Как писать скрипты

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

11 минуту назад, maxx500 сказал:

Уважаемые админы и помогаторы хорошо бы сделать видео уроки на ютуб как писать скрипты. Было бы очень хорошо для новичков да и остальным тоже познавательно. Пожалуйста сделайте подобные видео уроки.

А чем не угодили мои видео из курса "Взлом игр от А до Я"?

Поделиться сообщением


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

Уважаемый Xipho, ваши уроки очень хорошие спасибо вам большое за них. Но хотелось бы побольше про скрипты узнать на разный взлом (бесконечное передвижение, найм юнитов за 1 ход и.т.д.). Если у вас будет время взломайте пожалуйста игру Empire: Total War в вашем разделе Как я взламывал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
38 minutes ago, maxx500 said:

Уважаемые админы и помогаторы хорошо бы сделать видео уроки на ютуб как писать скрипты. Было бы очень хорошо для новичков да и остальным тоже познавательно. Пожалуйста сделайте подобные видео уроки.

Как писать скрипты на что? Я честно не понимаю подобных вопросов. Ну так:

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

[ENABLE]
aobscan(heroHealth,E9 D9 9F B0 00 00 00)
alloc(memHealth,$1000)
label(code)
label(return)

memHealth:
  mov [edi+000000B0],(float)100
  jmp return

code:
  fstp dword ptr [edi+000000B0]
  jmp return

heroHealth+01:
  jmp memHealth
  nop
return:
registersymbol(heroHealth)

[DISABLE]
heroHealth+01:
  db D9 9F B0 00 00 00
unregistersymbol(heroHealth)
dealloc(memHealth)


Может тогда стоит задавать более конкретные вопросы по поводу как правильно написать скрипт на конкретную инструкцию ( для функции )?

 

17 minutes ago, maxx500 said:

Если у вас будет время взломайте пожалуйста игру Empire: Total War в вашем разделе Как я взламывал.

Ты подал запрос уже не надо просить в других топиках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 часа назад, ReWanet сказал:

Как писать скрипты на что? Я честно не понимаю подобных вопросов. Ну так:

  Показать содержимое


[ENABLE]
aobscan(heroHealth,E9 D9 9F B0 00 00 00)
alloc(memHealth,$1000)
label(code)
label(return)

memHealth:
  mov [edi+000000B0],(float)100
  jmp return

code:
  fstp dword ptr [edi+000000B0]
  jmp return

heroHealth+01:
  jmp memHealth
  nop
return:
registersymbol(heroHealth)

[DISABLE]
heroHealth+01:
  db D9 9F B0 00 00 00
unregistersymbol(heroHealth)
dealloc(memHealth)


Понял что-то? Нет? Неожиданно!
Может тогда стоит задавать более конкретные вопросы по поводу как правильно написать скрипт на конкретную инструкцию ( для функции )?

 

Ты подал запрос уже не надо просить в других топиках.

ReWanet, на примере игры Empire Total War как написать скрипт на функцию бесконечного передвижения или найм войск за 1 ход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 минут назад, maxx500 сказал:

на примере игры Empire Total War

Во взломе игр не бывает так, чтобы писались самые универсальные скрипты. К каждой игре нужен свой подход. В своих видео я демонстрирую разные виды подхода, но это не значит, что нужно действовать абсолютно также. Нужно учиться анализировать код и поведение игры, иначе никак. А вот эти вот хитрости "покажи на примере %ИМЯИГРЫ%" меня уже начали утомлять. Смотрите видео, пробуйте, делайте хоть что-то самостоятельно. А то не хотите сами ничего делать, хотите получить готовые скрипты/таблицы/взломы, но при этом "покажи на примере". Я частенько делаю по-другому -  нахожу игру, которая схожа по логике с той, что просят в примере, и где нужно действовать аналогичным образом. Взламываю ее, показываю, но это не помогает, потому что по факту просящий не хочет ничего делать сам, а хочет готовый скрипт. Я уже склоняюсь к мысли о том, что за все последующие комментарии тут и на ютубе в духе "покажи на примере" тут буду выдавать пред, а на ютубе перманентно банить. Напомню, что наш ресурс по большей части призван научить мыслить как геймхакер, искать пути взлома самостоятельно, а не слепо повторять урок. Да, для начального понятия нужно скачать ту же игру, что и в уроке, и пройти весь урок по шагам. Потом, когда придет понимание, переходить к другим играм. Извиняюсь за резкость, но наболело уже.

Поделиться сообщением


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

Уважаемый Xipho, да я сильно хочу сам научиться писать скрипты. По вашему уроку в Doom 2016 я сам сделал легкий скрипт на деньги в стратегии. Извините если что лишнее ляпнул. Будем сами помаленьку осваивать взлом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
15 минут назад, maxx500 сказал:

да я сильно хочу сам научиться писать скрипты

 

Тогда тебе больше подойдут для начала игры с отрытым исходным кодом, типа Pwn Adventure 3: Pwnie Island, Assault Cube и ещё вроде была стратегия опен сорсная, где перед написанием скрипта можно посмотреть устройство функции, которая работает с интересующим значением.  А уже после того как поймешь устройство функции и иерархию в игре, то можно приступать к реальным играм(имхо советую с отрытым миром там много чего можно взломать). 

Поделиться сообщением


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

//Можно задать парочку вопросов, связанных с AA?

Как:

[0] находить скорострельность, наклон;

[1] создать валлхак (квадраты вокруг объектов);

[2] работать с адресом, к которому обращается сотня инструкций, можно ли делать несколько aobscan'ов (чтобы объединить несколько скриптов в т.ч. поиск в 1);

[3] зачем нужна полная инъекция;

[4] как писать GUI читы (внутриигровое окно);

[5] как защитить трейнер;

[6] для чего нужен отладчик в режиме ядра;

[7] реально ли написать игнор текстур без изучения кода игры;

[8] как работать с call;

[9] формировать/перехватывать пакет, отправляемый на сервер;

[A] выполнять атаку на группу адресов (например жизни сразу всех персонажей);

нужно-ли что то дописывать в скрипт при работе с mono (т.к. готовый трейнер не распознает адрес).

//Спасибо за внимание.

Изменено пользователем PresetX
..

Поделиться сообщением


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

Привет , я умею писать скрипт на нитро в игре нфс мост вантед 2012 и нит фор спид ривалс , а вот немогу не как написать скримт на нерозбеваемую машину или бессмертие какое надо искать значение ? Всем спасибо зарание

Поделиться сообщением


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

Здравствуйте, о велике, о могучие, кульные хацкеры, решил я тут расширить (или обновить) свои познания, да и скриптами таблицы пополнить, скрипт написал, а он пёс такой, не в какую не работает.

Скрипт на прибавление 1000 денег.

Спойлер

{ Game   : GoldenLand.exe
  Version: 
  Date   : 2020-11-18
  Author : MeVirus

  This script does blah blah blah
}

[ENABLE]
registersymbol(INJECT)
registersymbol(_money)
{$LUA}
memrec=getAddressList().getMemoryRecordByID("1387")
memrec.color = 0x0008000
PlaySound(findTableFile([[Activate]]))
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
  sleep "5000"
  if memoryrecord_isActive(memrec) then
    memoryrecord_unfreeze(memrec)
    memrec.color = 0x00000ff
    PlaySound(findTableFile([[Deactivate]]))
  end
end

{$ASM}

aobscanmodule(INJECT,Server.dll,0C 75 0E 8B 54 24 08 03 90 B0 00 00 00) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  cmp dword ptr [_money],1
  jne code
  add [eax+000000B0],3E8
  mov [_money],0 //чтоб бесконечного цикла не получилось

code:
  add edx,[eax+000000B0]
  //add dword ptr[eax+000000B0],3E8
exit:
  jmp return

INJECT+07:
  jmp newmem
  nop

_money:
dd 0

return:

[DISABLE]
{$LUA}
timer:setEnabled(false)

{$ASM}

INJECT+07:
  db 03 90 B0 00 00 00

unregistersymbol(INJECT)
unregistersymbol(_money)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Server.dll"+4C650

"Server.dll"+4C62D: 52                       -  push edx
"Server.dll"+4C62E: E8 F7 F8 01 00           -  call Server.dll+6BF2A
"Server.dll"+4C633: 8B 55 0C                 -  mov edx,[ebp+0C]
"Server.dll"+4C636: FF 34 9A                 -  push [edx+ebx*4]
"Server.dll"+4C639: 8B CD                    -  mov ecx,ebp
"Server.dll"+4C63B: E8 AC 15 00 00           -  call Server.dll+4DBEC
"Server.dll"+4C640: 8B 90 A8 00 00 00        -  mov edx,[eax+000000A8]
"Server.dll"+4C646: 3B 54 24 0C              -  cmp edx,[esp+0C]
"Server.dll"+4C64A: 75 0E                    -  jne Server.dll+4C65A
"Server.dll"+4C64C: 8B 54 24 08              -  mov edx,[esp+08]
// ---------- INJECTING HERE ----------
"Server.dll"+4C650: 03 90 B0 00 00 00        -  add edx,[eax+000000B0]
// ---------- DONE INJECTING  ----------
"Server.dll"+4C656: 89 54 24 08              -  mov [esp+08],edx
"Server.dll"+4C65A: 83 C3 01                 -  add ebx,01
"Server.dll"+4C65D: 53                       -  push ebx
"Server.dll"+4C65E: 8B 4C 24 08              -  mov ecx,[esp+08]
"Server.dll"+4C662: E8 39 FB FF FF           -  call Server.dll+4C1A0
"Server.dll"+4C667: 8B D8                    -  mov ebx,eax
"Server.dll"+4C669: 83 FB FF                 -  cmp ebx,-01
"Server.dll"+4C66C: 0F 85 69 FF FF FF        -  jne Server.dll+4C5DB
"Server.dll"+4C672: 8B 5C 24 08              -  mov ebx,[esp+08]
"Server.dll"+4C676: 8B 3C 24                 -  mov edi,[esp]
}

 

Не сочтите за дерзость, ткните меня паразита такого носом, что я не так написал, где я ошибся.

 

PS. Игра "Златогорье 2", ОС Win 10 [x64].

PPS. Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, MrVirus сказал:

где я ошибся.

_money:
dd 0  // не 0. а 1 поставь и будет тебе счастье

 

Поделиться сообщением


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

В общем получилось не так как я хотел изначально, ну да и ладно, главное что работает, пусть криво и убого, но веть работает.

 

20000 монет при покупке (без таймера)

Спойлер

{ Game   : GoldenLand.exe
  Version: 
  Date   : 2020-11-19
  Author : MeVirus

  This script does blah blah blah
}

define(address,"Server.dll"+4CBDF)
define(bytes,8B 90 B0 00 00 00)

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

 
 
assert(address,bytes)
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  mov dword ptr[eax+000000B0],#20000
code:
  mov edx,[eax+000000B0]
  jmp return

address:
  jmp newmem
  nop
return:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
address:
  db bytes
  // mov edx,[eax+000000B0]

dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Server.dll"+4CBDF

"Server.dll"+4CBB5: 89 74 24 0C                       -  mov [esp+0C],esi
"Server.dll"+4CBB9: FF 34 AA                          -  push [edx+ebp*4]
"Server.dll"+4CBBC: 8B CB                             -  mov ecx,ebx
"Server.dll"+4CBBE: E8 29 10 00 00                    -  call Server.dll+4DBEC
"Server.dll"+4CBC3: 85 C0                             -  test eax,eax
"Server.dll"+4CBC5: 0F 84 98 00 00 00                 -  je Server.dll+4CC63
"Server.dll"+4CBCB: 8B 90 A8 00 00 00                 -  mov edx,[eax+000000A8]
"Server.dll"+4CBD1: 3B 54 24 14                       -  cmp edx,[esp+14]
"Server.dll"+4CBD5: 0F 85 88 00 00 00                 -  jne Server.dll+4CC63
"Server.dll"+4CBDB: 8B 74 24 10                       -  mov esi,[esp+10]
// ---------- INJECTING HERE ----------
"Server.dll"+4CBDF: 8B 90 B0 00 00 00                 -  mov edx,[eax+000000B0]
// ---------- DONE INJECTING  ----------
"Server.dll"+4CBE5: 3B F2                             -  cmp esi,edx
"Server.dll"+4CBE7: 0F 82 21 01 00 00                 -  jb Server.dll+4CD0E
"Server.dll"+4CBED: 3B F2                             -  cmp esi,edx
"Server.dll"+4CBEF: 0F 84 91 00 00 00                 -  je Server.dll+4CC86
"Server.dll"+4CBF5: 2B F2                             -  sub esi,edx
"Server.dll"+4CBF7: 3B 6B 10                          -  cmp ebp,[ebx+10]
"Server.dll"+4CBFA: 89 74 24 10                       -  mov [esp+10],esi
"Server.dll"+4CBFE: 73 12                             -  jae Server.dll+4CC12
"Server.dll"+4CC00: 8B 14 24                          -  mov edx,[esp]
"Server.dll"+4CC03: 8B 7B 14                          -  mov edi,[ebx+14]
}

 

 

Цитата

Дааа, я это сделал, не поздравляйте...

 

20000 монет при покупке (таймер 10 секунд)

Спойлер

{ Game   : GoldenLand.exe
  Version: 
  Date   : 2020-11-19
  Author : MeVirus

  This script does blah blah blah
}

[ENABLE]
{$LUA}
memrec=getAddressList().getMemoryRecordByID("1398")
memrec.color = 0x0008000
PlaySound(findTableFile([[Activate]]))
timer = createTimer(true)
timer:setInterval(100)
timer.OnTimer = function()
timer.destroy()
  sleep "10000"
  if memoryrecord_isActive(memrec) then
    memoryrecord_unfreeze(memrec)
    memrec.color = 0x00000ff
    PlaySound(findTableFile([[Deactivate]]))
  end
end

{$ASM}
aobscanmodule(money,Server.dll,8B 90 B0 00 00 00 3B F2) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:
  mov dword ptr[eax+000000B0],#20000
code:
  mov edx,[eax+000000B0]
  jmp return

money:
  jmp newmem
  nop
return:
registersymbol(money)

[DISABLE]

money:
  db 8B 90 B0 00 00 00

unregistersymbol(money)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Server.dll"+4CBDF

"Server.dll"+4CBB5: 89 74 24 0C                       -  mov [esp+0C],esi
"Server.dll"+4CBB9: FF 34 AA                          -  push [edx+ebp*4]
"Server.dll"+4CBBC: 8B CB                             -  mov ecx,ebx
"Server.dll"+4CBBE: E8 29 10 00 00                    -  call Server.dll+4DBEC
"Server.dll"+4CBC3: 85 C0                             -  test eax,eax
"Server.dll"+4CBC5: 0F 84 98 00 00 00                 -  je Server.dll+4CC63
"Server.dll"+4CBCB: 8B 90 A8 00 00 00                 -  mov edx,[eax+000000A8]
"Server.dll"+4CBD1: 3B 54 24 14                       -  cmp edx,[esp+14]
"Server.dll"+4CBD5: 0F 85 88 00 00 00                 -  jne Server.dll+4CC63
"Server.dll"+4CBDB: 8B 74 24 10                       -  mov esi,[esp+10]
// ---------- INJECTING HERE ----------
"Server.dll"+4CBDF: 8B 90 B0 00 00 00                 -  mov edx,[eax+000000B0]
// ---------- DONE INJECTING  ----------
"Server.dll"+4CBE5: 3B F2                             -  cmp esi,edx
"Server.dll"+4CBE7: 0F 82 21 01 00 00                 -  jb Server.dll+4CD0E
"Server.dll"+4CBED: 3B F2                             -  cmp esi,edx
"Server.dll"+4CBEF: 0F 84 91 00 00 00                 -  je Server.dll+4CC86
"Server.dll"+4CBF5: 2B F2                             -  sub esi,edx
"Server.dll"+4CBF7: 3B 6B 10                          -  cmp ebp,[ebx+10]
"Server.dll"+4CBFA: 89 74 24 10                       -  mov [esp+10],esi
"Server.dll"+4CBFE: 73 12                             -  jae Server.dll+4CC12
"Server.dll"+4CC00: 8B 14 24                          -  mov edx,[esp]
"Server.dll"+4CC03: 8B 7B 14                          -  mov edi,[ebx+14]
}

 

PS:

Спойлер

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

.

Поделиться сообщением


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

Доброго времени суток. Хотелось бы узнать у экспертов, как занопить в newmem, если при добавлении нопов в newmem, значение продолжается меняться. Вот пример...но тут мне пришлось нопить сам код (тогда значение в игре не меняется). А через newmem это можно как то сделать? Закомментировал в code ту функцию, которую нужно занопить. 
 

Спойлер

[ENABLE]

aobscanmodule(Energy,GameRus.exe,39 86 A8 0A 00 00) // should be unique
alloc(newmem,$1000)
 

label(code)
label(return)
 

newmem:
 

code:
  db 90 90 90 90
  //cmp [esi+00000AA8],eax
  jmp return


Energy:
  jmp newmem
  nop

return:
registersymbol(Energy)


[DISABLE]


Energy:
  db 39 86 A8 0A 00 00


unregistersymbol(Energy)
dealloc(newmem)

 

Изменено пользователем Конунг

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
59 минут назад, Конунг сказал:

как занопить в newmem

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Xipho сказал:

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

Да, я новичок. Но суть в том, что когда ее в коде нопишь, значения у персонажей становится максимальными и не падают. Вот оригинальный код на всякий случай. Там стоят комментарии, где такой же скрипт нопами, делает максимальное значение параметров. А вот через newmem не получается. Мне кажется через него правильнее будет, чем через code. А про cmp прочитаю, спасибо за наводку.

Спойлер

00460115: 8B CE                              - mov ecx,esi
00460117: E8 BE B2 FC FF             - call 0042B3DA
0046011C: 3B D8                             - cmp ebx,eax  //Религия
0046011E: 7D 02                              - jnl 00460122
00460120: FF 07                               - inc [edi]
00460122: 33 ED                              - xor ebp,ebp
00460124: A1 EC 7B 4F 00             - mov eax,[004F7BEC]
00460129: 8B C8                              - mov ecx,eax
0046012B: D1 F9                              - sar ecx,1
0046012D: 03 C1                             - add eax,ecx
// ---------- INJECTING HERE ----------
0046012F: 39 86 A8 0A 00 00       - cmp [esi+00000AA8],eax  //Энергия
// ---------- DONE INJECTING  ----------
00460135: 7E 06                             - jle 0046013D
00460137: 89 86 A8 0A 00 00      - mov [esi+00000AA8],eax
0046013D: A1 F0 7B 4F 00           - mov eax,[004F7BF0]
00460142: 8B C8                            - mov ecx,eax
00460144: D1 F9                            - sar ecx,1
00460146: 03 C1                            - add eax,ecx
00460148: 39 86 AC 0A 00 00     - cmp [esi+00000AAC],eax  //Стамина
0046014E: 7E 06                            - jle 00460156
00460150: 89 86 AC 0A 00 00     - mov [esi+00000AAC],eax
00460156: A1 F4 7B 4F 00           - mov eax,[004F7BF4]

 

Изменено пользователем Конунг

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
33 минуты назад, Конунг сказал:

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

Вот как почитаешь про инструкцию, станет понятно, почему так происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
18 часов назад, Конунг сказал:

Да, я новичок. Но суть в том, что когда ее в коде нопишь, значения у персонажей становится максимальными и не падают. Вот оригинальный код на всякий случай. Там стоят комментарии, где такой же скрипт нопами, делает максимальное значение параметров. А вот через newmem не получается. Мне кажется через него правильнее будет, чем через code. А про cmp прочитаю, спасибо за наводку.

  Скрыть контент

00460115: 8B CE                              - mov ecx,esi
00460117: E8 BE B2 FC FF             - call 0042B3DA
0046011C: 3B D8                             - cmp ebx,eax  //Религия
0046011E: 7D 02                              - jnl 00460122
00460120: FF 07                               - inc [edi]
00460122: 33 ED                              - xor ebp,ebp
00460124: A1 EC 7B 4F 00             - mov eax,[004F7BEC]
00460129: 8B C8                              - mov ecx,eax
0046012B: D1 F9                              - sar ecx,1
0046012D: 03 C1                             - add eax,ecx
// ---------- INJECTING HERE ----------
0046012F: 39 86 A8 0A 00 00       - cmp [esi+00000AA8],eax  //Энергия
// ---------- DONE INJECTING  ----------
00460135: 7E 06                             - jle 0046013D
00460137: 89 86 A8 0A 00 00      - mov [esi+00000AA8],eax
0046013D: A1 F0 7B 4F 00           - mov eax,[004F7BF0]
00460142: 8B C8                            - mov ecx,eax
00460144: D1 F9                            - sar ecx,1
00460146: 03 C1                            - add eax,ecx
00460148: 39 86 AC 0A 00 00     - cmp [esi+00000AAC],eax  //Стамина
0046014E: 7E 06                            - jle 00460156
00460150: 89 86 AC 0A 00 00     - mov [esi+00000AAC],eax
00460156: A1 F4 7B 4F 00           - mov eax,[004F7BF4]

 

Тебе или наверное всем(и мне тоже)) нужен справочник команд ассемблера; про NOP - http://www.club155.ru/x86cmd/NOP , про CMP  http://www.club155.ru/x86cmd/CMP . Дело в том что когда ты нопишь инструкцию CMP. проверка не происходит и значение не меняется.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, NubZilla сказал:

Тебе или наверное всем(и мне тоже)) нужен справочник команд ассемблера; про NOP, про CMP. Дело в том что когда ты нопишь инструкцию CMP. проверка не происходит и значение не меняется.

 

 

 

Не надо публично, рекламировать сторонние ресурсы, напиши личное сообщение.

Поделиться сообщением


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

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

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

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