Как стать автором
Поиск
Написать публикацию
Обновить
1

Action Script *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга

Попросил 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)
Теги:
0
Комментарии2