Логотип игрового форума RF-Cheats.ru    
Новости онлайн игр Правила форума Чёрный рынок Реклама и привилегии Гаранты Арбитраж

Вернуться   RF-Cheats.ru - форум читеров и ботоводов > > > > >
Важная информация

Общение читеров Теры

: Раздел для обсуждения игры Tera Online, а также для простого общения читеров.
Читы и обход фроста для RF Online без хайдаБоты и читы для Perfect World бесплатно без хайдаМоды и читы для World of Tanks (WoT) бесплатно без хайдаМоды и читы для Armored Warfare бесплатно без хайдаБоты и читы для DOTA 2 бесплатно без хайдаБоты и читы для Black Desert Online бесплатно без хайдаЧиты на ArcheAge бесплатно без хайдаЧиты для Warface бесплатно без хайдаВзлом ВКонтакте и ОдноклассниковСписок разделов со всеми играмиЧиты для онлайн игр




Ответ
 
Опции темы
Старый 07.04.2015, 15:57   #61
Dino
Проф. продавец
Аватар для Dino
OFFLINE
Регистрация: 23.07.2012
Сообщений: 2,402
Благодарностей:
886 всего
Мнения: + 3902
Репутация: 2656

надеюсь ты буффер для чтения не общий используешь

 
Ответить с цитированием


Старый 07.04.2015, 16:07   #62
Алексанw24
Нуб
Аватар для Алексанw24
OFFLINE
Регистрация: 01.04.2015
Сообщений: 0
Благодарностей:
0 всего
Репутация: 1

Начнём по порядку.
1)Класс с подключением библиотек win32
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;


namespace Win32Lib
{
    public static class Win32
    {

        public const int WM_SETCURSOR = 0x020;
        public const int WM_COMMAND = 0x111;
        public const int WM_KEYDOWN = 0x100;
        public const int WM_KEYUP = 0x101;
        public const int WM_CHAR = 0x102;
        public const int WM_MOUSEMOVE = 0x200;
        public const int WM_LBUTTONDOWN = 0x201;
        public const int WM_LBUTTONUP = 0x202;
        public const int WM_LBUTTONDBLCLK = 0x203;

        public const int GWL_EXSTYLE = -20;
        public const int WS_EX_TOOLWINDOW = 0x00000080;
        public const int WS_EX_APPWINDOW = 0x00040000;

        public delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("User32.dll")]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);


        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(int parentHandle, IntPtr childAfter, string lclassName, string windowTitle); 


        [DllImport("user32.dll")]
        public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);


        [DllImport("User32.dll")]
        public static extern Int32 SendMessage(IntPtr hWnd, uint Msg, int wParam, Int64 lParam);


        [DllImport("user32.dll")]
        public static extern int SetWindowLong(IntPtr window, int index, int
        value);


        [DllImport("user32.dll")]
        public static extern int GetWindowLong(IntPtr window, int index);

        [DllImport("user32.dll")]
        public static extern byte VkKeyScan(char ch);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);



        [DllImport("kernel32.dll")]
        public static extern int OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll")]
        public static extern bool WriteProcessMemory(int hProcess, uint lpBaseAddress, byte[] buffer, int size, int lpNumberOfBytesWritten);

        [DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(int hProcess, uint lpBaseAddress, byte[] buffer, int size, int lpNumberOfBytesRead);

        [DllImport("kernel32.dll")]
        public static extern Int32 CloseHandle(int hProcess);

        [DllImport("user32.dll")]
        public static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

        public enum ProcessAccessFlags : uint
        {
            All = 0x001F0FFF,
            Terminate = 0x00000001,
            CreateThread = 0x00000002,
            VMOperation = 0x00000008,
            VMRead = 0x00000010,
            VMWrite = 0x00000020,
            DupHandle = 0x00000040,
            SetInformation = 0x00000200,
            QueryInformation = 0x00000400,
            Synchronize = 0x00100000
        }
    }

    public static class ShowMode
    {
        public const int SW_FORCEMINIMIZE = 11;
        public const int SW_HIDE = 0;
        public const int SW_MAXIMIZE = 3;
        public const int SW_MINIMIZE = 6;
        public const int SW_RESTORE = 9;
        public const int SW_SHOW = 5;
        public const int SW_SHOWDEFAULT = 10;
        public const int SW_SHOWMAXIMIZED = 3;
        public const int SW_SHOWMINIMIZED = 2;
        public const int SW_SHOWMINNOACTIVE = 7;
        public const int SW_SHOWNA = 8;
        public const int SW_SHOWNOACTIVATE = 4;
        public const int SW_SHOWNORMAL = 1;
    }
}
2.Класс, который я использую для чтения из памяти
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Win32Lib;
using System.ComponentModel;

