• Большой брейкпоинт page exceptions

    Перенесена Статьи и видео breakpoint фишки ce lua
    1
    4
    0 Голоса
    1 Сообщения
    104 Просмотры
    MasterGHM
    Наткнувшись на тему вспомнил, что не все написал. В прошлом посте блога рассматривал бряк через DBVM. К сожалению, та версия dbvm из поста блога пропускала очень много инструкций и практически смысла нет её юзать. Например она определяла 16 инструкций, когда их было несколько тысяч, т.е. например 500 оффестов и на каждой по 10 инструкций. По DBVM надо, конечно, писать Дарк Байту, но желания нет. Так вот. Не только с DBVM можно ставить бряки на участок памяти. Есть еще тип брейкпоинтов page exceptions. О нем давно-давно известно и он как на ладони, но почему-то я пропустил его, когда искал оффсеты в структурах С ним можно работать с lua и без. Ловит огромное количество инструкций. Желательно мощное железо, т.к. игра скорее всего будет очень тормозить по 2-5 fps. Но на короткий запуск сойдет. 5 секунд и достаточно для снятия логов. На пару действий в игре тоже сойдет: выстрел или пермещение персонажа, прыжок или вообще ничего не делаем просто снимаем логи. способ поставить бряк из окна памяти. Подопытная программа "Tutorial-x86_64.exe" Здесь видно, что размер 720 байт Логи из окна инструкций CE 1000259AE - 48 8B 00 - mov rax,[rax] 1000259C3 - 48 8B 00 - mov rax,[rax] 10001D70C - F7 40 50 10000000 - test [rax+50],00000010 10001D734 - 48 8B 00 - mov rax,[rax] 1000AAB40 - 48 83 78 70 00 - cmp qword ptr [rax+70],00 10001D809 - F7 40 50 10000000 - test [rax+50],00000010 10000D452 - 48 8B 0A - mov rcx,[rdx] 10005AE70 - 83 40 68 01 - add dword ptr [rax+68],01 1000A4CF5 - F7 40 50 10000000 - test [rax+50],00000010 1000A4EB8 - 48 8B 00 - mov rax,[rax] 10000DA76 - 4C 8B 32 - mov r14,[rdx] 10005AE90 - 83 68 68 01 - sub dword ptr [rax+68],01 100139C13 - F7 40 50 10000000 - test [rax+50],00000010 100139C32 - 48 8B 48 60 - mov rcx,[rax+60] 100139C46 - 48 8B 40 60 - mov rax,[rax+60] 10009CEFB - 48 8B 00 - mov rax,[rax] 100098850 - 8B 80 80010000 - mov eax,[rax+00000180] 1000A4E81 - 81 88 00010000 00200000 - or [rax+00000100],00002000 1000A4E98 - 48 8B 00 - mov rax,[rax] 1000AD685 - F7 40 50 08000000 - test [rax+50],00000008 10009BFB8 - 8B 40 50 - mov eax,[rax+50] 10009816F - F7 40 50 08000000 - test [rax+50],00000008 100098236 - 48 8B 00 - mov rax,[rax] 10001BECE - 48 8B 00 - mov rax,[rax] 100098419 - F7 40 50 08000000 - test [rax+50],00000008 1000A2A28 - 48 8B 00 - mov rax,[rax] 1000A29F4 - 48 8B 12 - mov rdx,[rdx] 1000A4CC8 - 81 A0 00010000 FFDFFFFF - and [rax+00000100],FFFFDFFF 10001CC58 - F7 40 50 10000000 - test [rax+50],00000010 10000DB13 - 48 8B 00 - mov rax,[rax] 100095C65 - 48 8B 48 60 - mov rcx,[rax+60] 100095C75 - 48 8B 40 60 - mov rax,[rax+60] 10001CB04 - F7 40 50 10000000 - test [rax+50],00000010 10009BF35 - 8B 40 50 - mov eax,[rax+50] 10009932D - 48 8B 00 - mov rax,[rax] 10001F5C8 - F7 40 50 08000000 - test [rax+50],00000008 10001F638 - 8B 40 50 - mov eax,[rax+50] 100021803 - F7 40 50 08000000 - test [rax+50],00000008 100021923 - F7 40 50 08000000 - test [rax+50],00000008 10001ACB1 - 8B 41 50 - mov eax,[rcx+50] 10001B850 - 48 8B 48 60 - mov rcx,[rax+60] 10001B85C - 48 8B 40 60 - mov rax,[rax+60] 1000A2AC0 - 48 8B 00 - mov rax,[rax] 10013A2A3 - F7 40 50 10000000 - test [rax+50],00000010 10013A336 - 48 8B 00 - mov rax,[rax] 100098AC4 - 4C 8B 02 - mov r8,[rdx] 100098AD9 - 48 8B 00 - mov rax,[rax] 10013A35C - 48 8B 00 - mov rax,[rax] 10008A0C1 - 48 8B 00 - mov rax,[rax] 1000192A9 - 48 8B 12 - mov rdx,[rdx] 1000A3B99 - 48 8B 12 - mov rdx,[rdx] 100096636 - 8B 82 D0010000 - mov eax,[rdx+000001D0] 10008A0ED - 48 8B 00 - mov rax,[rax] 100097DF9 - 48 8B 00 - mov rax,[rax] 1000A4325 - 81 B8 80010000 FF7F0000 - cmp [rax+00000180],00007FFF 1000A6218 - F7 40 50 10000000 - test [rax+50],00000010 1000A6240 - 48 8B 00 - mov rax,[rax] 1000A6254 - 48 8B 00 - mov rax,[rax] 100097727 - 48 8B 48 60 - mov rcx,[rax+60] 100097733 - 48 8B 40 60 - mov rax,[rax+60] 10018E4D9 - F7 40 50 10000000 - test [rax+50],00000010 1000AA369 - F7 80 58010000 00400000 - test [rax+00000158],00004000 1000AA394 - 48 8B 00 - mov rax,[rax] 1000AA600 - 48 83 B8 B0020000 00 - cmp qword ptr [rax+000002B0],00 100097E3B - 48 8B 00 - mov rax,[rax] 1000A74A9 - 48 8B 00 - mov rax,[rax] Способ через Lua (подробнее в документации) debug_setBreakpoint(structure_address, sizeMemory, bptAccess, bpmException, onBreakpoint) P.S. Я написал про два способа установки брейкпоинта на множество адресов без DBVM. Вручную можно ставить такие брейкпоинты, но дальше уже кропотливый просмотр на предмет того чем это может помочь. Это может помочь определить типы данных и помочь прикинуть размер структуры, а также найти активные оффсеты. Можно на Lua автоматически определять активные offsets по базовому адресу структуры и эту структуру создать и заполнить в dessectData. Если будет время напишу скрипт.
  • Sikulix-скрипт сравнения изображений в играх

    Перенесена Статьи и видео sikulix распознавание todo блог
    1
    0 Голоса
    1 Сообщения
    97 Просмотры
    MasterGHM
    Вполне читерская программа Sikulix Помощник для нахождения отличий К сожалению, эту стать невозможно восстановить. Надо искать исходники. Игра Sikulix Документация Туториалы Sikulix умеет: ждать появления или исчезновения элемента, просто ждать, периодически просматривать область в background (например игрового чата); читать (и писать) текст в(/из) поля ввода, "нажимать на клавиатуру", подсвечивать области, кликать по элементам, удерживать и перетаскивать; перемещаться по окнам по названию процессов; сохранять скриншоты в том числе определенные области; показывать много разных диалогов: ввода, тултипов, сообщений; сравнивать изображения и находить отличные области (пример выше); поиск элементов по маске; поиск групп элементов и перебор их; создание гайдов или руководств с анимациями Из наиболее интересных применений: в играх где необходим поиск графических элементов с действиями (кликеры, поиск отличий или поиск/подсчет элементов, маджонги и другие); нажать на найденных элементы(кнопки, чек-боксы); найти текстовое значение, перевести в число, посчитать; ожидает выхода человека из скайпа (или что-то вроде мониторинга чатов); Ну и так далее...
  • [The Escapists 2 + Unity + dnSpy] Спавн итемов

    Перенесена Статьи и видео unity cheats dnspy csharp блог
    1
    2
    0 Голоса
    1 Сообщения
    97 Просмотры
    MasterGHM
    Спавн итемов удалось сделать через dnSpy При клике на любой предмет на меню крафта он создается в инвентаре, а если там занято, то выкидывается на карту. Я переписал метод клика на рецепт, вот он оригинальный // Token: 0x060069FA RID: 27130 RVA: 0x00254874 File Offset: 0x00252A74 private void OnRecipeSlotClicked(int recipeSlotID) { if (recipeSlotID == this.m_CurrentClickedRecipeID) { if (!T17RewiredStandaloneInputModule.IsCurrentActiveModuleUsingController()) { this.m_CurrentClickedRecipeID = -1; } return; } if (!this.CheckHasItemsForRecipe(recipeSlotID)) { this.m_CurrentClickedRecipeID = -1; return; } CraftManager.Recipe recipeByID = CraftManager.GetInstance().GetRecipeByID(recipeSlotID); if (recipeByID != null && (!recipeByID.m_bHidden || recipeByID.m_bDiscovered)) { this.FillSlots(recipeSlotID); this.m_CurrentClickedRecipeID = recipeSlotID; return; } this.m_CurrentClickedRecipeID = -1; } На этот private void OnRecipeSlotClicked(int recipeSlotID) { int itemDataID = CraftManager.GetInstance().GetCurrentRecipes()[recipeSlotID].m_Product.m_ItemDataID; Character character = base.CurrentGamePlayer.GetComponent(); ItemManager.GetInstance().AssignItemRPC(character.m_NetView.ownerId, itemDataID, new ItemManager.ItemManagerEvent(this.OnStandingAnimItemSpawn), ref character.m_StandingStillEquipID, -1); } private void OnStandingAnimItemSpawn(Item item, int eventID) { if (base.CurrentGamePlayer.GetComponent().m_StandingStillEquipID == eventID) { Player player = base.CurrentGamePlayer; bool flag = false; if (player.GetEquippedItem() == null) { flag = player.SetEquippedItem(item, true, false, RPC_CallContexts.Master); } if (!flag) { item.DropItemInLevel(player, player.transform.position); } } } Для спавна заменить Assembly-CSharp.dll из архива, сделав копию предварительно Assembly-CSharp.rar
  • [dnSpy + Unity ] Пошаговая отладка

    Перенесена Статьи и видео unity dnspy decompile debug блог
    1
    5
    0 Голоса
    1 Сообщения
    657 Просмотры
    MasterGHM
    Эта статья позволит отлаживать игры на Unity в Runtime и при этом видеть декомпилированный код. Это, конечно, не для всех игр на Unity. Пошаговая отладка в dnSpy позволяет ставить брейкпоинты на C# код во время работы игры, перемещаться по коду, просматривать значения переменных. Сэкономит кучу времени при поиске и отладке игрового кода, Страница загрузки dnSpy Скачиваем dnSpy и все архивы с mono.dll файлами Unity-debugging-4.x-win32.zip Unity-debugging-4.x-win64.zip Unity-debugging-win32.zip Unity-debugging-win64.zip Смотрим свойства exe файла игры и определяем по нему версию Unity. Например, "Версия продукта 5.5.0.3120186" или версия "файла 5.50.39994" может указывать на версию Unity 5.5. Определяем разрядность приложения через Process Explorer Т.к. версия Unity 5.5 и приложение 32 разрядное, то открываем Unity-debugging-win32.zip ищем там версию Unity и заменяем mono.dll в директории игры Запускаем игру и dnSpy x86 (игра 32 разрядная поэтому x86). Открываем файл "...\Managed\Assembly-CSharp.dll" Запускаем отладку нажав F5 или кнопку Play Настраиваем соединение и жмем ок Ставим брейкпоинты, смотрим перемененные, перемещаемся по коду, пишем свой код и так далее После изменения кода, нужно перезаписать модуль предварительно сохранив его О других способах подключения пошаговой отладки есть на английском руководство. Как работать в пошаговой отладке Работать можно почти также как и в Cheat Engine в пошаговой отладке или в среде разработки программ. Начать стоит с обзора названия пространств имен, названия классов, методов и полей, Названия могут подсказать логическую связь с читом, который хотим сделать. Стоит обратить внимание на такие названия как "IsPlayer, Player, Character, CharacterController, MainCharacter, Health, Inventory, Craft" и другие. Чтобы не искать вручную можно задействовать поиск сборкам. Поиск стандартного тега "Player" в виде в строки кода (в Unity выше версии 5.0) или свойства "IsPlayer" может помочь найти игрока или отличить от чужих. Важно представлять иерархию игровых объектов, которую мы не видим в dnSpy. Программист работая в Unity видит это окошко много лет и эту иерархию всегда представляет смотря на скрипты в dnSpy Скрипты наследники от MonoBehavior могут находиться на игровом объекте и могут работать как с ним так и с другими объектами. Получается такая штука, что игровой объект всегда имеет Transform компонент с полями позиций, углами и scale. Классы Transform и GameObject самые основные. Методами этих классов можно разместить объект в мире, создать или удалить его. В идеале удалив объект со сцены не должно быть никаких ошибок связанных с пустыми ссылками, потерей объекта. Также и клонировав объект, тоже не должно быть ошибок. Но не всегда так просто отспавнить игровой объект. Если это сделать методами UnityEngine, то другие классы ничего не будут знать о появлении игрового объекта. Нужно ставить брейкпоинт в функции Start или Awake в классе и трейсить по Shift+11 чтобы выйти на функцию разработчиков спавна этого GameObject. Функции Start или Awake (в классе наследника от MonoBehavior) срабатывают один раз при включении скрипта и инициализации. По ним можно выйти на строку кода, которая создает объекты в мире. Отдельно стоит сказать про количество скриптов. Практически в любой игре, которая мне попадалась в dnSpy много скриптов или очень много. Иногда и не будет понятных названий у типов (из-за обфускации). В любом случае при пошаговой отладке можно найти требующиеся участки кода для создания чита и использовать их по другой логике. Основные приемы В Update можно обновлять параметры только своего игрока. Например, в Character классе сделать сравнения в Update по IsPlayer свойству (если оно там есть) и у тебя за каждый кадр рендеринга будет максимум характеристик. В Update с классом Input можно считывать хоткеи. В Start и Awake можно подгружать свои ассеты с внутриигровым user interface. Код скриптов перед загрузкой ассетов должен быть внедрен через dnSpy Иерархию игровых объектов и инспектор, если очень нужно, то можно отрисовать в user interface. Обычно не требуется. (поищите по форуму в игрострое) В заключении Пока нет времени делать трейнер или таблицу на CE для включения опций в играх Unity. Для меня пока подходит способ через перезапись модуля в dnSpy вручную. Вместо трейнера можно сделать программу патчер, который будет проверять версию игры и перезаписывать модуль с возможностью вернуть оригинальный модуль
  • CE Script Editor [Notepad+]

    Перенесена CE Plugins todo ce plugin notepad++
    1
    0 Голоса
    1 Сообщения
    68 Просмотры
    MasterGHM
    Расширение для Notepad+ Там все файлы и ссылки: перейти Пару картинок запосчу, чтобы иметь представление что это Не хватает изменения размеров картинок. Не хватает спойлеров (добавил в todo) Не хватает цвета для текста
  • Рубрика "Lua код сегодня" №5 (активирующий скрипт)

    Прикреплена Перенесена Статьи и видео ce lua ce aa active rec ce memrec важно обучалка
    3
    3
    0 Голоса
    3 Сообщения
    179 Просмотры
    MasterGHM
    Update: Если скрипт не запускается, то вызывать reinitializeSymbolhandler(true) Пример здесь
  • CE Lua чистка памяти от утечек

    CE Plugins ce lua ce plugin memory leak
    2
    0 Голоса
    2 Сообщения
    156 Просмотры
    MasterGHM
    Оптимизация CE Lua кода по сборке мусора Есть инструкции, которые добавляют мусора больше чем другие. Показываем объем памяти мусора print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами local s = " 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] }" function GetDebugString(address) return splitDisassembledString(s) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(s, '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString2() end function OptimizeCode() GetDebugString() end local countRepeat = 500000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) for i = 1, countRepeat do NoOptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) ) Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB 1.49 Lua memory usage 1.8 MiB Lua memory usage 2.3 MiB Lua memory usage 2.3 MiB 1.47 Lua memory usage 2.3 MiB Lua memory usage 2.8 MiB Lua memory usage 2.8 MiB 1.49
  • Работа с системой контроля версий в команде разработчиков

    Справочники git-flow версионирование
    1
    0 Голоса
    1 Сообщения
    100 Просмотры
    MasterGHM
    Инфа по совместной работе с гитом. Может быть пригодится кому, а может и нет. Такую систему я использую на работе недавно. Можно совместно работать над одним большим проектом через git-flow. Возможно, кто-то из форумчан тоже использует git flow на работе. git-flow — это набор расширений git предоставляющий высокоуровневые операции над репозиторием для поддержки модели ветвления Vincent Driessen. Кратко. Модель контроля версии построена на 4 ветках master - релизы develop - разработка feature - фичи hotfix - исравления С develop начинается разработка через копирования в ветку feature. Над фичей идет работа, а после завершения feature мержится с develop и feature сразу удаляется. После запланированных изменений develop мержится с master уходя в релиз. Если возникли баги, то от master создается ветвь на hotfix . После фиксов hotfix мержится с master. Доступ к мастер ветки может иметь один человек или его доверенные лица. Ветка Develop открыта для разработчиков. Это значит, что множество разработчиков колдуют в Develop ветке, а мержит изменения с master уже главный разработчик или несколько главных разработчиков. В мастере создаются теги с обозначением версии. Учитывая номер версии МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ, следует увеличивать: МАЖОРНУЮ версию, когда сделаны обратно несовместимые изменения API. МИНОРНУЮ версию, когда вы добавляете новый функционал, не нарушая обратной совместимости. ПАТЧ-версию, когда вы делаете обратно совместимые исправления. Дополнительные обозначения для предрелизных и билд-метаданных возможны как дополнения к МАЖОРНАЯ.МИНОРНАЯ.ПАТЧ формату. git-flow заметки Семантическое версионирование
  • CE вывод списка записей и вывод свойств компонентов

    CE Plugins ce lua ce plugin ce components userdata
    2
    2
    0 Голоса
    2 Сообщения
    145 Просмотры
    MasterGHM
    Ищем свойства userData. UserData в Lua это пользовательский тип. Точно не знаю, но я думаю в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например, проверим, что главная форма CE это userData тип local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это особая таблица свойств Lua-переменной local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy() Результат в виде списка свойство переменной mainForm Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются. Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера mainFormCE.setColor(546484)
  • Lua ООП конспект

    Справочники ce lua oop
    1
    0 Голоса
    1 Сообщения
    70 Просмотры
    MasterGHM
    Пригодится для создания больших плагинов в Cheat Engine. Более ~500 строк Наследование ClassX = {} function ClassX:New(_argument1, _argument2) local obj = {} obj.argument1 = _argument1 obj.argument2 = _argument2 -- Через "self" function obj:GetValue1() return obj.argument1 end function obj:GetValue2() return obj.argument2 end setmetatable(obj, self) obj.__index = ClassX return obj end someObject = ClassX:New("A", "B") print(someObject.GetValue1()) print(someObject.GetValue2()) Woman = {} --наследуемся setmetatable(Woman ,{__index = ClassX}) --проверяем masha = Woman:New("Марья","Ивановна") print(masha:GetValue1()) --->результат: Марья Инкапсуляция Person = {} function Person:new(name) --приватное свойство local private = {} private.age = 18 local obj = {} --публичное свойство obj.name = name or "Вася" -- "Вася" - это значение по умолчанию function obj:getAge() return private.age end setmetatable(obj,self) self.__index = self return obj end vasya = Person:new() print(vasya.name) --> результат: Вася print(vasya.age) --> результат: nil print(vasya:getAge()) --> результат: 18 Полиморфизм Person = {} function Person:New(name) local private = {} private.age = 18 local obj = {} obj.name = name or "Вася" -- Защищенный от переорпеделения function obj:GetName() return "Person protected "..self.name end -- Переопределяемый function Person:GetName2() return "Person "..self.name end setmetatable(obj, self) self.__index = self return obj end --создадим класс, унаследованный от Person Woman = {} setmetatable(Woman,{__index = Person}) function Woman:GetName() return "Woman protected "..self.name end function Woman:GetName2() return "Woman "..self.name end --проверим masha = Woman:New() print(masha:GetName()) --> Person protected Вася print(masha:GetName2()) --> Woman Вася ref
  • FPU инструкция FINCSTP. Очистка ST(0)

    Справочники ce aa fincstp
    1
    1
    0 Голоса
    1 Сообщения
    89 Просмотры
    MasterGHM
    Команда FINCSTP добавляет единицу (без переноса) к трехбитному полю TOP слова состояния FPU. Эффект действия команды FINCSTP заключается во вращении стека. Она не изменяет регистров тэгов и не перемещает данные. Она не эквивалентна операции выталкивания из стека, потому что, она не устанавливает тэг старой вершины стека в значение пустой. Флаги C0, C2, C3 регистра SW после выполнения команды не определены, флаг C1 устанавливается равным 0. Похожа на FSTP, также вращает стек регистров FPU (я кстати не знал, увидел при тестах в CE), но только не перемещает значение по адресу. FSTP [здесь указывается адрес или регистр] FINCSTP Если нужно вытолкнуть значение из ST(0), а адрес куда его выталкивать не нужен, то можно сделать так FINCSTP Или аналог FSTP ST(0) При использовании стоит обратить внимание на флаги, возможно их состояние будет влиять на исполнение кода. *Вообще не помню почему я пишу "выталкивать значение" через fstp, когда оно появляется снизу в ST(8). Т.е. не выталкивается по сути.
  • Сравнение времени выполнения двух функций

    Перенесена Статьи и видео обучалка ce lua optimization
    2
    0 Голоса
    2 Сообщения
    132 Просмотры
    MasterGHM
    С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности. local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.3f\n", os.clock() - x)) После выполнения, показывает 2 тысячных секунды или 2 мс elapsed time: 0.002 Можно посчитать прошедшее время для другой цели. Например, если цикл в отладке выполняется более 3 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
  • Обработка исключения в Cheat Engine Lua

    Перенесена Статьи и видео ce lua exception
    1
    0 Голоса
    1 Сообщения
    113 Просмотры
    MasterGHM
    pcall() функция может вызывать функцию, которая может вызывать исключение. Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения. function ThrowException() -- раскоментировать чтобы зывать ошибку по условию некоторому -- error("string expected", 2) -- Пример вывода стека ошибки print('AAA ->> '..debug.traceback()) -- Исключение делаем temp[5] = 1 -- До этой строчки не дойдет, т.к. исключение выше будет из-за temp[5] = 1 print('BBB ->> '..debug.traceback()) end local status, err = pcall(ThrowException) -- Показать какие типы имеют статус и ошибка (это булевый и строка) print(type(status)) print(type(err)) if status then print('No Exception') else print('Exception: ' .. err) end Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта. Подробнее документация Или например если не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.
  • Обработка исключения в Cheat Engine AA

    Перенесена Статьи и видео фишки ce aa exception
    1
    0 Голоса
    1 Сообщения
    70 Просмотры
    MasterGHM
    Новые директивы try/except в AA доступны Cheat Engine 6.8 Beta2 и выше Задача try/except в AA обработать исключение, не допустить crash. Чтобы игра продолжалась, а чит в лучшем случае не закрыл бы процесс. В теории возможно определить, что был crash и что-то сделать. Например, отправить логи в свой или иной удаленный сервис аналитики, что такой-то чит не сработал... Пример от DarkByte для try/exceptс счетчиком crashes [ENABLE] alloc(newmem,2048) alloc(crashcount,4) registersymbol(crashcount) label(returnhere) label(originalcode) label(exit) newmem: push eax {$try} mov eax,[esi+95c] cmp [eax+10],0 jmp ok {$except} pop eax add [crashcount],1 jmp originalcode ok: pop eax je aftersub //it is 0 originalcode: subss xmm0,xmm3 aftersub: movss [esi+00000164],xmm0 exit: jmp returnhere "HomeworldRM.exe"+22AEEA: jmp newmem nop nop nop nop nop nop nop returnhere: [DISABLE] dealloc(newmem) "HomeworldRM.exe"+22AEEA: subss xmm0,xmm3 movss [esi+00000164],xmm0 //Alt: db F3 0F 5C C3 F3 0F 11 86 64 01 00 00
  • Считаем размер инъекции в байтах

    Перенесена Статьи и видео ce lua фишки ce aa
    1
    2
    0 Голоса
    1 Сообщения
    69 Просмотры
    MasterGHM
    Можно подхватить разные моменты активации и деактивации записи в таблице CE и рассчитать размер кода между метками По шаблону вставляем АА код для туториала Cheat Engine Регистрируем метки-маркеры в АА коде Этими метками в Lua считаем и выводим ""endCode - startCode" размер байтов Пример, который подсчитал 15 байтов Пример скрипта {$lua} memrec.OnActivate = function (memoryrecord, before, currentstate) if currentstate and not before then print("Bytes: " .. getAddress("endCode - startCode")) end return before end {$ASM} [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique alloc(newmem,$1000) label(code) label(endCode) label(startCode) registerSymbol(startCode) registerSymbol(endCode) newmem: code: startCode: cmp [ebx+00000480],000003E8 jmp return endCode: INJECT: jmp newmem nop nop nop nop nop return: registersymbol(INJECT) [DISABLE] //code from here till the end of the code will be used to disable the cheat INJECT: db 81 BB 80 04 00 00 E8 03 00 00 unregistersymbol(startCode) unregistersymbol(endCode) unregistersymbol(INJECT) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23FE3 "Tutorial-i386.exe"+23FD1: C9 - leave "Tutorial-i386.exe"+23FD2: C3 - ret "Tutorial-i386.exe"+23FD3: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD5: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD7: 00 00 - add [eax],al "Tutorial-i386.exe"+23FD9: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDB: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDD: 00 00 - add [eax],al "Tutorial-i386.exe"+23FDF: 00 53 89 - add [ebx-77],dl "Tutorial-i386.exe"+23FE2: C3 - ret // ---------- INJECTING HERE ---------- "Tutorial-i386.exe"+23FE3: 81 BB 80 04 00 00 E8 03 00 00 - cmp [ebx+00000480],000003E8 // ---------- DONE INJECTING ---------- "Tutorial-i386.exe"+23FED: 75 2C - jne Tutorial-i386.exe+2401B "Tutorial-i386.exe"+23FEF: 8B 83 68 04 00 00 - mov eax,[ebx+00000468] "Tutorial-i386.exe"+23FF5: B2 01 - mov dl,01 "Tutorial-i386.exe"+23FF7: 8B 8B 68 04 00 00 - mov ecx,[ebx+00000468] "Tutorial-i386.exe"+23FFD: 8B 09 - mov ecx,[ecx] "Tutorial-i386.exe"+23FFF: FF 91 20 02 00 00 - call dword ptr [ecx+00000220] Документация кому интересно MemoryRecord Class: The memoryrecord objects are the entries you see in the addresslist properties ID: Integer - Unique ID Index: Integer - The index ID for this record. 0 is top. (ReadOnly) Description: string- The description of the memory record Address: string - Get/set the interpretable address string. Useful for simple address settings. AddressString: string - Get the address string shown in CE (ReadOnly) OffsetCount: integer - The number of offsets. Set to 0 for a normal address Offset[] : integer - Array to access each offset OffsetText[] : string - Array to access each offset using the interpretable text style CurrentAddress: integer - The address the memoryrecord points to VarType: ValueType (string) - The variable type of this record. See vtByte to vtCustom Type: ValueType (number) - The variable type of this record. See vtByte to vtCustom If the type is vtString then the following properties are available: String.Size: Number of characters in the string String.Unicode: boolean String.Codepage: boolean If the type is vtBinary then the following properties are available Binary.Startbit: First bit to start reading from Binary.Size : Number of bits If the type is vtByteArray then the following properties are available Aob.Size : Number of bytes CustomTypeName: String - If the type is vtCustom this will contain the name of the CustomType Script: String - If the type is vtAutoAssembler this will contain the auto assembler script Value: string - The value in stringform. Selected: boolean - Set to true if selected (ReadOnly) Active: boolean - Set to true to activate/freeze, false to deactivate/unfreeze Color: integer ShowAsHex: boolean - Self explanatory ShowAsSigned: boolean - Self explanatory AllowIncrease: boolean - Allow value increasing, unfreeze will reset it to false AllowDecrease: boolean - Allow value decreasing, unfreeze will reset it to false Collapsed: boolean - Set to true to collapse this record or false to expand it. Use expand/collapse methods for recursive operations. IsGroupHeader: boolean - Set to true if the record was created as a Group Header with no address or value info. (ReadOnly) IsReadable: boolean - Set to false if record contains an unreadable address. NOTE: This property will not be set until the value property is accessed at least once. (ReadOnly) Options: String set - a string enclosed by square brackets filled with the options seperated by a comma. Valid options are: moHideChildren, moActivateChildrenAsWell, moDeactivateChildrenAsWell, moRecursiveSetValue, moAllowManualCollapseAndExpand, moManualExpandCollapse DropDownLinked: boolean - if dropdown list refers to list of another memory record eg. (memrec name) DropDownLinkedMemrec: string - Description of linked memrec or emptystring if not linked DropDownList : StringList - list of "value:description" lines, lists are still separate objects when linked, read-write DropDownReadOnly: boolean - true if 'Disallow manual user input' is set DropDownDescriptionOnly: boolean - self explanatory DisplayAsDropDownListItem: boolean - self explanatory DropDownCount: integer - equivalent to .DropDownList.Count DropDownValue[index] : Array to access values in DropDownList (ReadOnly) DropDownDescription[index] : Array to access Descriptions in DropDownList (ReadOnly) Count: Number of children Child[index] : Array to access the child records [index] = Child[index] Parent: MemoryRecord - self explanatory HotkeyCount: integer - Number of hotkeys attached to this memory record Hotkey[] : Array to index the hotkeys Async: Boolean - Set to true if activating this entry will be asynchronious. (only for AA/Lua scripts) AsyncProcessing: Boolean - True when async is true and it's being processed AsyncProcessingTime: qword - The time that it has been processing in milliseconds OnActivate: function(memoryrecord,before,currentstate):boolean - The function to call when the memoryrecord will change (or changed) Active to true. If before is true, not returning true will cause the activation to stop. OnDeactivate: function(memoryrecord,before,currentstate):boolean - The function to call when the memoryrecord will change (or changed) Active to false. If before is true, not returning true will cause the deactivation to stop. OnDestroy: function() - Called when the memoryrecord is destroyed. OnGetDisplayValue: function(memoryrecord,valuestring):boolean,string - This function gets called when rendering the value of a memory record. Return true and a new string to override the value shown DontSave: boolean - Don't save this memoryrecord and it's children methods getDescription() setDescription() getAddress() : Returns the interpretable addressstring of this record. If it is a pointer, it returns a second result as a table filled with the offsets setAddress(string) : Sets the interpretable address string, and if offsets are provided make it a pointer getOffsetCount(): Returns the number of offsets for this memoryrecord setOffsetCount(integer): Lets you set the number of offsets getOffset(index) : Gets the offset at the given index setOffset(index, value) : Sets the offset at the given index getCurrentAddress(): Returns the current address as an integer (the final result of the interpretable address and pointer offsets) appendToEntry(memrec): Appends the current memory record to the given memory record getHotkey(index): Returns the hotkey from the hotkey array getHotkeyByID(integer): Returns the hotkey with the given id reinterpret() createHotkey({keys}, action, value OPTIONAL): Returns a hotkey object disableWithoutExecute(): Sets the entry to disabled without executing the disable section global events function onMemRecPreExecute(memoryrecord, newstate BOOLEAN): If above function is defined it will be called before action* has been performed. Active property is about to change to newState. function onMemRecPostExecute(memoryrecord, newState BOOLEAN, succeeded BOOLEAN): If above function is defined it will be called after action*. Active property was supposed to change to newState. If 'succeeded' is true it means that Active state has changed and is newState. newState and succeeded are read only. *action can be: running auto assembler script (ENABLE or DISABLE section), freezing and unfreezing.
  • Выполить текст, как код

    Перенесена Статьи и видео фишки ce lua loadstring
    1
    0 Голоса
    1 Сообщения
    68 Просмотры
    MasterGHM
    Функция loadstring исполняет строку кода как функцию. f = loadstring ("print 'hello, world'") f () --> hello, world Есть еще и такая функция как string.dump. Она создает строку из функции function f () print "hello, world" end s = string.dump (f) \-- Можно строку тут же запустить как код loadstring (s) () --> hello, world Если по обратной связи строить и исполнять строку кода, то предположительно можно генерировать код другим кодом и учитывать гораздо больше условий, чем это может сделать человек. Пригодится для ИИ отладки и для ИИ бота. Код пишет другой код по обратной связи. Реальность?
  • Сверточные сети от МФТИ (лекция)

    Перенесена Статьи и видео cnn
    1
    0 Голоса
    1 Сообщения
    77 Просмотры
    MasterGHM
    Лекция. Сверточные нейронные сети Для тех, кто давно пытается понять, что такое сверточная сеть и как она работает (для меня например) Ну еще и сюда
  • Рубрика "Lua код сегодня" №4

    Перенесена Статьи и видео ce ccode ce aa ce memrec обучалка
    4
    0 Голоса
    4 Сообщения
    190 Просмотры
    MasterGHM
    Это C - язык программирования.
  • CE Вывод иерархии компонентов

    CE Plugins ce plugin ce lua ce components
    1
    1
    0 Голоса
    1 Сообщения
    100 Просмотры
    MasterGHM
    Скрипт позволит вывести иерархию компонентов CE в виде текста. Иерархия компонентов CE нужна для написания плагинов. Например, для ColorPicker и для смены шрифта (подобротнее об этом было где-то было в блоге). print("Controls list for CE "..getCEVersion()..'\n') function PrintComponents(obj, tabCount) local tabLine = string.rep(' ', tabCount) local componentCount = obj.ComponentCount if obj.Caption == nil then print(tabLine..obj.Name..'('..obj.ClassName..')') else print(tabLine..obj.Name..'('..obj.ClassName..') -> "'..obj.Caption..'"') end for i = 0, componentCount - 1 do local subObject = obj.Component[i] PrintComponents(subObject, tabCount + 1) end end PrintComponents(MainForm, 1) Результат Controls list for CE 7.4 MainForm(TMainForm) -> "Cheat Engine 7.4" Splitter1(TSplitter) Panel1(TPanel) -> "" Panel4(TPanel) -> "" advancedbutton(TSpeedButton) -> "Advanced Options" CommentButton(TSpeedButton) -> "Table Extras" lblSigned(TLabel) -> "This table has been signed by Someone" Panel5(TPanel) -> "" ProcessLabel(TLabel) -> "No Process Selected" foundcountlabel(TLabel) -> "0" ScanText(TLabel) -> "Value:" lblScanType(TLabel) -> "Scan Type" lblValueType(TLabel) -> "Value Type" LoadButton(TSpeedButton) -> "" SaveButton(TSpeedButton) -> "" Label6(TLabel) -> "Found:" SpeedButton2(TSpeedButton) -> "" SpeedButton3(TSpeedButton) -> "" btnNewScan(TButton) -> "First Scan" gbScanOptions(TGroupBox) -> "Memory Scan Options" ScanOptionsModuleList(TComboBox) Panel2(TPanel) -> "" cbCopyOnWrite(TCheckBox) -> "CopyOnWrite" cbWritable(TCheckBox) -> "Writable" cbExecutable(TCheckBox) -> "Executable" Panel3(TPanel) -> "" Label2(TLabel) -> "Stop" Label1(TLabel) -> "Start" ToAddress(TEdit) FromAddress(TEdit) Panel6(TPanel) -> "" cbFastScan(TCheckBox) -> "Fast Scan" edtAlignment(TEdit) cbPauseWhileScanning(TCheckBox) -> "Pause the game while scanning" Panel8(TPanel) -> "" rbfsmLastDigts(TRadioButton) -> "Last Digits" rbFsmAligned(TRadioButton) -> "Alignment" btnNextScan(TButton) -> "Next Scan" ScanType(TComboBox) VarType(TComboBox) ProgressBar(TProgressBar) UndoScan(TButton) -> "Undo Scan" scanvalue(TEdit) Panel7(TPanel) -> "" sbOpenProcess(TSpeedButton) -> "" btnFirst(TButton) -> "First Scan2" btnNext(TButton) -> "Next scan 2" LogoPanel(TPanel) -> "" Logo(TImage) SettingsButton(TSpeedButton) -> "Settings" pnlScanValueOptions(TPanel) -> "" rbBit(TRadioButton) -> "Bits" rbDec(TRadioButton) -> "Decimal" cbHexadecimal(TCheckBox) -> "Hex" Panel9(TPanel) -> "" pnlScanOptions(TPanel) -> "" pnlFloat(TPanel) -> "" rt3(TRadioButton) -> "Truncated" rt1(TRadioButton) -> "Rounded (default)" rt2(TRadioButton) -> "Rounded (extreme)" cbUnicode(TCheckBox) -> "UTF-16" cbCaseSensitive(TCheckBox) -> "Case sensitive" cbFloatSimple(TCheckBox) -> "Simple values only" cbpercentage(TCheckBox) -> "Percent" cbNot(TCheckBox) -> "Not" cbCodePage(TCheckBox) -> "Codepage" cbRepeatUntilStopped(TCheckBox) -> "Repeat" cbLuaFormula(TCheckBox) -> "Lua formula" cbNewLuaState(TCheckBox) -> "Separate Lua state" Panel10(TPanel) -> "" cbUnrandomizer(TCheckBox) -> "Unrandomizer" cbSpeedhack(TCheckBox) -> "Enable Speedhack" Panel14(TPanel) -> "" Label54(TLabel) -> "Speed" lblSH0(TLabel) -> "0" lblSH20(TLabel) -> "500" btnSetSpeedhack2(TButton) -> "Apply" editSH2(TEdit) tbSpeed(TTrackBar) scanvalue2(TEdit) ScanText2(TLabel) -> "Scan Value" andlabel(TLabel) -> "and" Foundlist3(TListView) (TCustomListViewEditor) btnAddAddressManually(TButton) -> "Add Address Manually" btnMemoryView(TButton) -> "Memory View" cbCompareToSavedScan(TCheckBox) -> "Compare to first/saved scan" lblcompareToSavedScan(TLabel) -> "<xxxx>" UpdateTimer(TTimer) FreezeTimer(TTimer) PopupMenu2(TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Add to new group" miAutoAssembleErrorMessage(TMenuItem) -> "<Error message here>" Deletethisrecord1(TMenuItem) -> "Delete this record" Change1(TMenuItem) -> "Change record" Description1(TMenuItem) -> "Description" Address1(TMenuItem) -> "Address" Type1(TMenuItem) -> "Type" Value1(TMenuItem) -> "Value" miUndoValue(TMenuItem) -> "Undo last edit" Smarteditaddresses1(TMenuItem) -> "Smart edit address(es)" Browsethismemoryregion1(TMenuItem) -> "Browse this memory region" miDisassemble(TMenuItem) -> "Disassemble this memory region" miShowAsSigned(TMenuItem) -> "Show as signed" Showashexadecimal1(TMenuItem) -> "Show as hexadecimal" miZeroTerminate(TMenuItem) -> "Zero-Terminate string" miShowAsBinary(TMenuItem) -> "Show as binary" miChangeColor(TMenuItem) -> "Change Color" SetHotkey1(TMenuItem) -> "Assign Hotkey" miSetDropdownOptions(TMenuItem) -> "Set/Change dropdown selection options" Freezealladdresses2(TMenuItem) -> "Toggle Selected Records" miFreezePositive(TMenuItem) -> "Freeze Positive" miFreezeNegative(TMenuItem) -> "Freeze Negative" Changescript1(TMenuItem) -> "Change script" miAsyncScript(TMenuItem) -> "Execute asynchronous" N5(TMenuItem) -> "-" miGeneratePointermap(TMenuItem) -> "Generate pointermap" Pointerscanforthisaddress1(TMenuItem) -> "Pointer scan for this address" Findoutwhataccessesthisaddress1(TMenuItem) -> "Find out what accesses this address" Setbreakpoint1(TMenuItem) -> "Find out what writes to this address" sep2(TMenuItem) -> "-" miDBVMFindWhatWritesOrAccesses(TMenuItem) -> "DBVM Find out what writes or accesses this address" sep1(TMenuItem) -> "-" Calculatenewvaluepart21(TMenuItem) -> "Recalculate new addresses" Forcerechecksymbols1(TMenuItem) -> "Force recheck symbols" N4(TMenuItem) -> "-" Cut1(TMenuItem) -> "Cut" Copy1(TMenuItem) -> "Copy" Paste1(TMenuItem) -> "Paste" MenuItem1(TMenuItem) -> "Select All" N1(TMenuItem) -> "-" CreateGroup(TMenuItem) -> "Create Header" miGroupconfig(TMenuItem) -> "Group config" miHideChildren(TMenuItem) -> "Hide children when deactivated" miBindActivation(TMenuItem) -> "Activating this entry activates it's children" miBindDeactivation(TMenuItem) -> "Deactivating this entry deactivates it's children" miRecursiveSetValue(TMenuItem) -> "Setting a value to this entry sets same value to children" miAllowCollapse(TMenuItem) -> "Allow left and right arrow keys to collapse and expand" miManualExpandCollapse(TMenuItem) -> "Manual expand/collapse" miAlwaysHideChildren(TMenuItem) -> "Always hide children" Plugins1(TMenuItem) -> "Plugins" foundlistpopup(TPopupMenu) (TMenuItem) -> "" miAddAddress(TMenuItem) -> "Add selected addresses to the addresslist" miChangeValue(TMenuItem) -> "Change value of selected addresses" miChangeValueBack(TMenuItem) -> "Change value of selected addresses back to previous/saved value" Browsethismemoryarrea1(TMenuItem) -> "Browse this memory region" Browsethismemoryregioninthedisassembler1(TMenuItem) -> "Disassemble this memory region" Removeselectedaddresses1(TMenuItem) -> "Remove selected addresses" Copyselectedaddresses1(TMenuItem) -> "Copy selected addresses" Selectallitems1(TMenuItem) -> "Select all items" MenuItem4(TMenuItem) -> "-" miShowPreviousValue(TMenuItem) -> "Show previous value column(s)" miOnlyShowCurrentCompareToColumn(TMenuItem) -> "Only show current "compare to" column" MenuItem13(TMenuItem) -> "-" miForgotScan(TMenuItem) -> "Reload the previous value list (Forgot value scan)" MenuItem14(TMenuItem) -> "-" miFlFindWhatAccesses(TMenuItem) -> "Find out what accesses this address" miFlFindWhatWrites(TMenuItem) -> "Find out what writes to this address" N2(TMenuItem) -> "-" miFoundListPreferences(TMenuItem) -> "Preferences" MenuItem19(TMenuItem) -> "-" miDisplayHex(TMenuItem) -> "Hexadecimal" miDisplayDefault(TMenuItem) -> "Default" miDisplayByte(TMenuItem) -> "Byte" miDisplay2Byte(TMenuItem) -> "2 Bytes" miDisplay4Byte(TMenuItem) -> "4 Bytes" miDisplay8Byte(TMenuItem) -> "8 Bytes" miDisplayFloat(TMenuItem) -> "Float" miDisplayDouble(TMenuItem) -> "Double" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) TopDisabler(TTimer) emptypopup(TPopupMenu) (TMenuItem) -> "" MenuItem2(TMenuItem) -> "New Item1" ccpmenu(TPopupMenu) (TMenuItem) -> "" Cut2(TMenuItem) -> "Cut" Copy2(TMenuItem) -> "Copy" Paste2(TMenuItem) -> "Paste" ActionList1(TActionList) actSave(TAction) -> "" actOpen(TAction) -> "" actAutoAssemble(TAction) -> "actAutoAssemble" actMemoryView(TAction) -> "actMemoryView" actOpenProcesslist(TAction) -> "" actOpenDissectStructure(TAction) -> "actOpenDissectStructure" actOpenLuaEngine(TAction) -> "actOpenLuaEngine" UpdateFoundlisttimer(TTimer) AutoAttachTimer(TTimer) MainMenu1(TMainMenu) (TMenuItem) -> "" (TMenuItem) -> "English" (TMenuItem) -> "Save scan session" (TMenuItem) -> "Load scan session" (TMenuItem) -> "-" File1(TMenuItem) -> "&File" miAddTab(TMenuItem) -> "Add scan tab" New1(TMenuItem) -> "Clear list" MenuItem8(TMenuItem) -> "Open Process" miOpenFile(TMenuItem) -> "Open File" miSaveFile(TMenuItem) -> "Save File" N7(TMenuItem) -> "-" miSave(TMenuItem) -> "Save" Save1(TMenuItem) -> "Save As..." Load1(TMenuItem) -> "Load" miLoadRecent(TMenuItem) -> "Load Recent" miSignTable(TMenuItem) -> "Sign table" MenuItem3(TMenuItem) -> "-" miSaveScanresults(TMenuItem) -> "Save current scanresults" miDeleteSavedScanResults(TMenuItem) -> "Delete scanresult" MenuItem6(TMenuItem) -> "-" MenuItem9(TMenuItem) -> "Generate generic trainer lua script from table" MenuItem5(TMenuItem) -> "-" MenuItem7(TMenuItem) -> "Quit" Edit3(TMenuItem) -> "&Edit" Settings1(TMenuItem) -> "Settings" Process1(TMenuItem) -> "&Process" OpenProcess1(TMenuItem) -> "Open Process window" CreateProcess1(TMenuItem) -> "Create Process" N6(TMenuItem) -> "-" a1(TMenuItem) -> "a" b1(TMenuItem) -> "b" c1(TMenuItem) -> "c" d1(TMenuItem) -> "d" e1(TMenuItem) -> "e" miTable(TMenuItem) -> "Table" miShowLuaScript(TMenuItem) -> "Show Cheat Table Lua Script" MenuItem10(TMenuItem) -> "-" miCreateLuaForm(TMenuItem) -> "Create form" miResyncFormsWithLua(TMenuItem) -> "Resynchronize forms with Lua" miLuaFormsSeperator(TMenuItem) -> "-" miAddFile(TMenuItem) -> "Add file" mi3d(TMenuItem) -> "D3D" miHookD3D(TMenuItem) -> "Hook Direct3D" MenuItem11(TMenuItem) -> "-" miSetCrosshair(TMenuItem) -> "Set custom crosshair" miWireframe(TMenuItem) -> "Toggle wireframe mode" miZbuffer(TMenuItem) -> "Toggle disabled zbuffer" miLockMouseInGame(TMenuItem) -> "Lock mouse in game window" miSetupSnapshotKeys(TMenuItem) -> "Start and configure snapshot recording" miSnapshothandler(TMenuItem) -> "Snapshot handler" ools1(TMenuItem) -> "&Tools" miDotNET(TMenuItem) -> ".Net" miGetDotNetObjectList(TMenuItem) -> "Get object list" miNetwork(TMenuItem) -> "Network" miCompression(TMenuItem) -> "Compression" miScanDirtyOnly(TMenuItem) -> "Scan changed regions only" miScanPagedOnly(TMenuItem) -> "Scan paged (physical) memory only" Plugins2(TMenuItem) -> "P&lugins" miLanguages(TMenuItem) -> "Languages" miHelp(TMenuItem) -> "&Help" Helpindex1(TMenuItem) -> "Cheat Engine Help" miLuaDocumentation(TMenuItem) -> "Lua documentation" miTutorial(TMenuItem) -> "Cheat Engine Tutorial" MenuItem12(TMenuItem) -> "Cheat Engine Tutorial (64-Bit)" MenuItem15(TMenuItem) -> "Cheat Engine Tutorial Games" miEnableLCLDebug(TMenuItem) -> "Generate errorlogs" N8(TMenuItem) -> "-" miAbout(TMenuItem) -> "About" pmTablist(TPopupMenu) (TMenuItem) -> "" miRenameTab(TMenuItem) -> "Rename" miTablistSeperator(TMenuItem) -> "-" miCloseTab(TMenuItem) -> "Close tab" pmValueType(TPopupMenu) (TMenuItem) -> "" miDefineNewCustomType(TMenuItem) -> "Define new custom type (Auto Assembler)" miDefineNewCustomTypeLua(TMenuItem) -> "Define new custom type (LUA)" miEditCustomType(TMenuItem) -> "Edit selected custom type" miDeleteCustomType(TMenuItem) -> "Delete selected custom type" miShowCustomTypeDebug(TMenuItem) -> "Show custom type debug info" ColorDialog1(TColorDialog) pmResetRange(TPopupMenu) (TMenuItem) -> "" miResetRange(TMenuItem) -> "Reset range" pmScanRegion(TPopupMenu) (TMenuItem) -> "" miPresetAll(TMenuItem) -> "Preset: Scan all memory" miPresetWritable(TMenuItem) -> "Preset: Scan writable memory" MainMenu2(TMainMenu) (TMenuItem) -> "" tLuaGCPassive(TTimer) tLuaGCActive(TTimer) mfImageList(TImageList) frmAutoInject(TfrmAutoInject) -> "Lua script: Cheat Table" Panel1(TPanel) -> "" Panel3(TPanel) -> "" btnExecute(TButton) -> "Execute script" Panel2(TPanel) -> "" MainMenu1(TMainMenu) (TMenuItem) -> "" File1(TMenuItem) -> "File" miNewWindow(TMenuItem) -> "New Window" miNewTab(TMenuItem) -> "New Tab" Load1(TMenuItem) -> "Open" Save1(TMenuItem) -> "Save" SaveAs1(TMenuItem) -> "Save As..." miLuaSyntaxCheck(TMenuItem) -> "Syntax Check" Assigntocurrentcheattable1(TMenuItem) -> "Assign to current cheat table" N2(TMenuItem) -> "-" Exit1(TMenuItem) -> "Exit" View1(TMenuItem) -> "View" Syntaxhighlighting1(TMenuItem) -> "Syntax highlighting" MenuItem3(TMenuItem) -> "Auto assembler syntax highlighting preferences" MenuItem2(TMenuItem) -> "Lua syntax highlighting preferences" MenuItem1(TMenuItem) -> "C highlighting preferences" AAPref1(TMenuItem) -> "Preferences" emplate1(TMenuItem) -> "Template" Codeinjection1(TMenuItem) -> "Code injection" APIHook1(TMenuItem) -> "API Hook" Coderelocation1(TMenuItem) -> "Code relocation" miCallLua(TMenuItem) -> "Call CE lua function" menuAOBInjection(TMenuItem) -> "AOB Injection" menuFullInjection(TMenuItem) -> "Full Injection" CheatTablecompliantcodee1(TMenuItem) -> "Cheat Table framework code" Inject1(TMenuItem) -> "Inject" Injectincurrentprocess1(TMenuItem) -> "Inject into current process" Injectintocurrentprocessandexecute1(TMenuItem) -> "Inject into current process and execute" OpenDialog1(TOpenDialog) SaveDialog1(TSaveDialog) PopupMenu1(TPopupMenu) (TMenuItem) -> "" miCut(TMenuItem) -> "Cu&t" miCopy(TMenuItem) -> "&Copy" miPaste(TMenuItem) -> "&Paste" miUndo(TMenuItem) -> "&Undo" miRedo(TMenuItem) -> "Redo" N6(TMenuItem) -> "-" miFind(TMenuItem) -> "&Find..." mifindNext(TMenuItem) -> "Find Next" mifindPrevious(TMenuItem) -> "Find Previous" miReplace(TMenuItem) -> "Replace" TabMenu(TPopupMenu) (TMenuItem) -> "" miMoveLeft(TMenuItem) -> "Move left" miMoveRight(TMenuItem) -> "Move right" miRenameTab(TMenuItem) -> "Rename" Close1(TMenuItem) -> "Close" FindDialog1(TFindDialog) undotimer(TTimer) ReplaceDialog1(TReplaceDialog) aaImageList(TImageList) (TSynAASyn) (TSynCppSyn) (TSynLuaSyn) Assemblescreen(TSynEditPlus) (TSynBeautifier) SynLeftGutterPartList1(TSynGutterPartList) SynGutterMarks1(TSynGutterMarks) SynGutterLineNumber1(TSynGutterLineNumber) SynGutterChanges1(TSynGutterChanges) SynGutterSeparator1(TSynGutterSeparator) SynGutterCodeFolding1(TSynGutterCodeFolding) SynRightGutterPartList1(TSynRightGutterPartList) (TTimer) (TAddresslist) -> "" List(TTreeviewWithScroll) (TTimer) (TTimer) Header(THeaderControl) (TPopupMenu) (TMenuItem) -> "" (TMenuItem) -> "Sort on click" (TTimer)
  • Рубрика "Lua код сегодня" №3

    Перенесена Статьи и видео ce memrec ce aa ce lua ce .ct обучалка
    1
    2
    0 Голоса
    1 Сообщения
    89 Просмотры
    MasterGHM
    Создать пустую запись чтобы пробовать вывод названия записи через lua {$lua} print(memrec.Description) [ENABLE] print('is on') [DISABLE] print('is off') Поля memrec многочисленны и описываются в документации. См. MemoryRecord Class: в ...\Cheat Engine 6.8.3\celua.txt