Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Как написать бота с нуля [Borland C++ Builder 6]

-

Разработка ПО для Perfect World

- Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World

Ответ
 
Опции темы
Старый 01.05.2012, 22:02   #1
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Как написать бота с нуля [Borland C++ Builder 6]

Попробую собрать воедино разбросанную по форуму информацию и применить её к созданию конкретной простенькой программы-бота. Я не говорю в этой теме как НУЖНО делать, а всего лишь показываю, как МОЖНО сделать. Расчитана данная статья на программистов, использующих среду Borland C++ Builder(так как пример будет реализован именно в ней), но думаю что и другим пригодится. Всю статью разбил на несколько частей, так как объём получился не маленький, вероятность чего, кстати, ожидалась. Могут присутствовать какие-либо ошибки, так как я не гуру программирования. Замечания и указания на ошибки ожидаются.

АДРЕСА И ОФСЕТЫ СЛЕДУЕТ ЗАМЕНИТЬ НА НОВЫЕ


РАЗДЕЛ 1: ПОЛУЧАЕМ ДАННЫЕ ИЗ КЛИЕНТА

РАЗДЕЛ 2: ИНЖЕКТЫ ИЛИ "НЕ ТАК СТРАШЕН ЧЁРТ, КАК ЕГО МАЛЮЮТ"

РАЗДЕЛ 3: ПАКЕТЫ

Продолжение...
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 25.01.2013 в 02:39.
  Ответить с цитированием
12 пользователя(ей) сказали cпасибо:
388672 (07.12.2012), ASDitsh (30.10.2012), ktulx (05.05.2012), Meg(0) (19.05.2012), Nek1t (06.07.2012), nppp (26.06.2014), Pa' (13.06.2012), RemoteAccess (14.08.2012), samosi (01.05.2012), VeTaL_UA (04.07.2012), xXx407 (01.05.2012), YasheRrr (18.11.2017)
Старый 01.05.2012, 23:13   #2
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Прочитал РАЗДЕЛ 1.
В общем виде всё, казалось бы, довольно неплохо, но есть к чему придраться.
А именно..

Чуть позже продолжу чтение.)
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 01.05.2012, 23:32   #3
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
1. Слово "адрес" в английском пишется с двумя буквами d; "-то", "-либо", "-нибудь" и "-таки" пишутся с дефисом; слово "аккуратно" пишется не через "о";
В некоторых предложениях отсутствуют точки.

Постараюсь исправить, местами бегло писал.

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
2. Некоторые примеры кода не заключены в теги "CODE".

Это в основном отдельные строчки, которые не представляют из себя логически целостного кода, не разделённого комментариями. Я такие строки цветом выделил.

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
3. Функция PIDByProcName закрывает хендл "pHandle" лишь в случае успешного нахождения процесса; отсутствует проверка верхнего регистра имени процесса (а это действительно важно, ведь у некоторых процесс называется "ElementClient.exe", у некоторых - "elementclient.EXE", у кого-то - "ELEMENTCLIENT.EXE", не говоря уже о таком имени как "ELEME~1.EXE".

попробую исправить, раньше я не таким способом делал, осталось вспомнить КАК я делал раньше))

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Вы ведь понимаете, что она открывает и закрывает хендл процесса 7 раз подряд?

Да, но ради простоты можно чем-нибудь и пожнртвовать..
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Немного нарушена логика (последовательность) статьи, сложновато/бегло объяснены некоторые моменты (классы и структуры / пример со структурами str1 и str2).

Тут я исправит скорее всего не смогу, так как писал паралельно с созданием программы, и порядок действий сам собой напрашивался..
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Старый 01.05.2012, 23:48   #4
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Что ж, осилил вторую часть :D

Цитата:
Сообщение от dwa83Посмотреть сообщение
Указатель на память для параметров я получаю так - к адресу начала выделенной памяти прибавляю 64 (64*DWORD=64*4=256) тоесть на 256 байт дальше от начала области памяти.

Зачем это тут умножение на размер DWORD? 64 в данном случае - количество байтов, а не переменных. Поэтому смело прибавляйте 256. Дальше по статье идёт пример, где записывается функция и параметры к ней по адресам +0 и +256 (якобы), а на самом деле - по +0 и +64, т.е. Ваша 'самая длинная и страшная' функция бега по координатам, вероятно, будет наполовину перезаписана параметрами, что вызовет краш клиента.

И инжектор "строчек кода" неудобен тем, что нельзя будет нормально отредактировать внедряемый код.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 01.05.2012, 23:56   #5
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
данном случае - количество байтов

Нет, всё верно, проверенно.
У нас указатель типа DWORD. Если к нему прибавить 1, то на самом деле указатель сместится на размер DWORD. Видимо такая фишка у указателей в отличие от обычных чисел.
Или такой пример:
WORD mass[30];
Если использовать mass без скобок, он будет восприниматься как указатель на нулевой элемент массива. Но если указать mass+1, это воспринимается как указатель на 1 элемент массива, а его адрес смещён от нулевого на WORD. Поэтому фактически число, представляющее адрес, увеличится не на 1 а на 2 байта.