namespace MyMagic
{
    class WhiteMagic
    {

        int handler;

        public WhiteMagic(int processId)
        {
            handler = Win32.OpenProcess(Win32.ProcessAccessFlags.All, false, processId);
        }


        public uint GetAddressByOffsets(uint[] offsets)
        {
            uint ret=offsets[0];

            for(int i=1;i<offsets.Length;i++)
            {
                ret = ReadUint(ret);
                ret += offsets[i];
            }
            return ret;
        }

        public uint ReadUint(uint offset)
        {
            
            byte[] buff = new byte[4];
            Win32.ReadProcessMemory(handler, offset, buff, 4, 0);
            uint ret=BitConverter.ToUInt32(buff, 0);
            return ret;
        }

        public void Close()
        {
            Win32.CloseHandle(handler);
        }
    }
}
P.S.Пробовал открывать с правами только на чтение - не помогает.
Функция GetAddressByOffsets использую для высчитывания адресов флагов и параметров при старте бота один раз.
3.Пример обращения (привожу не весь код - там 500 с лишним строк - только то что выполняется в таймерах)
Код:
private void checkOffsets(object sender, ElapsedEventArgs e)
        {
            if(gather_existance.Interval>1000)
            {
                gather_existance.Interval = rnd.Next(80, 120);
            }
            if(tera!=null && checkGatherFlag() && currentState==gatherStates.LOOKING_FOR_RESOURCE)
            {
                setStatus(gatherStates.WAITING_FOR_GATHER);
                log_form.logText("Ресурс найден");
                //this.Invoke((MethodInvoker)delegate() { log.AppendText("Find ore/plant" + Environment.NewLine); });
                gather_existance.Enabled = false;
                if (tera.ReadUint(ClientAddresses.IS_GATHERING) == 0)
                {
                    send_one();
                }
               
                check_start_gather.Interval = rnd.Next(30,70);
                check_start_gather.Elapsed += checkStartGather;
                check_start_gather.Enabled = true;
            }
        }

        private Boolean checkGatherFlag()
        {
            //Проверка флага наличия в таргете руды. Оффсетов было много и с разными значениями. Для этого при 0 - нет в таргете руды, при 1 - руда трава и т.п.

            if (tera!=null && tera.ReadUint(ClientAddresses.TARGET_GATHER_FLAG) == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void checkFinishGather(object sender, ElapsedEventArgs e)
        {
            Win32.ShowWindow(handler, ShowMode.SW_SHOWNOACTIVATE);
            if (tera != null && tera.ReadUint(ClientAddresses.IS_GATHERING) == 0 && currentState==gatherStates.GATHERING)
            {
                log_form.logText("Сбор завершён");
                //this.Invoke((MethodInvoker)delegate() { log.AppendText("Finish gathering" + Environment.NewLine); });
                finish_gathering.Enabled = false;
                gather_existance.Enabled = true;
                check_start_gather.Enabled = false;

                setStatus(gatherStates.LOOKING_FOR_RESOURCE);

                uint wp = tera.ReadUint(ClientAddresses.WORK_POINTS);
                redrawProgressBar((int) wp);
                if (wp < 10 && stopZeroWork.Checked)
                {
                    this.Invoke((MethodInvoker)delegate() { 
                        button1_Click(null, null); 
                    });
                    log_form.logText("Закончились очки работы");
                }

            }
        }

        private void checkStartGather(object sender, ElapsedEventArgs e)
        {
            if (tera != null && tera.ReadUint(ClientAddresses.IS_GATHERING) == 0 && tera.ReadUint(ClientAddresses.TARGET_GATHER_FLAG) == 1  && currentState == gatherStates.WAITING_FOR_GATHER)
            {
                send_one();
                
            }
            else if(tera!=null && tera.ReadUint(ClientAddresses.TARGET_GATHER_FLAG)==0 && currentState==gatherStates.WAITING_FOR_GATHER)
            {
                TimeSpan delta = DateTime.Now - last_change_status;
                if (delta.TotalMilliseconds > 3000)
                {
                    log_form.logText("Кто-то скрысил ресурс");
                    //this.Invoke((MethodInvoker)delegate() { log.AppendText("Someone start gather (not me)" + Environment.NewLine); });
                }
                else
                {
                    gather_existance.Interval = 20000;
                    //log_form.logText("tst");
                    //this.Invoke((MethodInvoker)delegate() { log.Lines = log.Lines.Reverse().Skip(2).Reverse().ToArray(); log.AppendText(Environment.NewLine); });
                }
                
                check_start_gather.Enabled = false;
                gather_existance.Enabled = true;
                setStatus(gatherStates.LOOKING_FOR_RESOURCE);
            }
            else if(tera!=null && tera.ReadUint(ClientAddresses.TARGET_GATHER_FLAG)==1 && tera.ReadUint(ClientAddresses.IS_GATHERING) == 1 && currentState==gatherStates.WAITING_FOR_GATHER)
            {
                setStatus(gatherStates.GATHERING);
                log_form.logText("Начат сбор");
                //this.Invoke((MethodInvoker)delegate() { log.AppendText("Start gathering" + Environment.NewLine); });
                check_start_gather.Enabled = false;
                finish_gathering.Interval = rnd.Next(30,70);
                finish_gathering.Elapsed += checkFinishGather;
                finish_gathering.Enabled = true;
            }
        }
Комментарии по этому куску.
checkOffsets - выполняется по таймеру раз в 50-100мс. Проверяет наличие в таргете ресурса. То что для установки использую рандом - вчера тестировал - думал, что возможна какая-то кореляция между таймерами и поэтому всё подвисает.

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

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

Таймер окончания сбора ожидает, когда флаг сбора станет равным нулю и запускает таймер появления ресурса
 
Ответить с цитированием
Старый 07.04.2015, 16:17   #63
AHrEJl
Подпольщик Tera
Аватар для AHrEJl
OFFLINE
Регистрация: 24.03.2015
Возраст: 35
Сообщений: 200
Благодарностей:
26 всего
Репутация: 79

1) А зачем ShowWindow? Оо
2) Все это счастье - в отдельном треде для каждого окна? У таймера точно крышу не сносит от доступов с разных сторон?
3) Ты не забываешь, что в C# при срабатывании таймера, метод вызывается в отдельном треде, но при этом этот "отдельный тред" - один. (т.е. если срабатывает 10 таймеров, то методы из них вызовутся последовательно)
4) Мог бы byte[] buff = new byte[4] сделать статиком - чуть меньше напрягов для GC, но не должно это сильно влиять

