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

Ответ
 
Опции темы
Старый 23.07.2010, 15:56   #1
-= Элитный Мастер =-
 Главнокомандующий
Аватар для 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 сообщениях
 
По умолчанию Создание бота для PW. Часть 1. C# version

> Создание бота на C# 2.0 Часть 1 <

Данный гайд является основоположником серии гайдов посвященным созданию бота/ботов для игры PW.

Вступление:
Бот (сокр. от «робот») — в Википедии специальная программа для совершения рутинных операций.

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

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

Приступим:
  1. Создадим новый проект WinForms
    Накидываем на нашу форму 2 элемента Label и 2 элемента ProgressBar и расположим их как нам угодно.
    Например так:

    [Ссылки могут видеть только зарегистрированные пользователи. ]

  2. Данные наш бот будет получать из памяти клиента PW. Для этого нам придется прибегнуть к функции ReadProcessMemory из библиотеки kernel32.
    .NET Framework позволяет нам подключать и использовать методы из библиотек написанных не на управляемом коде (managed code).

    В этом нам поможет DllImport, который находится в пространстве имен System.Runtime.InteropServices.

    Код:
                // Импортируем функцию для чтения памяти чужого процесса 
                // из kernel32
                [DllImport("kernel32.dll")]
                public static extern Int32 ReadProcessMemory(
                    IntPtr hProcess,
                    IntPtr lpBaseAddress,
                    [In, Out] byte[] buffer,
                    UInt32 size,
                    out IntPtr lpNumberOfBytesRead
                    );
  3. Покодив немного у меня получился такой класс для чтения памяти клиента PW.

    Примечание: этот класс использует namespace: System.Diagnostics и System.Runtime.InteropServices соответственно надо не забыть их подключить.

    Код:
            public class Monitor
            {
                // Объявление события
                public event EventHandler InfoUpdated;
                // Метод, который вызывает событие
                private void OnInfoUpdated(object sender, EventArgs e)
                {
                    if (InfoUpdated != null) InfoUpdated(sender, e);
                }
    
                // Импортируем функцию для чтения памяти чужого процесса 
                // из kernel32
                [DllImport("kernel32.dll")]
                public static extern Int32 ReadProcessMemory(
                    IntPtr hProcess,
                    IntPtr lpBaseAddress,
                    [In, Out] byte[] buffer,
                    UInt32 size,
                    out IntPtr lpNumberOfBytesRead
                    );
    
                // Определение базового адреса и оффсетов
                // для текущей версии клиента руоффа (130)
                private int baseAddress =   0x98B47C,
                            offsetHP =      0x464,
                            offsetMP =      0x468,
                            offsetMaxHP =   0x494,
                            offsetMaxMP =   0x498;
    
                // Служебная переменная для хранения PID процесса
                private Int32 PID = 0;
                private Timer updateTimer;
    
                // Свойство, для хранения текущего HP
                public Int32 HP { get; set; }
                // Свойство, для хранения текущего MP
                public Int32 MP { get; set; }
                // по аналогии
                public Int32 MaxHP { get; set; }
                // по аналогии
                public Int32 MaxMP { get; set; }
    
                public Monitor(int pid)
                {
                    this.PID = pid;
    
                    updateTimer = new Timer();
                    updateTimer.Enabled = true;
                    updateTimer.Interval = 500;
                    updateTimer.Tick += new EventHandler(updateTimer_Tick);
                }
    
                /// <summary>
                /// Данный метод вызывается каждый тик таймера
                /// Здесь происходит чтение из памяти клиента значений
                /// жизни и маны
                /// </summary>
                private void updateTimer_Tick(object sender, EventArgs e)
                {
                    try
                    {
                        if (PID != 0)
                        {
                            IntPtr handle = Process.GetProcessById(PID).Handle;
    
                            HP = HighLevelReadIntFromMemory(handle, offsetHP);
                            MP = HighLevelReadIntFromMemory(handle, offsetMP);
                            MaxHP = HighLevelReadIntFromMemory(handle, offsetMaxHP);
                            MaxMP = HighLevelReadIntFromMemory(handle, offsetMaxMP);
    
                            OnInfoUpdated(this, new EventArgs());
                        }
                    }
                    catch (Exception ex)
                    {
                        updateTimer.Enabled = false;
                        MessageBox.Show(ex.Message);
                    }
                }
    
                /// <summary>
                /// Читаем Int'овое значение из памяти приложения 
                /// с указанным оффсетом
                /// </summary>
                private Int32 HighLevelReadIntFromMemory(IntPtr handle, int offset)
                {
                    byte[] buffer = new byte[0];
                    IntPtr read = IntPtr.Zero;
                    int temp = 0;
                    temp = LowLevelReadIntFromMemory(handle, baseAddress);
                    temp = LowLevelReadIntFromMemory(handle, temp + 0x20);
                    temp = LowLevelReadIntFromMemory(handle, temp + offset);
                    return temp;
                }
    
                /// <summary>
                /// Читаем из памяти приложения массив байт по указанному адресу
                /// и возвращаем целочисленное его представление
                /// </summary>
                private Int32 LowLevelReadIntFromMemory(IntPtr handle, int address)
                {
                    byte[] buffer = new byte[4];
                    IntPtr read = IntPtr.Zero;
                    ReadProcessMemory(handle, (IntPtr)address, buffer, 4, out read);
                    return (int)BitConverter.ToUInt32(buffer, 0);
                }
            }
  4. Теперь как обычно: создадим объект нашего класса Monitor в теле главного класса.
    Код:
    private Monitor mon;

  5. В конструкторе главного класса, в данном случаи это наша форма сделаем следующее:
    Код:
                Process[] p = Process.GetProcessesByName("elementclient");
                
                if(p != null)
                {
                    if (p.Length > 0)
                    {
                        // инициализируем новый объект класса Monitor
                        // передаем туда PID первого процесса из найденных
                        mon = new Monitor((int)p[0].Id);
                        // Подписываемся на событие, в котором будем обновлять
                        // пользовательский интерфейс
                        mon.InfoUpdated += new EventHandler(mon_InfoUpdated);
                    }
                }
    В тело нашего главного класса добавляем метод, который вызывается каждый раз когда срабатывает событие InfoUpdated класса Monitor.

    Код:
    private void mon_InfoUpdated(object sender, EventArgs e)
            {
                label1.Text = String.Format("HP: {0} / {1}", mon.HP, mon.MaxHP);
                label2.Text = String.Format("MP: {0} / {1}", mon.MP, mon.MaxMP);
    
                progressBar1.Value = (int)((mon.HP * 100) / Math.Max(mon.MaxHP, 1));
                progressBar2.Value = (int)((mon.MP * 100) / Math.Max(mon.MaxMP, 1));
            }
    Примечание: не забываем подключить namespace: System.Diagnostics. Данный неймспейс содержит в себе класс для работы с процессами.
  6. После сборки проекта и тестирования мы получили результат:

    [Ссылки могут видеть только зарегистрированные пользователи. ]

    З.Ы. На скрине небольшая неувязочка со значением MP в клиенте и нашей програмке. Причина: окно PW заморозилось, когда фокус был с него снят.

