Попросил GPT5 написать скрипт для приложения 3ds max, который сможет информировать об потенциальных угрозах в 3d-сцене программы. После нескольких часов возни и исправлений, скрипт заработал и отлично показал себя в деле, обнаружив в сцене имитационный вредоносный код.
Кто из специалистов может посмотреть этот код? Будет от него реальная польза или это бесполезная пустышка?
По словам ИИ, MaxScript по синтаксису напоминает смесь JavaScript + Pascal, с динамической типизацией.
/* MaxScript Exorcist 3.1 (fixed - helpers moved to top-level) - Исправлена ошибка "No outer local variable references permitted here" - Вспомогательные функции вынесены на верхний уровень - Проверка папки с .ms/.mcr/.mse - Расширенное сканирование сцены (все свойства, контроллеры, материалы, XRef) - ⚡ Подсветка найденных потенциально опасных токенов - Авторы: Юра и GPT5-mini */ -- ===== GLOBAL PATTERNS ===== global patterns patterns = #( "shell", "cmd\.exe", "CreateProcess", "WinExec", "system\s*\(", "Process\.Start", "ProcessStartInfo", "DotNet\.loadAssembly", "LoadAssembly", "LoadLibrary", "ImportDLL", "dll", "WriteLine\s*\(", "Write\s*\(", "DeleteFile\s*\(", "removeFile", "renameFile", "copyFile", "RunScript", "Execute", "openFile", "fileStream", "StartProcess", "Run", "ShellExecute", "regsvr32", "CreateObject", "WScript", "ActiveXObject" ) -- ===== Helper: read ASCII strings from binary .mse ===== fn readBinaryStrings filePath = ( local strings = #() try ( local f = openFile filePath mode:"rb" local buf = "" while not eof f do ( local b = readByte f if b >= 32 and b <= 126 then buf += (bit.intAsChar b) else ( if buf.count >= 4 then append strings buf buf = "" ) ) if buf.count >= 4 then append strings buf close f ) catch() return strings ) -- ===== Helper: scan files in folder (text and .mse) ===== fn scanFilesInFolder folderPath = ( local suspicious = #() local files = getFiles (folderPath + "\\*.ms*") if files.count == 0 then ( format "No .ms/.mcr/.mse files found in %\n" folderPath return suspicious ) for f in files do ( local isText = true local content = "" try ( if matchPattern f pattern:"*.mse" then ( local lines = readBinaryStrings f for l in lines do for p in patterns do -- сравниваем в нижнем регистре для устойчивости if findString (toLower l) (toLower p) != undefined then append suspicious #(f, p) isText = false ) else ( local fh = openFile f mode:"r" while not eof fh do content += readLine fh + "\n" close fh ) ) catch ( isText = false append suspicious #(f, "<binary or unreadable>") ) if isText then for p in patterns do if findString (toLower content) (toLower p) != undefined then append suspicious #(f, p) ) return suspicious ) -- ===== Helper: recursive scan of an object (uses global 'patterns') ===== fn scanObjectRecursively obj = ( local findings = #() try ( -- Все свойства объекта (без аварий при чтении) local propNames = #() try ( propNames = getPropNames obj ) catch() for p in propNames do ( try ( local val = getProperty obj p if classOf val == String then ( for pattern in patterns do if matchPattern val pattern pattern:"regex" then append findings #(obj.name, p, pattern)