I think I'm going crazy
I'm loosing my mind.
 
Ответить с цитированием
Старый 07.04.2015, 16:19   #64
Dino
Проф. продавец
Аватар для Dino
OFFLINE
Регистрация: 23.07.2012
Сообщений: 2,402
Благодарностей:
886 всего
Мнения: + 3902
Репутация: 2656

byte[] buff = new byte[4];

а кто память будет освобождать?

Добавлено через 8 минут
Понятное дело, что в методе ты этого сделать не сможешь. Если тебе нужен динамический буффер, то создаешь его в конструкторе, а в деструкторе освобождаешь. Либо можно там где вызываешь метод, создать динамический массив , который примет указатель на массив из функции, а после завершения его работы освободить

Последний раз редактировалось Dino; 07.04.2015 в 16:32. Причина: Добавлено сообщение
 
Ответить с цитированием
Старый 07.04.2015, 16:42   #65
AHrEJl
Подпольщик Tera
Аватар для AHrEJl
OFFLINE
Регистрация: 24.03.2015
Возраст: 35
Сообщений: 200
Благодарностей:
26 всего
Репутация: 79

Цитата:
Сообщение от Dino Посмотреть сообщение
byte[] buff = new byte[4];

а кто память будет освобождать?

Добавлено через 8 минут
Понятное дело, что в методе ты этого сделать не сможешь. Если тебе нужен динамический буффер, то создаешь его в конструкторе, а в деструкторе освобождаешь. Либо можно там где вызываешь метод, создать динамический массив , который примет указатель на массив из функции, а после завершения его работы освободить
Читай мой ответ, прямо над твоим :)
Это C#, в нем не надо освобождать память в явном виде. В нем этим занимается GarbageCollector.

I think I'm going crazy
I'm loosing my mind.
 
Ответить с цитированием
Старый 07.04.2015, 16:51   #66
Dino
Проф. продавец
Аватар для Dino
OFFLINE
Регистрация: 23.07.2012
Сообщений: 2,402
Благодарностей:
886 всего
Мнения: + 3902
Репутация: 2656

