Попросил 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)