R Oblox S Cript Executor (RSEXEC) es una interfaz de línea de comandos que utiliza principalmente la API de Deseedevs para ejecutar scripts en el cliente Rōblox. Repositorio de hermana de scripts personales de clientes de Roblox.
Para ejecutar mi programa, asegúrese de que Python esté instalado y que esté utilizando Windows.
PIP Instale -R requisitos.txtpython src/main.py
Usé JJSPLOIT durante unos años y descubrí que tener que lidiar con las GUI allí cuando la mayoría de mis otros flujos de trabajo viven en PowerShell no es excelente para la productividad. Fue una molestia para mí abrir una nueva ventana de selector de archivos y modificar algunos valores iniciales solo para obtener un script que guarde para ejecutar. ¡Demasiados clics!
Para resolver ese problema, tuve que iterar. Comencé con la adición de una función global getrenv().exec
que pasa en una ruta de archivo, relativa a /workspace
y algunos otros parámetros. Luego tuve que modificar los scripts existentes para trabajar con mi sistema de parametrización. Me aseguré de que los scripts también pudieran regresar en caso de que necesiten t. ¡Esto transformó mi centro de script rudimentario en una biblioteca de funciones extensibles!
¡No había terminado todavía! Escribí un programa de Python para enganchar el Wearedevs Dll a través de finj.exe
y conectado con tuberías con nombre de la comodidad de mi terminal. La salida aún se imprimió en la consola del desarrollador, que aún requería una intervención del mouse, por lo que escribí un código de envoltura torpe que tuve la salida del módulo en la consola (y no usando rConsolePrint). Desde entonces ha mejorado drásticamente.
Los comandos que se muestran no reflejan lo que esté disponible en los entornos lua getrenv()
u getfenv()
.
Los comandos consisten en dos partes principales: la cabeza y el cuerpo.
La cabeza es la subcadena que va desde el primer personaje no whitpace hasta el primer espacio después de él.
La cabeza a menudo apunta a un alias que es un archivo en el siguiente formato:
$ {Root_folder}/workspace/$ {base_name} .lua
El cuerpo lo es todo después.
Algunos comandos (como find
) dividen el cuerpo aún más en parámetros distintos utilizando un delimitador de espacio. Otros (como output
) tratan todo el cuerpo como un solo argumento.
Los comandos están prefijados por cualquiera de los dos ;
O :
como ninguno de los dos se usa para comenzar una declaración en Lua (U).
> ;output 6+4 10
> ;output "string" string
> ;output workspace game.Workspace
La output
de prefijo se puede sustituir por o
.
Es posible almacenar tuplas de valores múltiples en la variable lua _E.OUTPUT
en un script de espacio de trabajo (consulte 'Formateo de salida'). La salida generada a partir de valores de retorno múltiples se separa por ;
. La función string.gsub()
en LUA, por ejemplo, siempre devuelve una tupla que consiste en (String, número) :
> ;output (string.gsub("abb", "b", "c")) acc; 2
/workspace
> ;chat "I'm exploiting and probably will catch someone's attention!" 6
If /workspace/chat.lua
existe, se ejecutará, con la tabla global _E.ARGS
inicializada como:
{"¡Estoy explotando y probablemente captaré la atención de alguien!", 6}
Algunos guiones devuelven cosas.
> ;plr 'vis' game.Players.VisualPlugin
Como cualquier buena plataforma de ejecución de script, RSEXEC debería poder ejecutar scripts desde Internet. El nombre loadstring
es engañoso aquí porque, a diferencia de su contraparte de Lua, también toma el código Lua de una URL proporcionada. Tenga en cuenta que la URL no está envuelta en citas, ya que no se analiza de un objeto lua.
> ;ls https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source
Esto funciona más o menos igual que:
loadstring(game:HttpGet('https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source'))()
El prefijo ls
se puede sustituir por loadstring
.
Los bloques de código sin un prefijo de comando se pasarán en AS-IS al evaluador.
> game.Players.LocalPlayer.Character.Humanoid.Health = 0
> ;snippet game.Players.LocalPlayer.Character.Humanoid.Health = 0
Tu personaje debería morir de cualquier manera.
Alternativamente, puede usar snippet
de prefijo.
El snippet
de prefijo se puede sustituir por snip
o s
Los fragmentos de varias líneas siguen aceptando la entrada hasta la primera línea vacía. Útil para la creación de prototipos ... ¿Supongo?
> ;multiline game.Players.LocalPlayer.Character.Humanoid.Health = 0 > ;o 6 6
Esa es otra forma en que tu personaje puede morir. También imprime 6 para promover la distinguabilidad.
El prefijo multiline
se puede sustituir por ml
o m
.
> ;del [[tree game.Workspace:GetDescendants()]]
From /workspace/tree.lua
, devuelve una lista de todos los objetos en su espacio de trabajo.
Luego, de /workspace/del.lua
, elimina todo en la lista.
Para producir una salida deseable humano, algunos scripts de espacio de trabajo imprimen una cadena personalizada cuando se les llama en el nivel superior. Estos scripts de Callee inicializan una tabla opcional _E.OUTPUT
cerca del final del cuerpo.
Muchos de esos resultados personalizados utilizan códigos de color ANSI para mejorar la legibilidad.
> ;tree game.ReplicatedStorage [02] game.ReplicatedStorage.EmoteBar {ModuleScript} [03] game.ReplicatedStorage.EmoteBar.clientConfig {ModuleScript} [03] game.ReplicatedStorage.EmoteBar.emotes {ModuleScript} [03] game.ReplicatedStorage.EmoteBar.enums {ModuleScript} ...
Sin embargo, este comportamiento no se aplica cuando se realiza a partir de una llamada anidada. El siguiente fragmento imprimirá una tabla LUA de lectura de máquina:
> ;output [[tree game.ReplicatedStorage]] { game.ReplicatedStorage.EmoteBar, game.ReplicatedStorage.EmoteBar.clientConfig, game.ReplicatedStorage.EmoteBar.emotes, game.ReplicatedStorage.EmoteBar.enums, ...
RSEXEC ejecuta SPY remoto inmediatamente una vez que se inyecta. También se reciben eventos enviados al cliente Vía OnClientEvent, a diferencia de otras implementaciones avanzadas de SPY remoto. No hay GUI para desordenar la pantalla. Sin embargo, los controles remotos se llenan en /workspace/_rspy.dat
por sesión. RSEXEC ofrece una forma de volcar registros de espía remotos a la consola, como se muestra a continuación. La ejecución dump
inicia el puntero del archivo desde el final de la lectura anterior, por nombre del archivo:
> dump rspy
> ;tree game.workspace [[function return a1.Parent.Name == 'Head']] [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.Head {WrapTarget} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.NeckRigAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.FaceFrontAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.HatAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.HairAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.FaceCenterAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.Neck {Motor6D} ...
El resultado de /workspace/tree.lua
aquí es todos los objetos en el espacio de trabajo cuyo nombre de los padres es 'cabeza'.
La cadena:
[[function return a1.Parent.Name == 'Head']]
... se sustituye con:
(function(a1, a2, ...) return a1.Parent.Name == 'Head' end)
La function
de prefijo se puede sustituir por func
o f
.
Los lambdas son útiles para escribir frases dinámicas que aprovechan otras características del lenguaje RSEXEC. Personalmente lo uso mucho para el comando tree
.
> ;tree game.workspace [[lambda a1.Parent.Name == 'Head']] [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.Head {WrapTarget} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.NeckRigAttachment {Attachment} [06] game.Workspace.InteractiveModels.AvatarEditorModel.NpcModel.Head.FaceFrontAttachment {Attachment} ...
Los lambdas funcionan de manera similar al prefijo f
, pero agrega la palabra clave return
antes del cuerpo de funciones.
La cadena:
[[lambda a1.Parent.Name == 'Head']]
... se reemplaza con:
(function(a1, a2, ...) return a1.Parent.Name == 'Head' end)
El prefijo lambda
puede ser sustituido por l
.