Цитата:
Сообщение от AHrEJl Посмотреть сообщение
Читай мой ответ, прямо над твоим :)
Это C#, в нем не надо освобождать память в явном виде. В нем этим занимается GarbageCollector.
Че правда чтоль? А я думаю "синтаксис знакомый дай отвечу"
Ну это объясняется тем, что мои знания по C# сводятся к нулю
 
Ответить с цитированием
Старый 07.04.2015, 16:58   #67
Тигрь
Крестный отец всех читеров
Аватар для Тигрь
OFFLINE
Регистрация: 02.04.2008
Сообщений: 4,027
Благодарностей:
37,698 всего
Мнения: + 29276
Репутация: 106466

Цитата:
Сообщение от snab_rus Посмотреть сообщение
на сколько я знаю, его нужно зарывать.
открыл, прочитал, закрыл.
ничего подобного, открыл и работаешь как отпала надобность в чтении памяти так и закрываешь. то же самое со всем остольным, с файлами, сетью и прочими вещами. ты представь тебе побайтово нужно файл читать, открыл файл считал байт, закрыл файл, открыл считал закрыл.

Добавлено через 2 минуты
Цитата:
Сообщение от Dino Посмотреть сообщение
Че правда чтоль? А я думаю "синтаксис знакомый дай отвечу"
Ну это объясняется тем, что мои знания по C# сводятся к нулю
Ну так в сишарпе сборщик мусора одна из его фишек, это наверно единственный для меня в нем плюс. остальное все минусы. да и ресурсы всегда в ручную освобождаю.

Последний раз редактировалось Тигрь; 07.04.2015 в 17:01. Причина: Добавлено сообщение


Я летаю снаружи всех измерений.



 
Ответить с цитированием
Старый 07.04.2015, 17:04   #68
Алексанw24
Нуб
Аватар для Алексанw24
OFFLINE
Регистрация: 01.04.2015
Сообщений: 0
Благодарностей:
0 всего
Репутация: 1

по поводу таймеров - три одновременно сработать не могут. В каждый момент времени работает только один из них.
Всё остальное - приду домой попробую.
 
Ответить с цитированием
Старый 07.04.2015, 17:13   #69
AHrEJl
Подпольщик Tera
Аватар для AHrEJl
OFFLINE
Регистрация: 24.03.2015
Возраст: 35
Сообщений: 200
Благодарностей:
26 всего
Репутация: 79

Цитата:
Сообщение от Тигрь Посмотреть сообщение
Ну так в сишарпе сборщик мусора одна из его фишек, это наверно единственный для меня в нем плюс. остальное все минусы
Интересно, что я считаю GC одним из немногих минусов C#, ибо расхолаживает. А это может быть черевато :)

Но да, на вкус и цвет все фломастеры разные

I think I'm going crazy
I'm loosing my mind.
 
Ответить с цитированием
Старый 07.04.2015, 17:57   #70
Алексанw24
Нуб
Аватар для Алексанw24
OFFLINE
Регистрация: 01.04.2015
Сообщений: 0
Благодарностей:
0 всего
Репутация: 1

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

Добавлено через 24 минуты
По поводу ShowWindow - был в маразме - перебирал все варианты исправления зависонов поэтому добавил.
Убрал, но сейчас все равно также
Буффер привязал к объекту, но ничего не изменилось.
Сейчас на всякий случай проверю не работают ли в какой-то момент два таймера одновременно.

Последний раз редактировалось Алексанw24; 07.04.2015 в 18:21. Причина: Добавлено сообщение
 
Ответить с цитированием
Ответ


Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Статья] Отладка и исследование кода игры Tera Online Dino Общение читеров Теры 15 04.07.2015 22:23
КУПИТЬ ЗОЛОТО TERA-ONLINE.RU - ПРОДАЖА ЗОЛОТА TERA-ONLINE Infformacia Куплю, продам, обменяю в игре Tera 0 27.03.2015 16:24
Neverwinter Online - описание и основная информация TiLESS Neverwinter читы 4 26.11.2013 16:03
Tera >> RF Online Scdying Обмен аккаунтами из одной игры в другую 3 09.10.2013 23:06
Описание RF Online 2.1.2 бесс Архив 6 10.07.2012 08:16

Мир танков | Проект "Армата" | ArcheAge | Black Desert | РФ Онлайн | Айон | Майнкрафт | Браузерные игры
Элдер скролс | Р2 Онлайн | Реквием Онлайн | ПУБГ | Роял Квест | ГТА Санадреас | Контра | Дота 2
Мир кораблей | Лост Арк | Arma2 DayZ mod | The War Z | Карос: Начало | Tera Online
Читы для всех Онлайн-игр