Посмотрю, как будет время

MasterGH
Сообщения
-
Выполнение команды lua на кнопках формы -
Выполнение команды lua на кнопках формыМожет так
InfiniteHealthScript = [[ [Enabled] {$lua} Print("enabled") {$asm} [Dissable] {$lua} Print("disabled") {$asm} ]]
-
CE Plugin: AA Maker 2.4.2ок
-
CE Plugin: AA Maker 2.4.2На следующей неделе, если не забуду буду разбираться.
Скачай с gamehacklab пока, если есть доступ. -
Обновление форумаДа, нет, наверное. Вчера, что обсуждали.
-
Выполнение команды lua на кнопках формыПожалуйста
-
Обновление форумаНесколько последний сообщений в результате обновления и восстановления пропали, к сожалению.
-
CE Action Logger 1.0 BetaОтправил
-
Выполнение команды lua на кнопках формы@Pitronic нет
-
Выполнение команды lua на кнопках формыЗаходишь в документацию
CheckBox Class: (Inheritance: ButtonControl->WinControl->Control->Component->Object) createCheckBox(owner): Creates a CheckBox class object which belongs to the given owner. Owner can be any object inherited from WinControl properties Checked: boolean - True if checked AllowGrayed: boolean - True if it can have 3 states. True/False/None State: checkboxstate - The state. (cbUnchecked=0, cbChecked=1, cbGrayed=2) OnChange: function - Function to call when the state it changed methods getAllowGrayed() setAllowGrayed(boolean) getState(): Returns a state for the checkbox. (cbUnchecked, cbChecked, cbGrayed) setState(boolean): Sets the state of the checkbox onChange(function)
По ней пишешь что-то вроде этого.
checkBox.onChange = function onChangeState(sender) local state = sender.Checked if state then enableInfiniteHealthCheat() else disableInfiniteHealthCheat() end end
-
Выполнение команды lua на кнопках формыCheckbox
local form = createForm( true ); local checkBoxes = {}; checkBoxes[1] = createCheckBox( form ); checkBoxes[2] = createCheckBox( form ); checkBoxes[3] = createCheckBox( form ); checkBoxes[4] = createCheckBox( form ); checkBoxes[5] = createCheckBox( form ); for x = 1, #checkBoxes do checkBoxes[x].Caption="This is checkbox " .. tostring( x ) checkBoxes[x].setPosition(10, x * 20) end checkBoxes[1].State=0 -- Sets checkboxes[1] to unchecked state. checkBoxes[2].State=1 -- Sets checkboxes[2] to checked state. checkBoxes[3].State=2 -- Sets checkboxes[3] to the gray state if checkBoxes[4].Checked then -- if checkboxes[4] is checked then the function returns true otherwise false. print "true" else print "false" end
Здесь как привязать обработчик
-
Выполнение команды lua на кнопках формыКнопка
\--- create a form MyForm = createForm() \--- create a button (as a object) inside that form MyButton = createButton(MyForm) -- object name for button = MyButton MyButton.Left = 10 MyButton.Top = 10 MyButton.Width = 100 MyButton.Height = 40 MyButton.Caption = 'Open Link' -- Put text on the button \--- create a function which will bne execute by MyButton Click \--- provide a correct web site link function openWebsite() shellExecute('https://forum.cheatengine.org/viewtopic.php?t=608340') end \--- Execute that function with MyButton Click MyButton.onClick = openWebsite \--- show MyForm MyForm.show()
-
Ваши группы пользователей -
CE Action Logger 1.0 BetaОк. Поправлю. Спасибо
-
Опрос. На чем создаю читы? -
CE Dissect Data Scaner 1.0.2 (4 hardware breakpoints)Охота на структуры и удивительное путешествие в мир структур в L4D2
-
Игру L4D2 в оконный режим
-
Установка плагина (позже)
-
Установка VEH отладчика, иначе вылеты
-
Первая миссия. Ищем адрес патронов. Бряк на адрес. Нашли инструкцию
Красным показано, что я не всю структуру проанализирую позже. Долго было ждать. Структура больше 5К байт... -
Делаем сигнатуру любой инструкции при работе с патронами на всякий случай, если игра вылетит.
server.dll,83 BE 14 14 00 00 00 7F 4D
6. Переходим в код и ищем проскакивающие адреса на инструкции. Там один адрес нашего пистолета. Клик на него и переносим адрес начала будущей структуры в окно Dissect Window. Можно не создавать структуру (отказываемся). Кликаем "Scanner" (он будет на всех окнах dissrct data)
7. Далее работает сканирование.
В игре можно что-то делать, можно ничего не делать. Долго ждать..Меняю опции. Чувствительность как была так и осталась минимальная (это время ожидания прерывания на адресе умноженное на коэфициент чувсвительности и на 100 мс). Размер структуры меняю, до 1100
Наконец ~30 секунд дождался без вылетов (иногда бывают, возможно из-за VEH). Появился результат
Самые интересны это байтовые и float значения. и инструкции чтения. Их определит можно пока только по логам...Меняю первый байт на 1 и пистолет стал очень быстро стрелять.
Ради чего это все и делалось, чтобы похожие адреса искать...Если сравнить дефолтную расструктуризацию, она слева
Логи (для меня и для желающих) по определению типа по опкодам\+0 (2F3B49B0): vtDword 64FC73CB - mov edx,[ecx] \+28 (2F3B49D8): vtDword 6530433E - mov eax,[esi+28] \+4C (2F3B49FC): vtDword 651169A3 - cmp dword ptr [esi+30],00 \+4F (2F3B49FF): vtDword 651169B6 - mov eax,[esi+30] \+53 (2F3B4A03): vtDword 65116C60 - mov eax,[ecx+34] \+64 (2F3B4A14): vtByte 64F8627D - cmp byte ptr [esi+64],00 \+84 (2F3B4A34): vtDword 64F861F0 - movss xmm0,[esi+00000084] \+88 (2F3B4A38): vtDword 64F86215 - movss xmm2,[esi+00000088] \+8C (2F3B4A3C): vtDword 64F9F9A6 - movss xmm0,[eax+0000008C] \+90 (2F3B4A40): vtDword 64FF2CC6 - fld dword ptr [eax] \+C8 (2F3B4A78): vtDword 64FF2DA6 - mov ecx,[eax] \+CC (2F3B4A7C): vtDword 64FF2DE6 - mov ecx,[eax] \+E0 (2F3B4A90): vtDword 64FF2DA6 - mov ecx,[eax] \+104 (2F3B4AB4): vtDword 651141FA - mov eax,[eax] \+10C (2F3B4ABC): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+10D (2F3B4ABD): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+10E (2F3B4ABE): vtWord 64FF2D96 - movsx ecx,word ptr [eax] \+110 (2F3B4AC0): vtDword 64FF2DB6 - mov ecx,[eax] \+138 (2F3B4AE8): vtDword 64FBB772 - or [esi+00000138],edi \+171 (2F3B4B21): vtByte 64FBB7D4 - cmp byte ptr [esi+00000171],00 \+172 (2F3B4B22): vtByte 64FA6572 - cmp byte ptr [esi+00000172],03 \+173 (2F3B4B23): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+174 (2F3B4B24): vtDword 651141FA - mov eax,[eax] \+178 (2F3B4B28): vtDword 64FBB79D - mov eax,[esi+00000178] \+17C (2F3B4B2C): vtDword 64FBB7E8 - mov eax,[esi+0000017C] \+180 (2F3B4B30): vtDword 64FDD9A6 - mov eax,[ecx] \+188 (2F3B4B38): vtDword 64FF2D66 - fld dword ptr [eax] \+18C (2F3B4B3C): vtDword 64FF2D6D - fld dword ptr [eax+04] \+190 (2F3B4B40): vtDword 64FF2D73 - fld dword ptr [eax+08] \+194 (2F3B4B44): vtDword 64FF2D66 - fld dword ptr [eax] \+198 (2F3B4B48): vtDword 64FF2D6D - fld dword ptr [eax+04] \+19C (2F3B4B4C): vtDword 64FF2D73 - fld dword ptr [eax+08] \+1A0 (2F3B4B50): vtByte 64F9FD30 - movzx eax,word ptr [ecx+20] \+1A1 (2F3B4B51): vtByte 64F9FD30 - movzx eax,word ptr [ecx+20] \+1A2 (2F3B4B52): vtByte 64FDDBB0 - movzx eax,byte ptr [ecx+22] \+1A3 (2F3B4B53): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+1AA (2F3B4B5A): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+1AC (2F3B4B5C): vtDword 64FF2D66 - fld dword ptr [eax] \+1B0 (2F3B4B60): vtDword 64FF2D6D - fld dword ptr [eax+04] \+1B4 (2F3B4B64): vtDword 64FF2D73 - fld dword ptr [eax+08] \+1B8 (2F3B4B68): vtDword 64FF2D66 - fld dword ptr [eax] \+1BC (2F3B4B6C): vtDword 64FF2D6D - fld dword ptr [eax+04] \+1C0 (2F3B4B70): vtDword 64FF2D73 - fld dword ptr [eax+08] \+1E0 (2F3B4B90): vtDword 64FF2DA6 - mov ecx,[eax] \+1E4 (2F3B4B94): vtDword 64FF2DA6 - mov ecx,[eax] \+1E8 (2F3B4B98): vtDword 64FF2DA6 - mov ecx,[eax] \+1EC (2F3B4B9C): vtDword 64FF2DB6 - mov ecx,[eax] \+1F0 (2F3B4BA0): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+20C (2F3B4BBC): vtDword 651141FA - mov eax,[eax] \+210 (2F3B4BC0): vtDword 651141FA - mov eax,[eax] \+214 (2F3B4BC4): vtDword 64FF2CC6 - fld dword ptr [eax] \+218 (2F3B4BC8): vtDword 64FF2CC6 - fld dword ptr [eax] \+21C (2F3B4BCC): vtDword 64FF2CC6 - fld dword ptr [eax] \+220 (2F3B4BD0): vtDword 64FF2DE6 - mov ecx,[eax] \+22C (2F3B4BDC): vtDword 64FF2CC6 - fld dword ptr [eax] \+238 (2F3B4BE8): vtDword 64FF2DA6 - mov ecx,[eax] \+2B4 (2F3B4C64): vtDword 64FF2CC6 - fld dword ptr [eax] \+2E4 (2F3B4C94): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2E5 (2F3B4C95): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2E6 (2F3B4C96): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2E7 (2F3B4C97): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2E8 (2F3B4C98): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2E9 (2F3B4C99): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2EA (2F3B4C9A): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2EB (2F3B4C9B): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+2EC (2F3B4C9C): vtByte 64FF2DC6 - movzx ecx,byte ptr [eax] \+374 (2F3B4D24): vtDword 64FA65AC - mov edi,[esi+00000374] \+378 (2F3B4D28): vtDword 64FF2DE6 - mov ecx,[eax] \+37C (2F3B4D2C): vtDword 64FF2DE6 - mov ecx,[eax] \+380 (2F3B4D30): vtDword 64FF2DE6 - mov ecx,[eax] \+384 (2F3B4D34): vtDword 64FF2DE6 - mov ecx,[eax] \+388 (2F3B4D38): vtDword 64FA65B8 - movss xmm1,[ecx] \+38C (2F3B4D3C): vtDword 64FA660B - movss xmm1,[ecx+04] \+390 (2F3B4D40): vtDword 64FA6653 - movss xmm1,[ecx+08] \+394 (2F3B4D44): vtDword 64FA68AD - movss xmm1,[eax] \+398 (2F3B4D48): vtDword 64FA68E1 - movss xmm2,[eax+04] \+39C (2F3B4D4C): vtDword 64FA6904 - movss xmm2,[eax+08] \+3A0 (2F3B4D50): vtDword 64FDEC3A - mov ecx,[edi] \+3B8 (2F3B4D68): vtDword 6508F54F - test [eax+000003B8],edx \+42C (2F3B4DDC): vtDword 64F84E81 - fstp dword ptr [esi+0000042C] \+434 (2F3B4DE4): vtDword 64FF2DA6 - mov ecx,[eax] \+438 (2F3B4DE8): vtDword 64FF2D66 - fld dword ptr [eax] \+43C (2F3B4DEC): vtDword 64FF2D6D - fld dword ptr [eax+04] \+440 (2F3B4DF0): vtDword 64FF2D73 - fld dword ptr [eax+08] \+444 (2F3B4DF4): vtDword 64FF2DA6 - mov ecx,[eax] \+448 (2F3B4DF8): vtDword 64FF2DA6 - mov ecx,[eax] \+44C (2F3B4DFC): vtDword 64FF2DE6 - mov ecx,[eax]
Плагин выложу позже. Надо еще доработать и потестить.
Вот к примеру float распознал как Pointer и там где fst тоже по +42C тоже фигня. Это ошибки. Это быстро поправить, но могут быть еще ошибки.
Не менее интересны еще вложенные структурки, которые удается раскрыть (не все). Вот одна из них и усеяна параметрами, которые можно покрутить
Вложенные структуры пока отдельно можно создавать в окнах, чистить сканером, потом подставлять их в основную структуру по имени. В общем пока рано об этом писать.
Больше всего меня волнует польза, т.е. что можно с этим сделать. Пока только сразу вышел на скорострельность. Еще шесть параметров покрутил байтовых, ничего не дало. Надо еще попробовать выводить только смещения, которые работают на инструкцияъ чтения, а не "чтении и записи". Запись скорее всего не нужна. Значения просто активно перезаписываются в структуре. А вот оставлять смещения, с которыми работает только "чтение" скорее всего даст куда больше вероятности найти параметр настройки.
-
-
CE Dissect Data Scaner 1.0.2 (4 hardware breakpoints)- Точное определение типа данных на смещениях структуры (те которые срабатывают на аппаратных брейкпоинтах);
- Показать в имени элемента структуры один из опкодов чтения или его часть (с регистрами и смещением);
- Найти такие смещения, с которыми работают только инструкции чтения за указанное время равное Accuracy * 10мс на байт в структуре. Чем выше Accuracy, тем выше вероятность убрать больше лишний смещений;
Плагин пока не планируется развивать из-за его особенности работы с 4мя аппаратными брейкпоинтами. С одной стороны это не тормозит игру, но с другой стороны нужно в игре совершать одни и те же действия чтобы по 4 байта в структуре срабатывали друг за другом до конца структуры.
Есть другие способы снимать показания на любой размер структур установкой брейкпоинта на большую область памяти указанного размера (в другом плагине, который я пока не выложил). При этом чем структура больше и чем больше в ней прерываний тем сильнее тормозит, но оно того стоит, потому что показания снимаются практически одновременно.
Это тестовая версия, поэтому могут быть ошибки при сканировании. О них можно написать мне в личку с названием игры, сигнатуры инструкции.
Если плагин вдруг заключил и пишет что-то в консоли, то нажать на кнопку Stop или для остановки ввести Lua команду
stopDissectDataScanner()
УстановкаРаспаковать в основную директорию с программой. В архиве форма, файл настроек и lua исходник.
Как работать с плагином
- Ищем параметр в игре
- Ставим "точку останова на доступ"(брейкпоинт) или "на запись"
- Находим одну из инструкций. Например, в игре Кредо Убийцы 3 это инструкция
AC3SP.exe+11BAEEB - 66 89 4E 5C - mov [esi+5C],cx
- Можно пойти двумя способами по переносу базового адреса в окно структур
4.1 На инструкции смотрим например базовый адрес ESI, он будет началом структуры. Его переносим в окно Dissect Data (открывается в отладчике). Отказываемся от всех диалогов, чтобы не получать структуру, которую создает Cheat Engine.
4.2 Определить адреса например на "[esi+5c]" в дизассемблере и на любом вызвать контекстное меню и перебросить базовый адрес в Dissect Data
-
В окне Dissect Data запускаем "Scanner" нажав на эту надпись и вводим имя структуры, размер в hex, и чувствительность поиска от 1 до 10
-
Идем как можно быстрее в игру, а она уже должна быть активна и в оконном режиме, и не в меню. Ждем пока завершится сканирование, что-то делая в игре или простоя стоим там. Если очень долго, можно уменьшить чувствительность или размер структуры в hex-е
-
После того как структура получена, мы основывать на своем опыте, ищем в структуре такие данные, которые могут повлиять на игровой процесс. Т.е. меняем что-то в структуре в байтовых, сингловых типах и смотрим в игру. Очень редко 4-х байтовые что-то дают,а поинтеры менять не надо их можно по аналогии смотреть в новых окнах.
Результаты
Нет 100% гарантии сразу найти все рабочие адреса, в которых что-то будет интересное. Большая часть может себя не проявить в игре или привести к вылетам. После определенного количества вылетов, вы поймете какие типы данных и как менять и вылетов будет меньше.
Перед потенциальными вылетами делаем сигнатуры, чтобы вернуться на инструкцию.
Вызов Lua кода после crash-а вернет адрес инструкции
local sign = 'F3 0F 11 80 EC 00 00 00' function GetAddress(signature) local t = AOBScan(signature, '+X-C-W',0) local s = t[0] t.destroy() return s end print(GetAddress(sign))
...Много зависит от ползания по структуре и внутри структур (об этом в блоге) и соответственно, нужно время.
Если времени мало. Получаем около 20 параметров структуре байтовых и сингловых. Безопасней всего менять сингловые. Их можно увеличить все в 2 раза и зайти в игру и увидеть, что там происходит. Не забываем перед правками сделать копию структуры и нажать на Lock, чтобы сравнить и откатить изменения. За тем уже правим по байтикам на ноль или на единицу. Редко бывают вылеты. Каждый адрес отмечаем, что его проверяли или удаляем. Если интересные, то меняем название. Сохраняем структуру.
Ищем так несколько структур. Все их сохраняем. Не забываем делать сигнатурки для каждой структуры, чтобы получить базовый адрес.
Собрали структуры. Ищем связи между ними. Об этом я скриншотил в блоге (ссылка выше). Опять сохраняем структуры.
На три игры я находил 1-3 полезных параметра и до 6 каких-то забавных или баговых. Например, я нашел коэффициент скольжения персонажей в структуре с координатами и там же гравитацию. Попадались адреса, которые запрещали двигаться, т.е. можно морозить ботов. Попадались байтовые адреса, меняющие руки с оружием в L4D2.
Структуры сохраняются в файл таблицы или экспортируются в отдельный файл.
Далее делаем читы, как обычно. Либо меняем код, либо меняем данные по базовому указателю через скрипты Аutoasembler
- Исправлены ошибки с определением смещения и типов данных. Это позволил сделать новый алгоритм, который анализирует все опкоды работающие с адресом и выбирает наиболее подходящие для определения смещения адреса в структуре и для определения типа данных в структуре.
Выбор лучшего опкода для определения типа данных:
- опкоды с перезаписываемыми регистрами не выбираются;
- опкоды работающие с float приоритетнее чем dword;
- опкоды без квадратных скобок пока пропускаются: всякие repe, movsd и другие
- опкоды с не правильным дизассемблированием пропускаются (невозможно получить адрес в скобках)
- Много новых данных в логах, после формирования структуры. С его помощью можно просмотреть все опкоды, которые сработали на смещении структуры.
На скриншоте пример структуры, после работы плагина
-
CE Plugin: AA Maker 2.4.2AAmaker предназначен для создания создания autoassembler скриптов для Cheat Engine 6.5 или выше
Предыстория. Изначально нужно было генерировать динамически АА-шаблоны по правилам, не зная регистров и прочего, на инструкции по сигнатуре. Это не было реализовано.
Вместо этого пошла другая ветвь - генерация статичного АА-шаблона. Есть некоторые особенности. Создает сигнатуру с пропусками между первыми байтами опкодов. Это сделано для поддержки множества версий игр (для первой ветви развития плагина), но это пропускает последующие за первым байтом опкоды и значит регистры в опкоде могут быть разными, а это значит, что сама идея таких сигнатур не очень универсальная и подойдет разве ,что для опкодов без регистров или же для ноппинга. Либо фиксить сигнатуру на нормальную. Либо пользоваться генерируемыми шаблонами в CE по умолчанию.
-----------
Это плагин CE Lua plugin для Cheat Engine 6.5 или вышеAAmaker предназначен для содания создания autoassembler скриптов.
- Установите aamaker.lua в "Autorun" директорию
- Запустите Cheat Engine.
- Присоедините процесс
- Перейдите в "Memory View" окно
- Выделите адрес кода
- Правой кнопки мышки вызовите контекстное меню
- Используйте функции "AA Maker" в контекстном меню
----------
+ исправления
+ новый директивы:
{$AddressInjection}
{$OriginalCode}
{$CheatCode}
{$Nops}
{$ArrayOfbyte}
{$ProcessName}
{$Date}
{$PrintLog}
+ исправления шаблонов
+ удален aobscan. Изменен aobscanmodule - Исправление ошибок (автор ++METHOS)
- Добавление шаблонов (автор ++METHOS)
Исправление. Совместимость с CE 6.5
-
CE Lua Крестики и нолики
Игра с рандомом. Есть счет.
Запускается через таблицу в аттаче.
Здесь мог быть AI на Lua, возвращающий номер клетки от 1 до 9.function InputAI() -- рандом return math.random (1, 9) end
player1Symbol = '1' player2Symbol = '0' whoStep = 0 player1Score = 0 player2Score = 0 function InputAI() -- рандом return math.random (1, 9) end \-- Проверка правил function caheckRules(symbol) -- Комбинации выигрыша local tableRules = { {1,2,3}, {4,5,6}, {7,8,9}, -- горизонтальные клетки {1,4,7}, {2,5,8}, {3,6,9}, -- вертикальные клетки {1,5,9}, {3,5,7} -- клетки по диагонали } -- Результат проверки клеток local mask = [[ return UDF1.CEButton%s.Caption == 'symbol' and UDF1.CEButton%s.Caption == 'symbol' and UDF1.CEButton%s.Caption == 'symbol' ]] for i = 1, #tableRules do local luaStringCode = mask:format(tableRules[i][1], tableRules[i][2], tableRules[i][3]):gsub('symbol', symbol) if loadstring (luaStringCode)() then return true end end return false end function StartGame() whoStep = 0 for i = 1, 9 do loadstring ('UDF1.CEButton'..i..'.Caption = ""')() end end \-- 1 - ход сделан, 0 - ход не удался function Input(indexInput) if loadstring ('return UDF1.CEButton'..indexInput..'.Caption')() ~= '' then return 0 end local writeSymbol = player1Symbol if whoStep == 0 then whoStep = 1 else whoStep = 0 writeSymbol = player2Symbol end local s = 'UDF1.CEButton'..indexInput..'.Caption = '..writeSymbol loadstring (s)() local somebodyWinner = false if caheckRules(player1Symbol) then player1Score = player1Score + 1 UDF1.CELabelScore.Caption = player1Score..':'..player2Score ShowMessage('Player1 is winner!') somebodyWinner = true elseif caheckRules(player2Symbol) then player2Score = player2Score + 1 UDF1.CELabelScore.Caption = player1Score..':'..player2Score ShowMessage('Player2 is winner!') somebodyWinner = true end -- Если кто-то выиграл, то очистить поле if somebodyWinner then StartGame() return 1 end -- Проверка ничьи local countEmpty = 9 for i = 1, 9 do if loadstring ('return UDF1.CEButton'..i..'.Caption ~= ""')() then countEmpty = countEmpty - 1 end end if countEmpty <= 0 then UDF1.CELabelScore.Caption = player1Score..':'..player2Score ShowMessage('Friendship!') StartGame() return 1 end -- Ходит IA if whoStep == 1 then ::repeat1:: local index = InputAI() if Input(index) == 0 then goto repeat1 end end end function CEButtonClick(sender) Input(tonumber(sender.name:match('%d'))) end function MenuItem1Click(sender) player1Score = 0 player2Score = 0 UDF1.CELabelScore.Caption = player1Score..':'..player2Score StartGame() ShowMessage('Restart!') end UDF1.show()
-
CE Stack ViewerИнформация о файле
НазначениеПлагин позволяет в реальном режиме игры наблюдать за стеком на определенной инструкции отладочного кода. Это в свою очередь позволяет в окне расструктуризации данных "Dessect Data Structure" сравнивать старые и текущие структуры стека в реальном режиме игры, наблюдать за появлением красных данных и обращать на них особое внимание. Красные данные показывают чем отличаются стеки при действиях в игре. Например, выстрелив один раз и выстрелив следующий раз можно увидеть отличия красным цветом в стеке в реальном режиме. Это могут быть не только изменения патронов, но и чего-то другого, когда уже стреляем другим оружием. Важно то, что можно видеть изменения в реальном времени, а не по копиям стека, которые приходилось раньше снимать много раз. Мы можем видеть как часто по времени что-то меняется, все в динамике...
Есть у меня сомнения по поводу постоянного ESP сравнения, при котором происходит "наблюдение" за стеком, но пока оставлю как есть.
Установка
Распаковать файлы архива в директорию "autorun". Например,
C:\Program Files (x86)\Cheat Engine 6.4\autorun
Краткое руководство-
Запускаем игру
-
Находим адрес параметра
-
Ставим брейкпоинт на адрес и появляются инструкции (или что-то делаем в игре чтобы инструкции появились)
-
Выделяем инструкцию, которую требуется исследовать
-
Останавливаем отладку
-
Открываем Stack Viewer из окна Дизассемблер-> Tools->* Stack Viewer [Plugin] и переносим в ESP, EIP (или RSP, RIP) в поля окна Stack Viewer. Нажимаем галку "Is Active" и идем в игру, и если надо что-то делаем в игре, потому что инструкция должна выполниться хотя бы один раз чтобы заполнить дамп стека в реальном времени
-
Открываем окно расструктуризации и пишем метку "MemStackRunTime" (или другую) и делаем расструктуризацию.
-
Открывает плагин Tiny Dumper и клонируем "MemStackRunTime" в другую метку "StackDump1" (или другую). Теперь у нас в окне две структуры: с разовой копией и постоянно обновляющейся копией стека.
-
Идем в игру и повторно делаем какие-то действия при этом наблюдаем за окном расструктуризации. Если в окне красные данные не появились, то следует проскролить структуру ниже. Если красные данные появились, то можно повторить действия в игре и пронаблюдать в реальном режиме закономерность изменения красных данных и частоту их изменения. Возможно найдутся интересные зависимости связанные с каким-то действием в игре. Если красных данных не нашлось, то никаких изменений в стеке не было. Попробуйте сделать что-то другое.
-
Для остановки наблюдения за стеком выключаем галку "Is Active"
-