В аттаче находится рабочий проект созданный на MS Visual Studio 2008 Professional.

Полезные ссылки:
Вложения
Тип файла: rar ReadMemory.rar (149.3 Кб, 606 просмотров)
________________
Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
  Ответить с цитированием
8 пользователя(ей) сказали cпасибо:
(RISE) (22.10.2021), Dunя (05.08.2010), Ликвид (04.08.2010), Leo_ня (28.07.2010), OrBiT_DaRk[2] (09.12.2011), Sirioga (04.08.2010), warl0ck (11.08.2010), zadro[B]ot (19.04.2011)
Старый 05.08.2010, 20:18   #2
 Сержант
Аватар для Dunя
 
Dunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе ценуDunя знает себе цену
Регистрация: 27.01.2010
Сообщений: 145
Популярность: 4300
Сказал(а) спасибо: 357
Поблагодарили 150 раз(а) в 121 сообщениях
Отправить сообщение для Dunя с помощью ICQ Отправить сообщение для Dunя с помощью Skype™
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Пункт №2 не понял вообще. Можно подробнее Что? Где? как?
________________
Цитата:
Сообщение от MaTEMAtika(2)Посмотреть сообщение
ты кого блин ПОЦОНАМИ называешь,жаль что я не рядом с тобой,щас бы по больницам валялся...

  Ответить с цитированием
