Динамическая замена переменных в окне чужой программы (язык C, C++)

Обсуждение в разделе «С/С++, C#, Delphi, .NET, Asm», начал(-а) sackett, 15.02.2017.

  1. sackett

    sackett New Member

    Регистрация:
    14.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Всем привет! Кто знает, пожалуйста, подскажите куда копать.

    Есть программа - покер клиент (сторонняя, без исходников), после запуска создается окно лобби, далее пользователь открывает столы для игры (пример стола на скриншоте).
    [​IMG]
    https://gyazo.com/b8ece09c1aeddd3cf553d6d11a9c76d3
    Моя программа сканирует список окон, выбирает окна с нужными заголовками (столы).
    В заголовке видим ставки, к примеру: $0.01/0.02 (малый блайнд 0.01 USD и большой блайнд 0.02 USD).
    (это я уже сделал, но дальше стопор).

    Задача:
    Нужно сделать так, чтобы все ставки у каждого игрока и в банке были поделены на большой блайнд.
    Тоесть, требуется сделать Pot: 6.5, у игрока Djdam 5, cathat5000 0.5, Spactatr 1.
    И далее в процессе игры, чтобы ставки изменялись соответственно заданному правилу (делению на большой блайнд). И стеки игроков (деньги, с которыми он сидит за столом) аналогично.

    Как этого можно добиться?

    P.S. если интересует тема покера, могу так же поделиться знаниями, ответить на интересующие вопросы.
     
  2. seosimf

    seosimf Member

    Регистрация:
    3.03.2011
    Сообщения:
    285
    Одобрения:
    44
    Репутация:
    2
    Эти данные хранятся на стороне сервера, а клиент просто их выводит в лоби, так что...
     
  3. sackett

    sackett New Member

    Регистрация:
    14.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Есть решения для других покер-румов (PokerStars,PartyPoker,888,iPoker) - там работает такая подстановка. Думаю, как-то можно и тут это сделать, вопрос: как?
     
  4. seosimf

    seosimf Member

    Регистрация:
    3.03.2011
    Сообщения:
    285
    Одобрения:
    44
    Репутация:
    2
    Это не решения - это развод. Данные всех игроков хранятся на сервере, ты не сможешь поменять их в клиенте, который служить лишь для оторбражения этих данных, и изменения твоих данных и пересылке твоих данных на сервер.
    Ты можешь изменить, то, что отображается у тебя в клиенте как угодно, но это никак не повлияет на то, что есть на сервере.
     
  5. sackett

    sackett New Member

    Регистрация:
    14.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Всё верно, нет необходимости менять данные на сервере. Нужно только поменять отображение в моем клиенте, чтобы было не в деньгах, а в больших блайндах.
    К примеру, если играть два лимита-три лимита одновременно с разными размерами больших блайндов (мин ставка), то очень неудобно считать. Приведение всех денежных сумм к ставкам в ББ упрощает математику в игре.
     
  6. Elirton

    Elirton New Member

    Регистрация:
    18.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Здравствуйте! Тоже копаю в этом направлении, сам играю, использую HM2. Вот в чем вопрос - как изменить значение которое отображается за покерным столом, его необходимо поменять для удобства отображения информации... и не только, это всего лишь отправная точка =) К примеру за столом сидят 9 игроков, у каждого примерно по 3000 фишек, обязательная ставка (большой блайнд) = 30 фишкам. Размер обязательной ставки динамически меняется со временем и стеки игроков соответственно. Нужно что бы программа, автоматически находила это значение (размер стека) и делила его на ставку (большой блайнд), при этом естественно заменяя прошлое значение под никнейном (размер стека). Это основная цель! =)

    Как я понял, для этого необходимо использовать winAPI? Не много почитав, как я понял, не желательно использовать hook`и, т.к. покерный клиент может это палить и тормозить процессы может.
    В дальнейшем хочется написать своего помощника, который например будет считывать твои карты и в зависимости от диапазона, подставлять нужную ставку для рейза, или ре-рейза, если кто-то до нас зашел в банк.
    Далее хочется с помощью HM2 API, запрашивать определенную статистику на оппонентов и подсказывать, то или иное решение. Например здесь нам лучше украсть блайнды или проще упасть учитывая оппонента и позицию.

    Очень надеюсь что хоть кто-то поможет, подскажет, а то уже устал копать, а информации очень мало. Есть программа которая переводит стеки в бб (и не только, но в основном ее юзают для этого), стоит 35$ StarsHelper. Но хочется понять как она работает, сделать такую самому и добавить нужный функционал.

    З.Ы. sackett если что-то узнаешь пиши в личку, с удовольствием обменяюсь инфой =)
     
  7. sackett

    sackett New Member

    Регистрация:
    14.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Привет! По поводу подсказок уже пахнет ботоводством, а это наказуемо. :)
    Для старзов есть еще StarsCaption, бесплатная до какого-то лимита. Попробуй её.
    Да, если что-то будет - напишу.
     
  8. Elirton

    Elirton New Member

    Регистрация:
    18.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Ну с подсказками согласен, если спалят то забанят, т.к. это можно считать комментарием к игре в реальном времени... короче есть там такой пункт =) Бота писать нет желания, да и знаний не хватит. Для бота нужно реализовать блок действий за столом, а к нему эмулятор поведения человека чтобы не спалиться, что по факту является тяжелейшей задачей.
    Сделать подсказчика не много проще и с палевом вопрос решить можно. Это поможет не щелкать лицом когда долго играешь, меньше совершать ошибок, придерживаться нужной(ых) стратегии и тактики - которые получаешь в ходе обучения (будь-то воды, тренировки, статьи).

    Все Caption`ы бесплатны до лимита $3. С $3 включительно - если ты открываешь стол, то программа закрывается.
     
  9. Elirton

    Elirton New Member

    Регистрация:
    18.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Caption`ы не работают на .NET, а вот StarsHelper напротив. С помощью .NET Reflector нашел класс HUDUserAdjBB и в нем метод UpdateText();

    Code:
    public class HUDUserAdjBB : HUDUserText
    {
        // Fields
        [DecimalConstant(0x1c, 0, (uint) 0x158a8994, (uint) 0x296e0196, (uint) 0xaaaaaab)]
        private static readonly decimal TwoThirds;
    
        // Methods
        static HUDUserAdjBB();
        public HUDUserAdjBB(HUDTopLevel ThisHUDTopLevel, SettingsHUDBase ThisSettings, int MaxUsers, int UserPos);
        protected override void SetEvent();
        protected override void UnsetEvent();
        protected override void UpdateText();
    
        // Properties
        protected override string DefaultNameHUD { get; }
        private SettingsHUDUserAdjBB ThisSettingsAll { get; }
    }
    
    Expand Methods
    
    Code:
    protected override void UpdateText()
    {
        base.CalculateRenderNode();
        if (base.IsShow)
        {
            RenderNode latestRenderNode = base.LatestRenderNode;
            if (latestRenderNode == null)
            {
                base.SetDefaultText();
            }
            else
            {
                GameData currentGameData = base.ThisBoardUnit.CurrentGameData;
                if (currentGameData == null)
                {
                    base.SetDefaultText();
                }
                else
                {
                    decimal tourneyAdjBBHelper = currentGameData.TourneyAdjBBHelper;
                    if (tourneyAdjBBHelper <= decimal.Zero)
                    {
                        base.SetText("NA", false);
                    }
                    else if (latestRenderNode.Stack_CurrentType == (RenderNode.EnumTypeTextStack.NotDetect | RenderNode.EnumTypeTextStack.SittingOut))
                    {
                        base.SetText("SitOut", false);
                    }
                    else
                    {
                        decimal num2;
                        SettingsHUDUserAdjBB thisSettingsAll = this.ThisSettingsAll;
                        if (thisSettingsAll.IsStartGame.Value)
                        {
                            num2 = latestRenderNode.Stack_StartGame_Get();
                        }
                        else
                        {
                            num2 = latestRenderNode.Stack_AfterBB_Get();
                        }
                        if (num2 < decimal.Zero)
                        {
                            base.SetDefaultText();
                        }
                        else
                        {
                            string str;
                            if (thisSettingsAll.IsM.Value)
                            {
                                str = (num2 / tourneyAdjBBHelper).ToString(thisSettingsAll.RoundType.Value);
                            }
                            else
                            {
                                str = (num2 / (0.6666666666666666666666666667M * tourneyAdjBBHelper)).ToString(thisSettingsAll.RoundType.Value);
                            }
                            base.SetText(str, true);
                        }
                    }
                }
            }
        }
    }
    
    
    Это может нам как-то помочь? =)
     
  10. kranx

    kranx New Member

    Регистрация:
    19.02.2017
    Сообщения:
    17
    Одобрения:
    6
    Репутация:
    0
    я не понимаю, если нужно просто отхватить хэндл элемента окна, и заменить там текст, то почему не использовать spy++ чтобы найти ID того самого элемента, потом в C++ при помощи FindWindow и FindWindowEx зацепить, и потом отправить сигнал о смене текста SendMessage с WM_SETTEXT?
     
  11. sackett

    sackett New Member

    Регистрация:
    14.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    kranx, для простых программ так можно сделать, но для окон покерных клиентов нельзя - это окно графическое и элементов там нет. копал уже в этом направлении.

    Elrton, интересно... Это ты StarsHelper декомпилировал?
    PokerStars и StarsHelper написаны на .NET Framework?
     
  12. Elirton

    Elirton New Member

    Регистрация:
    18.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Да, там особо никаких параметров нет, только действие user`a в одну строку описано и там ничего нет.

    PokerStars написан не на .NET, в отличии от StrasHelper`a, который в свою очередь требует что бы все сообщения чата были включены. Но там все равно инфы по стекам не выводится.
     
  13. Gar|k

    Gar|k Moderator

    Регистрация:
    20.03.2009
    Сообщения:
    1 173
    Одобрения:
    265
    Репутация:
    44
    А вы пробовали каким нибудь ArtMoney поискать и поменять значения в памяти программы? Если значение находится и изменяется через ArtMoney, можно вычислить смещение переменной в блоке данных программы и потом использовать в своих целях.
    Алгоритм тогда будет такой: открыть программу клиент, определить адрес загрузки блока данных, взять адрес переменной по нужному смещению - использовать в своих целях, для любых вычислений.

    Правда это справедливо для компилируемых программ, как обстоят дела с псевдокодом .NET и Java я не в курсе.
     
    _________________________
  14. Elirton

    Elirton New Member

    Регистрация:
    18.02.2017
    Сообщения:
    5
    Одобрения:
    0
    Репутация:
    0
    Не получается, ArtMoney предлагает выбрать только лобби покерных клиентов, а не окна со столами, за которым непосредственно осуществляется игра. Поиск в лобби по цифрам, в попытках отыскать значение своего стека (фишек за столом), при отсеивание не дает результатов. Не остается никаких строк.
     
  15. Gar|k

    Gar|k Moderator

    Регистрация:
    20.03.2009
    Сообщения:
    1 173
    Одобрения:
    265
    Репутация:
    44
    Складывается впечатление, что все данные генерирует сервер, а программа клиент просто транслирует картинку как видео плеер )
     
    _________________________
Загрузка...