• Cursor AI — IDE для ИИ агентного программирования

    cursorai cline copilot llm ai aiagent
    1
    0 Голоса
    1 Сообщения
    18 Просмотры
    MasterGHM
    Cursor AI — практический опыт и выводы Cursor AI — это IDE на базе Visual Studio Code, ориентированная на программирование с использованием ИИ. Это не единственное решение на рынке — аналогов сегодня достаточно много. На практике мне удалось поработать с разными агентами и инструментами: Cursor AI Cline GitHub Copilot различные LLM-провайдеры локальный LLM-сервер (по возможностям — довольно слабый) --- Общие впечатления В целом Cursor AI — мощный инструмент. Всё, что было запланировано, удавалось реализовывать поэтапно и достаточно аккуратно. Ключевой момент — почувствовать, как правильно “вести LLM” к нужному результату. Когда это получается, эффективность становится заметно выше. При этом важно понимать: code review после работы LLM обязателен поверхностные правки почти всегда нужны это касается и inline-команд ИИ ИИ сильно ускоряет работу, но не отменяет ответственность разработчика. --- Unity3D + C# Я очень рекомендую Cursor AI для программирования под Unity3D и C#. С высокой вероятностью вы не пожалеете. Более того, не использовать Cursor AI или аналогичные инструменты сегодня — потенциальная ошибка. Работая с ними, действительно можно многому научиться. В отличие от классического общения с ИИ через чат: агент часто сам быстро вносит правки в код меньше ручного копирования и вставки быстрее итерации Программировать можно практически всё — вплоть до CE Lua-плагинов, которыми я планирую заняться в ближайшее время и выложить новую версию. Пока они находятся на стадии тестирования. --- Стоимость и порог входа Да, всё это не бесплатно, но в большинстве случаев оно того стоит. Если вы ещё не пробовали: просто попробуйте даже безлимитного тарифа на первое время достаточно этого хватит, чтобы понять, подходит ли инструмент под ваш workflow --- Куда всё движется В перспективе привычные чаты в стиле ChatGPT, в том виде, в каком мы их знаем сейчас, будут всё менее интересны. Настоящий прирост эффективности дают: ИИ-агенты оркестрация MCP-серверы Простой пример: тысяча правок через чат с постоянным копированием и вставкой vs тысяча правок, где агент сам вносит изменения в код Разница в эффективности — колоссальная. --- Итог Каждому разработчику в итоге придётся: выстраивать собственный workflow адаптироваться к ценам и инструментам выбирать оптимальные модели и подходы Цель одна — максимальная производительность при минимальных затратах времени и ресурсов. --- Ниже — сравнительная таблица, оформленная в Markdown для NodeBB. Я опирался на практический опыт пользователей и типовые сценарии Unity/C#-разработки, без маркетинговых искажений. --- Сравнение инструментов: Cursor AI / GitHub Copilot / Cline Критерий Cursor AI GitHub Copilot Cline Тип инструмента IDE (fork VS Code) с ИИ-агентами Плагин автодополнения Агент для VS Code Работа с проектом 🟢 Контекст всего workspace 🟡 Ограниченный контекст 🟢 Глубокий доступ к файлам Агентное редактирование 🟢 Да (правит файлы сам) Нет 🟢 Да Inline-команды 🟢 Развитые (Ctrl+K) 🟡 Ограниченные 🟢 Да Многофайловые правки 🟢 Стабильно Практически нет 🟢 Да Code review 🟢 Удобно встроен 🟡 Частично 🟡 Зависит от модели Unity3D / C# 🟢 Отлично подходит 🟡 Нормально 🟡 Рабоче, но шумно Контроль правок 🟢 Diff перед применением 🟡 Через git 🟡 Через git Поддержка LLM 🟢 Много встроенных моделей 🟡 Ограничено Copilot 🟢 Любые (в т.ч. локальные) Локальные модели Нет Нет 🟢 Да Простота входа 🟢 Высокая 🟢 Очень высокая 🟡 Средняя Риск «сломать проект» 🟡 Есть, но контролируем 🟢 Минимальный Высокий без опыта Подходит для новичков 🟢 Да 🟢 Да Скорее нет Скорость итераций 🟢 Высокая 🟡 Средняя 🟢 Высокая Стоимость 🟡 Подписка 🟡 Подписка 🟢 Оплата токенов --- Краткие выводы Cursor AI Лучший баланс мощности, контроля и удобства Оптимален для Unity3D и C# Подходит как для одиночной, так и для сложной проектной разработки Требует дисциплины и code review GitHub Copilot Отличный автокомплит Минимальные риски Почти не подходит для сложных архитектурных правок Cline Максимальная гибкость и контроль Поддержка локальных моделей Высокий риск ошибок без опыта Больше подходит для экспериментальных workflow --- Итоговая рекомендация Unity3D / C# / production → Cursor AI Подсказки и автокомплит → Copilot Эксперименты, локальные LLM, кастомные пайплайны → Cline
  • Флуд чат

    Перенесена
    5
    0 Голоса
    5 Сообщения
    3k Просмотры
    P
    GTA5.CT Таблица уже устарела. Но я с ней игрлал в онлайне. И меня не банили.
  • Избирательное выполнение кода Lua в автоассемблере

    Перенесена Не решенные
    1
    0 Голоса
    1 Сообщения
    183 Просмотры
    PitronicP
    Возникла необходимость в коде автоассемблера в таблици выполнения кода луа, в середине кода ассемлера. Задача стоит такая, при активации скрипта в таблице, если адрес drunk имеет значение 0 выполнить код луа, а если нет, выпонить команду ассемлера в метке newmem
  • сделать скрол на функции Direc3D при генерации таблици

    Перенесена Не решенные
    2
    0 Голоса
    2 Сообщения
    213 Просмотры
    MasterGHM
    Врядли, там есть готовый компонет ingame 3d -скролл. Надо делать свой. Лучше написать на форум CE. Ты никогда не делал свой скролл на каком-нибудь, некотором языке программирования? Например, бесконечный скролл? Принцип один и тот же,только реализация отличается.
  • Подписка на новости форума (Опрос)

    Перенесена
    4
    0 Голоса
    4 Сообщения
    507 Просмотры
    PitronicP
    Ну можно и так.
  • Проблемма при загрузке файлов

    Перенесена
    4
    0 Голоса
    4 Сообщения
    265 Просмотры
    MasterGHM
    Права на загрузку файлов выставил всем на группу подтвержденных пользователей. Это делается один раз администратором У @LIRW, вроде, нет подтверждения. У кого нет подтверждения сколько-то дней, те не смогут писать. При возникновении проблем с регистрацией нужно написать мне. Если нельзя со старой учетки, то - с новой
  • Сборник английских словарей

    Перенесена английский chatgpt ai
    1
    5
    0 Голоса
    1 Сообщения
    71 Просмотры
    MasterGHM
    Приложение называется 2books на GooglePlay. Там доступны словари часто повторяемых слов. Сгенерированы судя по описанию на ChatGPT. В Интернете можно также найти базы английских слов до 450К. Из словарей можно сделать свою какую-нибудь программу, которая поможет изучать английский язык... Если бы сделать такую игру, в которой изучение слов английского языка было целью прохождения, то, возможно, это было бы увлекательно и быстро запоминались слова. Скорее всего, такие игры уже есть, можно попрбовать поискать.
  • Эмулятор Android с root

    Перенесена
    1
    0 Голоса
    1 Сообщения
    705 Просмотры
    MasterGHM
    Root Bluestacks 5 (No downloads, x64/x32) | LATEST | Working 2024 Если Вам нужен Root для Android, то скачиваем BlueStacks 5 (https://www.bluestacks.com/ru/bluestacks-5.html). Смотрим видео. Делаем root и дальше ищем гайды по хакам apk.
  • Нужен чита на урон

    Перенесена
    6
    0 Голоса
    6 Сообщения
    396 Просмотры
    P
    Для Pitronic'а Привет Pitronic
  • Базовые уроки по node.js

    Перенесена
    1
    0 Голоса
    1 Сообщения
    100 Просмотры
    MasterGHM
    Базовые уроки про backend на node.js (с первого урока). За 2 дня можно въехать в node.js вместе с сервером базы данных. Ну, конечно, это только для программистов, которые уже имели опыт на чем-то другом... #13 Уроки Node.js - Как подключить Bootstrap на Node.js и добавить запись в БД
  • Выполнение команды lua на кнопках формы

    Перенесена Решенные
    23
    0 Голоса
    23 Сообщения
    1k Просмотры
    PitronicP
    Может и я просто забыл. Всё равно работает.
  • Сохранение данных в SQL Lite (пример)

    Перенесена
    1
    0 Голоса
    1 Сообщения
    104 Просмотры
    MasterGHM
    В этом примере CE собирает статистику подключенного процесса присваивая рейтинг. Чем чаще процесс открыт, тем выше его рейтинг. c=createSQLite3Connection() c.DatabaseName = 'C:\\VPProjects.sqllite' c.Connected=true t=createSQLTransaction() t.SQLConnection=c t.Active=true tn=c.getTableNames() if #tn==0 then print("empty") c.ExecuteDirect([[ CREATE TABLE something ( 'id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 'processname' char(256) NOT NULL, 'rating' INTEGER); ]]) tn=c.getTableNames() if #tn==0 then error('no table created') end end print("tables:") local hassomething=false local i for i=1,#tn do print(tn[i]) if tn[i]=='something' then hassomething=true end end if hassomething then pn=process if (pn==nil) or (p=='nil') then pn='no process' end --check if pn is in the table, if so, increment rating, else add it q=createSQLQuery() q.SQLConnection=c q.SQLTransaction=t q.SQL.Text=string.format([[ Select * from something where processname='%s' ]],pn) --not secure, I know, just an example q.Active=true if q.RecordCount>0 then print("In the list") fields=q.Fields print("fieldcount="..fields.Count) local id=q.FieldByName('id').asInteger print("id="..id) local rating=q.FieldByName('rating') print("rating="..rating.asInteger) q.Active=false q.StatementType='stUpdate' q.SQL.Text=string.format([[update something set rating=rating+1 where id=%d]], id) q.ExecSQL() else print("Not yet in the list") c.ExecuteDirect(string.format([[insert into something(processname,rating) values('%s',1)]],pn)) end q.Active=false q.StatementType='stSelect' q.SQL.Text=[[select * from something]] q.Active=true count=1 print(string.format("RecordCount=%d", q.RecordCount)) while not q.EOF do print("line "..count) local i for i=0, q.Fields.Count-1 do print(string.format(" %s = %s", q.Fields[i].FieldName, q.Fields[i].Value)) end q.next() count=count+1 end q.Active=false q.destroy() else error("something doesn't exist") end t.Commit() t.Active=false c.Connected=false t.destroy() c.destroy() Для чего можно использовать базы данных? для хранения большого количества связанных данных. Например, это хранение данных анимаций и костей. Т.е. можем записывать анимации персонажей, присваивать имя анимации, идентификатор. Дублировать, менять на свои. Записывать и менять конфигруации песонажей Записывать позиции, углы камер или персонажей Делать карту с описаниями, какой npc, где расположен, какой инвентарть и т.п. и менять его Теоритически базу можно использовать удаленно на через сервер базы данных, а модфицированные клиенты могут синхронизироваться. Фактически из сингла можно сделать мультиплеер. Или же взять клиент игры и сделать в нем свою базу для игры в сингле (для себя к примеру) А для чего еще можно использовать базу данных? Если кто знает или есть идеи, то можно вместе обсудить.
  • CE Lua Крестики и нолики

    Перенесена
    1
    1
    0 Голоса
    1 Сообщения
    69 Просмотры
    MasterGHM
    Крестики и нолики.CT Игра с рандомом. Есть счет. Запускается через таблицу в аттаче. Здесь мог быть 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()
  • Tool C# Regular Expression

    Перенесена
    1
    1
    0 Голоса
    1 Сообщения
    74 Просмотры
    MasterGHM
    Regular Expression.rar string allText = richTextBox1.Text; string pattern = textBox2.Text; string s = string.Empty; try { Regex regex = new Regex(pattern); MatchCollection matches = regex.Matches(allText); if (matches.Count > 0) { foreach (Match match in matches) s += match.Value + ";\r\n"; } else { s = "Совпадений не найдено"; } textBox3.Text = s; } catch (Exception) { //throw; }
  • Ветвления кода связанные с адресом (старые записи)

    Перенесена
    2
    2
    0 Голоса
    2 Сообщения
    149 Просмотры
    MasterGHM
    Трассеровка по ретам ------- На скриншоте 22 ветви трассеровки от адреса патронов не входя в call-ы до корневого цикла. Корневой цикл определяется, когда поиск происходит более трех секунд и не находит ничего. Вполне хватает этого времени. Буду еще повторно тестить и проверять доходит ли он цикла или надо еще что-то придумывать. Желтым выделяется точка, вертикальная полоса ветви и связи с такими же узлами. Узел это адрес выхода из ret Внизу ряд счетчиков от 00 до 99. Если более 99 то отсчет заного. Показывает дианамику обращения к ветвям после нахождения корневого цикла Есть еще несколько функций, которых не видно на скриншоте — в контекстном меню. Анализ можно запустить из окна CE из главной таблицы, выделив адрес и опцию либо на чтение, либо на доступ. При тестах увидел, что логи неполные. Например, первый кружок это инструкция читающая патроны очень часто. От этой инструкции идут вверх множество вариантов ветвей,а у меня один вариант — вертикальная полоска с кружками. От первого круга надо сделать ветвление влево и вправо. Занялся модернизацией этого рисования и оптимизацией. Например, чтобы определить является ли проход по ret, то не нужен дизассемблер. Залез в доки и посмотрел опкоды function IsRet(address) local value = readBytes(address,1, false) return value == 0xC3 or value == 0xCB or value == 0xC2 or value == 0xCA end Скорость трассеровки должна в несколько раз увеличиться. К сожалению, смогу это узнать, когда перепишу текущий плагин. Там были уже сделаны изменения (все еще сырое для публикации плагина, пока не публикую) Нумерация ветвей Клик на круг — переход в дефоттный дизассемблер Подсвечивать выбранный круг Перерасчет позиций, когда поменялся размер окна Счетчики выполнений инструкций срабатывающих к обращению на адрес Изменен способ рисования связей между ветвями Контекстное меню Показать ветку Контекстное меню Скрыть ветку На скрытой ветви не показываются связи упрощая обзор. Код поднимается снизу вверх. Если одна ветвь ниже другой, то можно её скрыть. Ориентируемся по счетчикам хитов на инструкции Контекстное меню Сброс хитов Оптимизация поиска корневого цикла Выделение связей Оптимизация рисования новых свзей Контекстное меню пауза/продолжение Запуск из контекстного меню при выделеии адреса в главной таблице При закрытии окна снимаются все брейкпоинты Возможность ставить логи на запись из контекстного меню и на чтение в главной таблице CE
  • [CE Lua Plugin] Способ раскраски значений найденных адресов

    Перенесена
    1
    1
    0 Голоса
    1 Сообщения
    55 Просмотры
    MasterGHM
    Пример раскрашивания адресов без каких-либо условий MainForm.Foundlist3.OnCustomDrawSubItem = function(sender, ListItem, SubItemIndex, state, DefaultDraw) if ListItem.Index % 3 == 0 then if SubItemIndex % 2 == 0 then sender.canvas.font.color = 0xff0000 else sender.canvas.font.color = 0x00ffff end else sender.canvas.font.color = 0xffff00 end return true end Из прошлой записи блога нашли "MainForm.Foundlist3" для работы с TListView (компонент от Lazarus среды разработки) OnCustomDrawSubItem — функция обработчик раскрашивания вложенных элементов в Item. Не поленитесь, зайдите в файл документации (C:\Program Files\Cheat Engine 7.4\celua.txt) Также есть OnCustomDrawItem — раскрашивание невложенных элементов. source Этот способ раскрашивания можно использовать по условиям. Чтобы связать условия с адресами и цветом смотри MemScan Class, FoundList class в celua.txt.
  • Поиск данных в окне Tracer

    Перенесена tracer ce lua
    1
    0 Голоса
    1 Сообщения
    82 Просмотры
    MasterGHM
    \-- ищет адрес по адресу referencedAddress == 0x0165F8BC \-- ссылка на байты. Почему-то не работает. Ниже будет другой путь referencedBytes == dwordToByteTable(98) \-- сравнение по инструкции. В конце инструкции нужно ставить пробел instruction == "ret " \-- так будет искать все вхождения "mov" instruction:match("mov") Ну и более интересная версия перебора и одновременного выделения записей. Здесь нужно открыть окно "Трейсера" и рядом в Lua окне писать свои условия в функции "Compare()", "PrintData()", Selected() -- Поиск окна Трейслога function GetTTreeViewTracelogs() local max = getFormCount() for i=0, max-1 do if(getForm(i).ClassName == 'TfrmTracer') then return getForm(i) end end return nil end function FindTraceLogData() -- Нашли окно Трейслога tracerForm = GetTTreeViewTracelogs() -- Перебираем все записи for index=0, tracerForm.Count do -- Если запись пуста, то пропускаем if tracerForm.Entry[index] ~= nil then local entry = tracerForm.Entry[index] if Compare(entry) then Selected(entry, index) PrintData(entry,index ) end end end end \-- Можно свое условие addressEAX = 0x001FB780 function Compare(entry) return addressEAX == entry.context.EAX end function PrintData(entry) --print(tracerForm.Entry[index].instruction) print(disassemble(entry.context.RIP)) end function Selected(entry, index) tracerForm.lvTracer.Items[index].Selected = true end FindTraceLogData() Из документации по окну Tracer TfrmTracer class (Inheritance: Form->ScrollingWinControl->CustomControl->WinControl->Control->Component->Object) properties Count: integer - number of entries in the list selectionCount: integer - The number of selected entries Entry[index]: table - Information about each entry. Read only. (Index starts at 0) table is formatted as: { address: integer - address of the instruction instruction: string - disassembled instruction instructionSize: integer - bytesize of the instruction referencedAddress: integer - address the code references referencedData: bytearray - The bytes of the referenced data at the time of tracing context: contexttable - the state of the cpu when this instruction got executed (contains registers(EAX/RAX, ...), floating points(FP) and XMM values hasStackSnapshot: boolean - set to true if there is a stack entry selected: boolean - Set to true if the entry is selected } StackEntry[index]: bytearray - The stacksnapshot of that entry. Nil if not available methods \--------------------------------------------------- Treeview Class : (Inheritance: CustomControl->WinControl->Control->Component->Object) createTreeView(owner) properties Items: TreeNodes - The Treenodes object of the treeview (ReadOnly) Selected: TreeNode - The currently selected treenode methods beginUpdate() endUpdate() getItems() getSelected() setSelected() fullCollapse() : Collapses all the nodes, including the children's nodes fullExpand() : Expands all the nodes and all their children saveToFile(filename): Saves the contents of the treeview to disk \--------------- TreeNodes class : (Inheritance: TObject) properties Count : Integer - The total number of Treenodes this object has Item[]: TreeNode - Array to access each node [] = Item[] methods clear() getCount() getItem(integer) : Return the TreeNode object at the given index (based on the TreeView's Treenodes) add(text:string): Returns a new root Treenode object insert(treenode, string): Returns a new treenode object that has been inserted before the given treenode insertBehind(treenode, string): Returns a new treenode object that has been inserted after the given treenode \--------------- TreeNode class : (Inheritance: TObject) properties Text: string - The text of the treenode Parent: Treenode - The treenode this object is a child of. (can be nil) (ReadOnly) Level: Integer - The level this node is at HasChildren: boolean - Set to true if it has children, or you wish it to have an expand sign Expanded: boolean - Set to true if it has been expanded Count : Integer - The number of children this node has Items[]: Treenode - Array to access the child nodes of this node [] = Items[] Index: Integer - The index based on the parent AbsoluteIndex: Integer - The index based on the TreeView's Treenodes object (Items) Selected: Boolean - Set to true if currently selected MultiSelected: Boolean - Set to true if selected as well, but not the main selected object Data: Pointer - Space to store 4 or 8 bytes depending on which version of CE is used methods delete() deleteChildren() makeVisible() expand(recursive:boolean=TRUE OPTIONAL) : Expands the given node collapse(recursive:boolean=TRUE OPTIONAL) : collapses the given node getNextSibling(): Returns the treenode object that's behind this treenode on the same level add(text:string): Returns a Treenode object that is a child of the treenode used to create it ------------------------------------------ wordToByteTable(number): {} - Converts a word to a bytetable dwordToByteTable(number): {} - Converts a dword to a bytetable qwordToByteTable(number): {} - Converts a qword to a bytetable floatToByteTable(number): {} - Converts a float to a bytetable doubleToByteTable(number): {} - Converts a double to a bytetable extendedToByteTable(number): {} - Converts an extended to a bytetable stringToByteTable(string): {} - Converts a string to a bytetable wideStringToByteTable(string): {} - Converts a string to a widestring and converts that to a bytetable byteTableToWord(table, OPTIONAL signed:boolean): number - Converts a bytetable to a word byteTableToDword(table, OPTIONAL signed:boolean): number - Converts a bytetable to a dword byteTableToQword(table): number - Converts a bytetable to a qword byteTableToFloat(table): number - Converts a bytetable to a float byteTableToDouble(table): number - Converts a bytetable to a double byteTableToExtended(table): number - Converts a bytetable to an extended and converts that to a double byteTableToString(table): string - Converts a bytetable to a string byteTableToWideString(table): string - Converts a bytetable to a widestring and converts that to a string bOr(int1, int2) : Binary Or bXor(int1, int2) : Binary Xor bAnd(int1, int2) : Binary And bShl(int, int2) : Binary shift left bShr(int, int2) : Binary shift right bNot(int) : Binary not Для вывода referencedBytes из трейслога можно использовать byteTableToDword(referencedBytes) (смотрим документации выше) получая из TfrmTracer.Entry[index].referencedBytes или в строке поиска у Трейслога вбить byteTableToDword(referencedBytes) > 0 and print(string.format("0x%08X - 0x%08X", RIP, byteTableToDword(referencedBytes))) == 1
  • Функции для работы с адресами

    Перенесена
    1
    0 Голоса
    1 Сообщения
    81 Просмотры
    MasterGHM
    disassemble(address): Disassembles the given address and returns a string in the format of "address - bytes - opcode : extra" splitDisassembledString(disassembledstring): Returns 4 strings. The address, bytes, opcode and extra field getInstructionSize(address): Returns the size of an instruction (basically it disassembles the instruction and returns the number of bytes for you) getPreviousOpcode(address): Returns the address of the previous opcode (this is just an estimated guess)
  • Пользовательские тип данных в hex-окне (пример)

    Перенесена custom types
    1
    0 Голоса
    1 Сообщения
    59 Просмотры
    MasterGHM
    function bytes_to_value_function(b1,b2,b3,b4) -- для примера local table = {b1, b2, b3, b4} local dword = byteTableToDword(table) local refDataFromAddress = getAddressSafe(dword) if dataPointer ~= nil then return refDataFromAddress end return dword end function value_to_bytes_function(integer) -- просто для примера return bXor(integer, 100) end local isFloat = false registerCustomTypeLua('Pointer 2', 4, bytes_to_value_function, value_to_bytes_function, isFloat) Справка CustomType class (Object) The custom type is an convertor of raw data, to a human readable interpretation. global functions registerCustomTypeLua(typename, bytecount, bytestovaluefunction, valuetobytesfunction, isFloat) Registers a Custom type based on lua functions The bytes to value function should be defined as "function bytestovalue (b1,b2,b3,b4)" and return an integer as result The value to bytes function should be defined as "function valuetobytes (integer)" and return the bytes it should write returns the Custom Type object registerCustomTypeAutoAssembler(script) Registers a custom type based on an auto assembler script. The script must allocate an "ConvertRoutine" and "ConvertBackRoutine" returns the Custom Type object getCustomType(typename) : Returns the custom type object, or nil if not found properties name: string functiontypename: string CustomTypeType: TCustomTypeType - The type of the script script: string - The custom type script scriptUsesFloat: boolean - True if this script interprets it's user side values as float methods byteTableToValue({bytetable},Address Optional) valueToByteTable(value, Address Optional)
  • Lua генерирует и исполняет код

    Перенесена loadstring генерация кода
    1
    0 Голоса
    1 Сообщения
    822 Просмотры
    MasterGHM
    Функция loadstring позволяет исполнять текст как код. Попробуем генерировать числа, сравнения чисел и логику И, ИЛИ. Цель: просто пример. Создать пары случайных чисел А и Б. Случайно сравнить попарно. Создать случайно логику "И, ИЛИ" и сравнить результаты сравнения до тех пор, пока не будут истинны function CheckTrue(parameter, strue, sfalse) if parameter then print(strue) else print(sfalse) end end ProgrammCompare_AxB = {} function ProgrammCompare_AxB:New(_name, _tableStringCondition) local obj = {} obj.programmName = _name obj.tableStringCondition = _tableStringCondition obj.stringCondition = '' obj.randomProgramm = '' function obj:MakeProgramm() obj.stringCondition = obj.tableStringCondition[math.random(1, #obj.tableStringCondition)] print(obj.stringCondition) obj.randomProgramm = 'function ' ..obj.programmName..'(a, b) return a '..obj.stringCondition..' b end' end function obj:RunProgramm(a, b) loadstring (obj.randomProgramm)() result = nil loadstring (string.format('result = %s(%s,%s)', obj.programmName, a, b))() CheckTrue ( result, string.format('a = %s, b = %s, result = true', a, b), string.format('a = %s, b = %s, result = false', a,b) ) return result end setmetatable(obj, self) obj.__index = ProgrammCompare_AxB return obj end compareProgramm1 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_1', { '>', '<', '>=', '<=', '==', '~=' }) compareProgramm2 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_2', { 'and', 'or' }) repeat compareProgramm1:MakeProgramm() compareProgramm2:MakeProgramm() -- Подбирать значения local a = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local b = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local c = compareProgramm2:RunProgramm(a, b) until c Пример вывода в Cheat Engine: >= or a = 83, b = 75, result = true a = 18, b = 86, result = false a = true, b = false, result = true Т.е. (83 >= 75 or 18 >= 86) == true, т.к. первое условие верное 83 >= 75 83 >= 75 = true 18 >= 86 = false
Любое копирование материалов с указанием первоисточника.
СeLua[RU] 2026©