Старый 06.08.2010, 11:00   #3
-= Элитный Мастер =-
 Главнокомандующий
Аватар для 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: Создание бота для PW. Часть 1. C# version

Dunя, в самом верху файла класса, где прописаны все using'и, добавляем новый
Код:
using System.Runtime.InteropServices;
Затем в теле класса добавляем метод, который будет вызываться из библиотеки Kernel32.

Код:
            // Импортируем функцию для чтения памяти чужого процесса 
            // из kernel32
            [DllImport("kernel32.dll")]
            public static extern Int32 ReadProcessMemory(
                IntPtr hProcess,
                IntPtr lpBaseAddress,
                [In, Out] byte[] buffer,
                UInt32 size,
                out IntPtr lpNumberOfBytesRead
                );
А потом используем его по обстоятельствам
________________
Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
  Ответить с цитированием
Пользователь сказал cпасибо:
Dunя (06.08.2010)
Старый 12.09.2010, 10:04   #4
 Разведчик
Аватар для egoistu
 
egoistu никому не известный тип
Регистрация: 05.09.2010
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Привет,
TBX1n помоги пожалуйсто с чтением других значений...
оффсеты вроде есть... (http://zhyk.ru/forum/showthread.php?t=116673)
и читает норм численые значения типа хп/мп перса... а вот текст или флоат не фочет...
никак не разберусь...

как получить имя перса, моба, хп/мах хп моба и так далее...
заранее спасибо за любую инфу...

(Я в Си Шарп новенкий, не смейтесь.... не издевайтесь )

кстати спасибо за ранее написаное, там всё ясненько было
  Ответить с цитированием
Старый 13.09.2010, 18:27   #5
-= Элитный Мастер =-
 Главнокомандующий
Аватар для 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: Создание бота для PW. Часть 1. C# version

Код:
[DllImport("kernel32.dll")]
private static extern Int32 ReadProcessMemory(
    IntPtr hProcess,
    Int32 lpBaseAddress,
    [In, Out] byte[] buffer,
    Int32 size,
    out int lpNumberOfBytesRead
    );

private Single ReadFloatFromMemory(int address)
{
    int read = 0;
    byte[] buffer = new byte[8];

    ReadProcessMemory(ProcessHandle, address, buffer, 8, out read);

    return BitConverter.ToSingle(buffer, 0);
}

private String ReadStringFromMemory(int address, int length)
{
    int read = 0; string rtnStr = string.Empty;
    byte[] buffer = new byte[length];

    ReadProcessMemory(ProcessHandle, address, buffer, length, out read);

    UnicodeEncoding enc = new UnicodeEncoding();
    rtnStr = enc.GetString(buffer);

    return rtnStr.Substring(0, rtnStr.IndexOf('\0'));
}
Вот мои 2 метода, для чтения Float и String из памяти клиента.

При чтении строки, размер мы явно не знаем и читает с запасом, но чтобы лишний мусор не выципить, я обрезаю строку до первого нулевого символа. По хорошему не мешает добавить проверку, существует ли вообще нулевой символ, а потом до него резать.
________________
Fireball - Быстрое снятие и загрузка скриншотов на хостинг.
  Ответить с цитированием
Старый 28.10.2010, 13:02   #6
 Разведчик
Аватар для Nikita009
 
Nikita009 никому не известный тип
Регистрация: 29.07.2010
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

А ты можешь прогу написать чтоб только ХП показывал в свёрнутом клиенте
  Ответить с цитированием
Старый 30.12.2010, 08:34   #7
 Разведчик
Аватар для BotDruLife
 
BotDruLife никому не известный тип
Регистрация: 27.12.2010
Сообщений: 7
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Как читать данные по оффсетам разобрались!!! Большое-при-большое спасибо!!!

Напиши теперь как двигать персонажем, как магичить... и все такое!!! очень жду!!!
  Ответить с цитированием
Старый 01.02.2011, 19:29   #8
 Разведчик
Аватар для xselderx
 
xselderx никому не известный тип
Регистрация: 03.01.2011
Сообщений: 16
Популярность: 12
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 2 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Цитата:
Сообщение от TBX1nПосмотреть сообщение
Данные наш бот будет получать из памяти клиента PW. Для этого нам придется прибегнуть к функции ReadProcessMemory из библиотеки kernel32.
.NET Framework позволяет нам подключать и использовать методы из библиотек написанных не на управляемом коде (managed code).

непонятно((( и у меня нету System.Runtime.InteropServices. в ссылках
  Ответить с цитированием
Старый 07.02.2011, 01:03   #9
 Разведчик
Аватар для bohdan09
 
bohdan09 на правильном пути
Регистрация: 10.01.2011
Сообщений: 21
Популярность: 43
Сказал(а) спасибо: 78
Поблагодарили 45 раз(а) в 13 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Неплохо, есть коменты к коду - респект жду продолжения уроков!!!!))

Последний раз редактировалось bohdan09; 07.02.2011 в 01:08.
  Ответить с цитированием
Старый 04.03.2011, 17:22   #10
Заблокирован
 Разведчик
Аватар для 67boy
 
67boy никому не известный тип
Регистрация: 02.01.2011
Сообщений: 13
Популярность: 12
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Класс спасибо, но как же еще чтобы полоса опыта выводилась???
Скажите плз!!!

Добавлено через 8 минут
И как поменять это для другой игры например??
Заранее спасибо за ответы!!!!

Последний раз редактировалось 67boy; 04.03.2011 в 17:31. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.03.2011, 00:26   #11
 Разведчик
Аватар для Teslatrooper
 
Teslatrooper никому не известный тип
Регистрация: 20.03.2011
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

baseAddress = 0x009C1514,
offsetHP = 0x46C,
offsetMP = 0x470,
offsetMaxHP = 0x4A4,
offsetMaxMP = 0x4A8;

на РуОФФ код работоспособен с таким базовым адресом и оффсетами
  Ответить с цитированием
Старый 26.03.2011, 01:41   #12
 Разведчик
Аватар для eXziiii
 
eXziiii никому не известный тип
Регистрация: 09.02.2011
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Здравствуйте, нашел baseadress и offset hp и mp
Взял для базы этот код и применил для Runes of magic
А он всегда выдает 0\0 и 0\0.
В чем может быть беда?
У меня еще есть 1 offset который я не где не указываю 0x598, может дело в этом?
Спасибо
Вот код.
Код:
        // Объявление события
        public event EventHandler InfoUpdated;
        // Метод, который вызывает событие
        private void OnInfoUpdated(object sender, EventArgs e)
        {
            if (InfoUpdated != null) InfoUpdated(sender, e);
        }

        // Импортируем функцию для чтения памяти чужого процесса 
        // из kernel32
        [DllImport("kernel32.dll")]
        public static extern Int32 ReadProcessMemory(
            IntPtr hProcess,
            IntPtr lpBaseAddress,
            [In, Out] byte[] buffer,
            UInt32 size,
            out IntPtr lpNumberOfBytesRead
            );

        // Определение базового адреса и оффсетов
        // для текущей версии клиента руоффа (130)
        private int baseAddress = 0x5BC394,
                    offsetHP = 0x2C8,
                    offsetMP = 0x2D4,
                    offsetMaxHP = 0x2D0,
                    offsetMaxMP = 0x2D8;

        // Служебная переменная для хранения PID процесса
        private Int32 PID = 0;
        private Timer updateTimer;

        // Свойство, для хранения текущего HP
        public Int32 HP { get; set; }
        // Свойство, для хранения текущего MP
        public Int32 MP { get; set; }
        // по аналогии
        public Int32 MaxHP { get; set; }
        // по аналогии
        public Int32 MaxMP { get; set; }

        public Monitor(int pid)
        {
            this.PID = pid;

            updateTimer = new Timer();
            updateTimer.Enabled = true;
            updateTimer.Interval = 500;
            updateTimer.Tick += new EventHandler(updateTimer_Tick);
        }

        /// <summary>
        /// Данный метод вызывается каждый тик таймера
        /// Здесь происходит чтение из памяти клиента значений
        /// жизни и маны
        /// </summary>
        private void updateTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                if (PID != 0)
                {
                    IntPtr handle = Process.GetProcessById(PID).Handle;

                    HP = HighLevelReadIntFromMemory(handle, offsetHP);
                    MP = HighLevelReadIntFromMemory(handle, offsetMP);
                    MaxHP = HighLevelReadIntFromMemory(handle, offsetMaxHP);
                    MaxMP = HighLevelReadIntFromMemory(handle, offsetMaxMP);

                    OnInfoUpdated(this, new EventArgs());
                }
            }
            catch (Exception ex)
            {
                updateTimer.Enabled = false;
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Читаем Int'овое значение из памяти приложения 
        /// с указанным оффсетом
        /// </summary>
        private Int32 HighLevelReadIntFromMemory(IntPtr handle, int offset)
        {
            byte[] buffer = new byte[0];
            IntPtr read = IntPtr.Zero;
            int temp = 0;
            temp = LowLevelReadIntFromMemory(handle, baseAddress);
            temp = LowLevelReadIntFromMemory(handle, temp + 0x20);
            temp = LowLevelReadIntFromMemory(handle, temp + offset);
            return temp;
        }

        /// <summary>
        /// Читаем из памяти приложения массив байт по указанному адресу
        /// и возвращаем целочисленное его представление
        /// </summary>
        private Int32 LowLevelReadIntFromMemory(IntPtr handle, int address)
        {
            byte[] buffer = new byte[4];
            IntPtr read = IntPtr.Zero;
            ReadProcessMemory(handle, (IntPtr)address, buffer, 4, out read);
            return (int)BitConverter.ToUInt32(buffer, 0);
        }
  Ответить с цитированием
Старый 11.09.2011, 02:11   #13
 Разведчик
Аватар для [ICEBERG]
 
[ICEBERG] никому не известный тип
Регистрация: 10.09.2011
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

// 1.4.2 build 2305
int xBaseAddress = 0xA5BFCC,
xOffsetHP = 0x474,
xOffsetMaxHP = 0x4B4;
11.09.2011 проверенно работает
  Ответить с цитированием
Старый 29.10.2011, 01:00   #14
 Разведчик
Аватар для demon6
 
demon6 никому не известный тип
Регистрация: 12.09.2011
Сообщений: 16
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

Цитата:
Сообщение от TBX1nПосмотреть сообщение
private Int32 HighLevelReadIntFromMemory(IntPtr handle, int offset) { byte[] buffer = new byte[0]; IntPtr read = IntPtr.Zero; int temp = 0; temp = LowLevelReadIntFromMemory(handle, baseAddress); temp = LowLevelReadIntFromMemory(handle, temp + 0x20); temp = LowLevelReadIntFromMemory(handle, temp + offset); return temp; }

а что здесь temp + 0x20 откуда эта цифра
  Ответить с цитированием
Старый 29.10.2011, 12:33   #15
 Разведчик
Аватар для lololol1
 
lololol1 никому не известный тип
Регистрация: 17.10.2011
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создание бота для PW. Часть 1. C# version

я все понел спасибо создателю темы!)
  Ответить с цитированием
Ответ

Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Создаём фейк программмы. Часть 2. C# version Kitsune C# 13 10.11.2012 22:34
[Руководство] Создаём фейк программмы. Часть 2. C# version (by OveRKinG) OveRKinG C# 35 12.01.2012 08:42
[Руководство] Создаём фейк программмы. Часть 1. Delphi version Amba Pascal/Delphi 38 30.05.2011 23:27
[Руководство] Создаём фейк программмы. Часть 1. C# version Kitsune C# 116 27.02.2011 03:41
[Руководство] Создаём фейк программмы. Часть 2. Delphi version Amba Школа Читера 1 15.07.2010 14:50

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

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

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