Overview
Exernality is a upcoming Roblox executor with a focus on speed, stability, and security. It is designed to be a drop-in replacement for existing executors, with a familiar structure!
Complete Lua API reference for the Exernality executor
Complete Lua API reference for the Exernality
Exernality is a upcoming Roblox executor with a focus on speed, stability, and security. It is designed to be a drop-in replacement for existing executors, with a familiar structure!
Download the latest release and unzip anywhere. Run Exernality.exe, then join a Roblox game and hit Inject. Scripts can be run from the Editor
On first run a workspace folder is created at %LOCALAPPDATA%\Exernality. Scripts, logs, and files are stored here.
Join a game, run as admin, hit Inject, then Ctrl+Enter in the Editor.
local plr = game:GetService("Players").LocalPlayer print("hi from", plr.Name)Environments, GC, and thread identity.
Shared executor globals; values persist across script runs.
function getgenv(): tableRoblox's own globals, the ones game scripts see.
function getrenv(): tableReturns the environment table of the calling script. Alias: getmenv.
function getsenv(): tableReturns the Lua registry (index LUA_REGISTRYINDEX). Alias: getregistry.
function getreg(): tableReturns every collectable object currently tracked by the Luau GC. Pass true to include tables in the result.
function getgc(includeTables: boolean?): {any}Filters GC objects by type and attributes; returns one match or a list.
function filtergc(type: string, filter: table, first: boolean?): anyReturns the current thread's Roblox identity (0-8). Aliases: getthreadidentity, getthreadcontext.
function getidentity(): numberSets the current thread's Roblox identity. Aliases: setthreadidentity, setthreadcontext.
function setidentity(level: number)Executor name and version. Also: getexecutorname, getexecutorversion.
function identifyexecutor(): string, stringPlaces text onto the Windows clipboard. Aliases: toclipboard, setrbxclipboard.
function setclipboard(text: string)Sets Roblox's target frame rate cap. Aliases: setfps, SetFps.
function setfpscap(fps: number)Returns the current FPS cap. Aliases: getfps, GetFps.
function getfpscap(): numberRuns a script after teleport. Alias: queueonteleport. Clear with clearqueueonteleport.
function queue_on_teleport(source: string)Executor-side require that bypasses ModuleScript's normal require restrictions and works with asset IDs.
function require(module: ModuleScript | number): anyDrops this client's hold on Roblox's one-client-at-a-time lock, so the next Roblox you open starts instead of handing itself to this one. Returns true and how many handles it closed, or false and the reason. Aliases: multi_instance, closesingleton. The Multi instance setting does the same thing for every client Exernality attaches to; each client then listens on its own port from 6969 up, and the Clients panel picks the one your scripts run on.
function multiinstance(): boolean, number | stringCreate, clone, check, and hook functions.
Wraps f with a C identity, needed by anti-tamper stack walks.
function newcclosure(f: function): functionNew closure forwarding to f; guarantees an L-closure for debug APIs.
function newlclosure(f: function): functionTrue if f is a C closure. Alias: is_c_closure.
function iscclosure(f: function): booleanTrue if f is a Lua closure. Alias: is_l_closure.
function islclosure(f: function): booleanTrue if f was made by Exernality. Aliases: checkclosure, isourclosure.
function isexecutorclosure(f: function): booleanTrue if f was produced by newcclosure.
function isnewcclosure(f: function): booleanTrue when the caller is the executor, not a game script. Alias: check_caller.
function checkcaller(): booleanReturns a deep copy of a function whose identity differs from f. Modifications to one do not affect the other.
function clonefunction(f: function): functionRedirects target through hook and returns the original. Alias: replaceclosure.
function hookfunction(target: function, hook: function): functionUndoes a previous hookfunction on the target. Alias: restorefunc.
function restorefunction(hooked: function)True if f has an active hook.
function isfunctionhooked(f: function): booleanSwaps a closure's compiled prototype. More invasive than hookfunction.
function hookproto(target: function, replacement: function)Reverts a prior hookproto.
function restoreproto(target: function)Compiles Luau source into a callable function. Returns nil, errorMessage on syntax errors.
function loadstring(source: string, chunkname: string?): function?, string?Read, write, and lock metafields.
Returns the raw metatable of t, bypassing __metatable.
function getrawmetatable(t: any): table?Sets the metatable of t, ignoring readonly protection.
function setrawmetatable(t: any, mt: table)Hooks one metamethod (__index, __namecall, ...) and returns the original.
function hookmetamethod(t: any, event: string, hook: function): functionTrue if t is frozen.
function isreadonly(t: table): booleanLocks or unlocks a table against writes. Also available as make_readonly / make_writeable.
function setreadonly(t: table, readonly: boolean)Inside a __namecall hook, returns the name of the method currently being called.
function getnamecallmethod(): string?Inside a __namecall hook, redirects the call to a different method name before invocation.
function setnamecallmethod(name: string)True if the table is untouched since script start. Pair with setuntouched.
function isuntouched(value: any): booleanInspect and mutate constants, upvalues, and stacks.
Returns the constants table baked into f's prototype.
function debug.getconstants(f: function): {any}Returns a single constant by 1-based index.
function debug.getconstant(f: function, index: number): anyReplaces a constant in-place. Type of value must match the original.
function debug.setconstant(f: function, index: number, value: any)Returns the captured upvalues of f.
function debug.getupvalues(f: function): {any}Sets an upvalue by index.
function debug.setupvalue(f: function, index: number, value: any)Returns a nested prototype from f; all closures sharing it when active is true.
function debug.getproto(f: function, index: number, active: boolean?): function | {function}Returns every child prototype declared inside f.
function debug.getprotos(f: function): {function}Returns the value at a stack slot in the given call frame. Omit index for the whole slice.
function debug.getstack(level: number, index: number?): anyWrites a stack slot.
function debug.setstack(level: number, index: number, value: any)Metadata for a function or stack frame: source, line, name, params, nups.
function debug.getinfo(levelOrFunc: number | function): tableEquivalent to top-level getreg.
function debug.getregistry(): tableBypasses __metatable shrouding. Companion setmetatable writes it back.
function debug.getmetatable(value: any): table?Caches, scripts, bytecode, and hidden properties.
Returns every Instance in memory, including those unparented from the DataModel.
function getinstances(): {Instance}Returns only Instances whose Parent is currently nil.
function getnilinstances(): {Instance}Every LocalScript / ModuleScript currently loaded.
function getscripts(): {LuaSourceContainer}Only scripts that are actively executing.
function getrunningscripts(): {LuaSourceContainer}ModuleScripts whose result is cached by Roblox's require.
function getloadedmodules(): {ModuleScript}Returns the script associated with the current thread, or nil if there is no owning script.
function getcallingscript(): Instance?Returns the raw compiled bytecode of a script. Alias: dumpstring.
function getscriptbytecode(script: LuaSourceContainer): stringReturns a stable hash of a script's bytecode.
function getscripthash(script: LuaSourceContainer): stringCompiles source and returns the main closure without running it. Alias: getscriptfunction.
function getscriptclosure(script: LuaSourceContainer): functionReturns pseudocode for the compiled bytecode of a script.
function decompile(script: LuaSourceContainer): stringTrue if a property is currently marked scriptable.
function isscriptable(inst: Instance, property: string): booleanToggles scriptable-ness of a property. Returns the previous state.
function setscriptable(inst: Instance, property: string, scriptable: boolean): booleanReturns a distinct reference to the same underlying Instance, used to defeat identity comparisons.
function cloneref(inst: Instance): InstanceTrue if two references (including cloned ones) point to the same underlying Instance.
function compareinstances(a: Instance, b: Instance): booleanReturns a hidden UI container that game scripts cannot see. Parent your UIs here to protect them from cleanup.
function gethui(): InstanceConnect, inspect, and replicate signals.
Each returned Connection exposes Enable, Disable, Fire, and the underlying Function.
function getconnections(signal: RBXScriptSignal): {Connection}Invokes every listener attached to signal with the supplied arguments.
function firesignal(signal: RBXScriptSignal, ...)Simulates a Touch/TouchEnded event between two parts. state = 0 fires Touched, state = 1 fires TouchEnded.
function firetouchinterest(a: BasePart, b: BasePart, state: number)Fires the MouseClick event of a ClickDetector.
function fireclickdetector(cd: ClickDetector, distance: number?)Triggers a proximity prompt as if the player had held the interaction key.
function fireproximityprompt(pp: ProximityPrompt)Argument names and types of a signal. Companion: getsignalargumentsinfo.
function getsignalarguments(signal: RBXScriptSignal): {any}Returns the list of remote signals allowed to be replicated to server.
function getsignalwhitelist(): {string}Returns every function currently registered on RunService.RenderStepped.
function getrendersteppedlist(): {function}True if firesignal against this signal will replicate to the server.
function cansignalreplicate(signal: RBXScriptSignal): booleanFires signal and forces the invocation to replicate.
function replicatesignal(signal: RBXScriptSignal, ...)Sandboxed file and folder access.
Returns the contents of a file as a string.
function readfile(path: string): stringOverwrites path with data. Creates parent directories as needed.
function writefile(path: string, data: string)Appends data to the end of a file.
function appendfile(path: string, data: string)Returns the names of the entries in a folder.
function listfiles(path: string): {string}True if path refers to an existing file.
function isfile(path: string): booleanTrue if path refers to an existing folder.
function isfolder(path: string): booleanCreates a folder (and any missing parents).
function makefolder(path: string)Deletes a file.
function delfile(path: string)Recursively deletes a folder and everything inside.
function delfolder(path: string)Compiles a file into a callable function without running it. Returns nil, err on syntax errors.
function loadfile(path: string): function?, string?Reads and executes a file in-place.
function dofile(path: string)rbxasset:// URI for a workspace file, usable in image/sound/mesh properties.
function getcustomasset(path: string): stringHTTP requests and WebSocket connections.
HTTP client. Options: Url, Method, Body, Headers. Returns Success, StatusCode, Headers, Body. Alias: http_request.
function request(options: table): tableSimple GET that returns the response body. Also bound as the global game:HttpGet. Aliases: httpget, http_get.
function httpget(url: string): stringLoads Roblox assets from an asset ID URL. Bound as game:GetObjects. Aliases: getobjects, get_objects.
function getobjects(assetId: string): {Instance}Opens a WebSocket with Send, Close, OnMessage, and OnClose.
function WebSocket.connect(url: string): WebSocketClientKeyboard and mouse input synthesis.
True when the Roblox window has focus. Aliases: isgameactive, iswindowactive.
function isrbxactive(): booleanSimulates a left mouse-button click.
function mouse1click()Presses (but does not release) the left mouse button.
function mouse1press()Releases the left mouse button.
function mouse1release()Right-button equivalents of the mouse1* family.
function mouse2click()Moves the cursor to absolute screen coordinates.
function mousemoveabs(x: number, y: number)Moves the cursor by a delta.
function mousemoverel(dx: number, dy: number)Scrolls the wheel by delta ticks.
function mousescroll(delta: number)Presses a virtual-key code. Alias: keyclick.
function keypress(keyCode: number)Releases a virtual-key code.
function keyrelease(keyCode: number)Press-and-release convenience.
function keytap(keyCode: number)Shows a native Windows message box; returns the button ID pressed.
function messagebox(text: string, caption: string, flags: number?): numberEncryption, hashing, and encoding helpers.
Encrypts with AES or Blowfish modes. Returns base64 ciphertext and IV.
function crypt.encrypt(data: string, key: string, iv: string?, mode: string?): string, stringReverses crypt.encrypt.
function crypt.decrypt(data: string, key: string, iv: string, mode: string?): stringHashes with MD5, SHA1, SHA224, SHA256, SHA384, SHA512, or the SHA3_* variants.
function crypt.hash(data: string, algorithm: string): stringReturns an HMAC digest using the given hash algorithm.
function crypt.hmac(data: string, key: string, algorithm: string): stringReturns count cryptographically-secure random bytes, base64-encoded.
function crypt.generatebytes(count: number): stringReturns a 32-byte random key, base64-encoded, suitable for AES-256.
function crypt.generatekey(): stringCryptographically-secure integer in [min, max].
function crypt.random(min: number, max: number): numberBase64 encode/decode, also exposed as base64encode and base64decode globals.
function crypt.base64encode(data: string): stringLZ4 round-trip. Available at the top level and as crypt.lz4compress / crypt.lz4decompress.
function lz4compress(data: string): stringRoblox instance cache and comparisons.
Drops an Instance's cache handle; later lookups return a fresh userdata.
function cache.invalidate(inst: Instance)True if the Instance is currently cached.
function cache.iscached(inst: Instance): booleanReplaces one cache entry with another. Every Lua reference to inst now resolves to replacement.
function cache.replace(inst: Instance, replacement: Instance)Dedicated Windows console output.
Allocates a Windows console window for print output.
function rconsolecreate()Writes text to the rconsole. No newline is appended.
function rconsoleprint(text: string)Sets the console window's title.
function rconsolesettitle(title: string)Closes the console window.
function rconsoledestroy()ImGui-style overlay primitives.
Creates a drawing object: Line, Text, Image, Circle, Square, Quad, or Triangle.
function Drawing.new(type: string): DrawingObjectDestroys every existing drawing object.
function cleardrawcache()True if value is a Drawing object.
function isrenderobj(value: any): booleanReads a property by name. Equivalent to indexing the object directly.
function getrenderproperty(obj: DrawingObject, property: string): anyWrites a property.
function setrenderproperty(obj: DrawingObject, property: string, value: any)Messaging between parallel-Lua actors.
Compiles source and executes it inside the actor's isolated VM.
function run_on_actor(actor: Actor, source: string, ...)True if the current thread is running in an actor's parallel VM.
function isparallel(): booleanNamed message channels for passing data between actor VMs.
function create_comm_channel(): number, BindableEvent