Даже проверил, а то покоя не даст ))


Добавлено через 27 минут
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
И инжектор "строчек кода" неудобен тем, что нельзя будет нормально отредактировать внедряемый код.

Мне кажется, что редактировать придётся только в случае глобального изменения клиента после обновления(в случае если инжекты напроч изменятся). После последнего обновления вроде ничего страшного не произошло, адрес изменился, но он вынесен в оффсеты и вписывается в эту строчку отдельно.
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 02.05.2012 в 00:24. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 02.05.2012, 02:33   #6
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

dwa83, да, всё верно. Это я не обратил внимание, что там указатель на DWORD, а не просто DWORD.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 04.05.2012, 23:19   #7
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Здравствуй dwa83! Я новичок в программирования. ТЫ можешь скинуть Код. В файлах Unit1, Bot, Client.
Зачем это? Это для того что бы можно было понять куда прописывать коды. Нужно ли прописывать коды находящегося в не Цитаты. Ну например hProc = OpenProcess(PROCESS_ALL_ACCESS,false,PID); Нужно ли это вставлять в файлы. Если нужно, то куда. Как в этом месте понять: HANDLE OpenProcess(
DWORD dwDesiredAccess, // флажок доступа - сюда что то нужно писать, или это обьяснение
BOOL bInheritHandle, // параметр дескриптора наследования
DWORD dwProcessId // идентификатор процесса
);
Я очень прошу более подробнее написать\исправить статью.Пожалуйста. Просто не понятно что куда вставлять?
  Ответить с цитированием
Старый 05.05.2012, 00:56   #8
 Разведчик
Аватар для vogel
 
vogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личностьvogel определенно авторитетная личность
Регистрация: 17.09.2009
Сообщений: 46
Популярность: 1187
Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Просто не понятно что куда вставлять?

Может быть тогда стоит начать со знакомства с языком программирования и средой разработки ?
Ибо вот эта цитата подсказывает, что бота вы "с наскока" не напишите.
  Ответить с цитированием
Старый 05.05.2012, 01:05   #9
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Нет, я не которое понимаю куда вставлять но. В статье присутствует такой код как hProc = OpenProcess(PROCESS_ALL_ACCESS,false,PID); - Это в обще нужно куда то вставлять.
И OpenProcess кода в С++ нет. При запуске компиляции. Он не понемает этот код! Либо я что то не доганяю
  Ответить с цитированием
Старый 05.05.2012, 03:23   #10
-= Элитный Мастер =-
 Главнокомандующий
Аватар для Kitsune
 
Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(
Регистрация: 20.01.2010
Сообщений: 1,539
Популярность: 22780
Золото Zhyk.Ru: 600
Сказал(а) спасибо: 43
Поблагодарили 1,717 раз(а) в 538 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Нет, я не которое понимаю куда вставлять но. В статье присутствует такой код как hProc = OpenProcess(PROCESS_ALL_ACCESS,false,PID); - Это в обще нужно куда то вставлять.
И OpenProcess кода в С++ нет. При запуске компиляции. Он не понемает этот код! Либо я что то не доганяю

[Ссылки могут видеть только зарегистрированные пользователи. ]
MEGAFACEPALM
  Ответить с цитированием
Старый 05.05.2012, 03:39   #11
 Разведчик
Аватар для Foreworld
 
Foreworld никому не известный тип
Регистрация: 18.08.2011
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от TBX1nПосмотреть сообщение
[Ссылки могут видеть только зарегистрированные пользователи. ]
MEGAFACEPALM

Таких как ты дофига. А как объяснить не фига!
  Ответить с цитированием
Старый 05.05.2012, 04:22   #12
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Таких как ты дофига. А как объяснить не фига!

Таких, как ты, ещё больше. Я бы сказал 95%.
Объяснить нифига? Сперва изучи хоть что-нибудь, а потом задавай вопросы, чтобы форумчанам было хотя бы понятно, чем тебе вообще можно помочь. С нуля тебя никто учить не собирается.

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

P.S. Ах да, первое, что тебе стоит получше выучить - родной язык. Да, такая вот горькая правда.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 05.05.2012, 04:27   #13
 Пехотинец
Аватар для ktulx
 
ktulx на правильном пути
Регистрация: 01.08.2011
Сообщений: 70
Популярность: 24
Сказал(а) спасибо: 45
Поблагодарили 7 раз(а) в 7 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Очень интересно, ещё читаю )
Можете помочь мне?
Код:
//BA +0x1C +0x1C +0x20 +0x18 +(i*0x4) +0x4 /i = 0 - 0x300/

for i:=0 to 768 do begin

    ReadProcessMemory (hProcess, Pointer($A571E0), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+$1C), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+$1C), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+$20), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+$18), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+i*$04), @A, sizeof(A), NoB);
    ReadProcessMemory (hProcess, Pointer(A+$04), @A, sizeof(A), NoB);
  if A<>0 then begin
       ReadProcessMemory (hProcess, Pointer(A+$480), @A, sizeof(A), NoB);
       ShowMessage(IntToStr(A));
  end;
