GameHackLab[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    Потоки

    Запланировано Прикреплена Закрыта Перенесена Базовая информация
    потокпотокирегистрыпамять
    1 Сообщения 1 Posters 347 Просмотры
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • PromisingP
      Promising
      отредактировано Promising

      В этой теме описывается что такое потоки в общих чертах


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

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

      В Cheat Engine посмотреть список работающих потоков можно в окне отладчика через меню View:

      ac6ca786-1192-449e-91f0-dbcef87c9bc3-изображение.png

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

      112db97a-9d6f-4cbd-925e-fafcf6d09951-изображение.png

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

      С помощью Cheat Engine вы можете создать новый поток для выполнения своего кода. Выделим память и напишем там простую функцию, о функциях подробнее будет рассказано в следующих статьях:

      244b0ee6-e269-4fcd-990d-145cf1b9014a-изображение.png

      Код задан, этот код берёт число 5, добавляет его к самому себе, увеличивает на 1 и вычитает из результата 4, результат записывается по адресу 08600000. В нижнем окне показано текущее значение адреса, оно является нулевым. Что бы код выполнился нужно вызвать поток на него. Так как это функция, она имеет команду ret что бы поток вернулся после выполнения.
      Для создания потока, выделите первую команду функции и в меню инструментов выберите создание потока:

      1236e201-4bbd-4a34-afd7-fee191565688-изображение.png

      Вас спросят на каком адресе создать поток, если вы выделили определённую инструкцию, адрес автоматически подставится в это окно:

      e8aa664b-89c3-4764-92ea-bd2336f55a50-изображение.png

      После этого появится окно с вопросом какой параметр задать потоку перед запуском, который попадёт в регистры. Оставьте его 0, в данном коде не нужно задавать предварительные значения регистрам:

      c1b9647c-968e-4f8e-9be0-79e1d886be5f-изображение.png

      После того как вы подтвердите создание потока, он выполнит функцию и вернётся, значение в адресе изменится:

      0ed5ea7a-6357-458b-bded-f5eb00a6adf9-изображение.png

      Так как значение находится рядом с инструкциями, верхнее окно попыталось распознять в нём инструкции и создало непонятную мешанину. Для того что бы исправить отображение просто перейдите на адрес начала функции используя стрелочки на клавиатуре для точной корректировки позиции, или укажите адрес самостоятельно нажав Ctrl+G:

      79a6c20a-cc9f-48ef-a190-d66024fbc6b3-изображение.png

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

      1 ответ Последний ответ Ответить Цитировать 1
      • Первое сообщение
        Последнее сообщение