end;
Делфи, правда, но не суть. Читаю уровни окружающих игроков. Вместо этого в А записывается непонятное семизначное число. Происходит это столько раз, сколько персов вокруг меня, то есть где-то в конце напортачил, видимо.

Спасибо.
  Ответить с цитированием
Старый 05.05.2012, 07:41   #14
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

Цитата:
Сообщение от ForeworldПосмотреть сообщение
Здравствуй dwa83! Я новичок в программирования. ТЫ можешь скинуть Код. В файлах Unit1, Bot, Client.
Зачем это? Это для того что бы можно было понять куда прописывать коды. Нужно ли прописывать коды находящегося в не Цитаты. Ну например hProc = OpenProcess(PROCESS_ALL_ACCESS,false,PID); Нужно ли это вставлять в файлы. Если нужно, то куда. Как в этом месте понять: HANDLE OpenProcess(
DWORD dwDesiredAccess, // флажок доступа - сюда что то нужно писать, или это обьяснение
BOOL bInheritHandle, // параметр дескриптора наследования
DWORD dwProcessId // идентификатор процесса
);
Я очень прошу более подробнее написать\исправить статью.Пожалуйста. Просто не понятно что куда вставлять?

Всё это указанно предварительно, как будет выглядеть в программе, а дальше уже в коде используется, напримнр в функции
Цитата:
Сообщение от dwa83Посмотреть сообщение
DWORD READER::Read_32(DWORD addr) { HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid); // открываем процесс DWORD value; ReadProcessMemory(hProcess,addr,&value,4,0); // считываем значение по заданному адресу CloseHandle(hProcess); // закроем процесс return value; // вернём считанное значение }

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

Добавлено через 40 минут
Цитата:
Сообщение от dwa83Посмотреть сообщение
можешь скинуть Код. В файлах Unit1, Bot, Client.

ссылка на готовый проект в конце четвёртго раздела

Добавлено через 54 минуты
ktulx,
//BA +0x1C +0x1C +0x20 +0x18 +(i*0x4) +0x4 /i = 0 - 0x300/

for i:=0 to 767 do begin (всего 768, но отсчёт ведь от нуля)

ReadProcessMemory (hProcess, Pointer($A571E0), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$1C), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$1C), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$20), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$18), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+i*$04), @A, sizeof(A), NoB);
ReadProcessMemory (hProcess, Pointer(A+$04), @A, sizeof(A), NoB);
if A<>0 then begin

ReadProcessMemory (hProcess, Pointer(A+$480), @A, sizeof(A), NoB);
ShowMessage(IntToStr(A));
end;
end;

sizeof(A) лучше просто записать как 4(не будет лишнего вычисления размера, ведь значения адресов всегда 4 байта)
И ещё, значения некоторых параметров сервер посылает клиенту только во время "плотного" взаимодействия с этим игроком, например во время его выделения, а пока не выделишь, эти значения считаются пока не нужными и не посылаются. Чтобы считать параметры нескольких персонажей. нужно выделить первого, считать параметры, выделить второго и тд.

Добавлено через 59 минут
Цитата:
Сообщение от ForeworldПосмотреть сообщение
И OpenProcess кода в С++ нет. При запуске компиляции. Он не понемает этот код! Либо я что то не доганяю

vcl.h не забыли подключить к модулю?
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#include "Offsets.h"

#ifndef ReaderH
#define ReaderH

struct COORDS
{
  float x;
  float y;
  float z;
};

struct READER
{
  DWORD pid;       // PID
  DWORD Read_32(DWORD addr);
  float Read_float(DWORD addr);
  DWORD PersStruct(); 
. . .
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝

Последний раз редактировалось dwa83; 01.08.2012 в 04:56. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 05.05.2012, 08:56   #15
 Пехотинец
Аватар для ktulx
 
ktulx на правильном пути
Регистрация: 01.08.2011
Сообщений: 70
Популярность: 24
Сказал(а) спасибо: 45
Поблагодарили 7 раз(а) в 7 сообщениях
 
По умолчанию Re: Как написать бота с нуля [Borland C++ Builder 6]

A типа Dword.
За подсказки спасибо, но это не объясняет результат. По-моему я либо что-то сделал не так, либо чего-то ещё не сделал ) Ведь в А идут значения всех окружающих меня персов, точно, вот только вместо уровня персонажа, там что-то вроде 6756495.
  Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Написать бота! romel Вопросы и ответы, обсуждения 2 10.02.2012 18:39
[Помогите!] Как же написать бота? ХАМнаМИЛЛИОН Школа Читера 3 29.07.2011 20:58
[Помогите!] написать бота @ndreyk@ Общение и обсуждение Perfect World 32 23.07.2011 13:32
[Помогите!] хочу написать бота! Фестер Аддамс Общение и обсуждение (Тюряга ВК) 7 31.01.2011 22:36

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 23:52.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net