O executivo de crívio do R A Obrox (RSEXEC) é uma interface da linha de comando que usa principalmente a API WearEDEVS para executar scripts no cliente Rōblox. Repositório irmã para scripts de clientes pessoais do ROBLOX.
Para executar meu programa, verifique se o Python está instalado e que você esteja usando o Windows.
pip install -r requisitos.txtpython src/main.py
Usei o JJSPLOIT por alguns anos e descobri que ter que lidar com as GUIs lá quando a maioria dos meus outros fluxos de trabalho vive em PowerShell não é ótima para a produtividade. Foi um aborrecimento para eu abrir uma nova janela de seletor de arquivo e modificar alguns valores iniciais apenas para obter um script que eu salvei para executar. Muitos cliques!
Para resolver esse problema, eu tive que iterar. Comecei com a adição de uma função global getrenv().exec
, que passa em um caminho de arquivo, em relação ao /workspace
e a alguns outros parâmetros. Então eu tive que modificar os scripts existentes para trabalhar com meu sistema de parameterização. Eu certifiquei -me de que os scripts também pudessem retornar caso eles precisassem de t. Isso transformou meu cubo de script rudimentar em uma biblioteca de funções extensíveis!
Eu ainda não tinha terminado! Escrevi um programa Python para conectar a DLL Wearedevs através do finj.exe
e conectado com tubos nomeados do conforto do meu terminal. A saída ainda estava impressa no console do desenvolvedor, que ainda exigia intervenção do mouse - então escrevi código de wrapper clunky que tubula a saída do módulo no console (e não usando o RconsolePrint). Desde então, melhorou drasticamente.
Os comandos mostrados não refletem o que estiver disponível nos ambientes Lua getrenv()
ou getfenv()
.
Os comandos consistem em duas partes principais: a cabeça e o corpo.
A cabeça é a substring que varia do primeiro personagem que não é do WhitaSpace ao primeiro espaço depois dele.
A cabeça geralmente aponta para um pseudônimo que é um arquivo no seguinte formato:
$ {Root_folder}/workspace/$ {base_name} .lua
O corpo é tudo depois dele.
Alguns comandos (como find
) dividem o corpo em parâmetros distintos usando um delimitador de espaço. Outros (como output
) tratam todo o corpo como um único argumento.
Os comandos são prefixados por qualquer ;
Ou :
como nenhum deles é usado para iniciar uma declaração em Lua (U).
> ;output 6+4 10
> ;output "string" string
> ;output workspace game.Workspace
A output
de prefixo pode ser substituída por o
.
É possível armazenar tuplas de vários valores na variável Lua _E.OUTPUT
em um script de espaço de trabalho (consulte 'Formatação de saída'). A saída gerada a partir de vários valores de retorno é separada por ;
. A função string.gsub()
em lua, por exemplo, sempre retorna uma tupla que consiste em (string, número) :
> ;output (string.gsub("abb", "b", "c")) acc; 2
/workspace
> ;chat "I'm exploiting and probably will catch someone's attention!" 6
Se houver /workspace/chat.lua
, ele será executado, com a tabela global _E.ARGS
inicializada como:
{"Estou explorando e provavelmente chamarei a atenção de alguém!", 6}
Alguns scripts retornam coisas.
> ;plr 'vis' game.Players.VisualPlugin
Como qualquer boa plataforma de execução de scripts, o RSEXEC deve poder executar scripts da Internet. O nome loadstring
é enganoso aqui porque, diferentemente da sua contraparte da Lua, ele também pega o código Lua de um URL fornecido. Observe que o URL não está envolvido em citações, pois não é analisado a partir de um objeto Lua.
> ;ls https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source
Isso funciona mais ou menos o mesmo que:
loadstring(game:HttpGet('https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source'))()
O prefixo ls
pode ser substituído por loadstring
.
Os blocos de código sem um prefixo de comando serão transmitidos no AS-IS para o avaliador.
> game.Players.LocalPlayer.Character.Humanoid.Health = 0
> ;snippet game.Players.LocalPlayer.Character.Humanoid.Health = 0
Seu personagem deve morrer de qualquer maneira.
Como alternativa, você pode usar snippet
de prefixo.
O snippet
de prefixo pode ser substituído por snip
ou s
Os trechos de várias linhas continuam aceitando a entrada até a primeira linha vazia. Útil para prototipagem ... eu acho?
> ;multiline game.Players.LocalPlayer.Character.Humanoid.Health = 0 > ;o 6 6
Essa é outra maneira de seu personagem morrer. Ele também imprime 6 para promover a distinção.
A multiline
prefixo pode ser substituída por ml
ou m
.
> ;del [[tree game.Workspace:GetDescendants()]]
De /workspace/tree.lua
, retorna uma lista de todos os objetos em seu espaço de trabalho.
Então, de /workspace/del.lua
, exclui tudo na lista.
Para produzir uma saída e a saída humana, alguns scripts da área de trabalho imprimem uma string personalizada quando chamados no nível superior. Esses scripts de Callee inicializam uma tabela opcional _E.OUTPUT
perto do final do corpo.
Muitas dessas saídas personalizadas usam códigos de cores ANSI para melhorar a legibilidade.
> ;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} ...
No entanto, esse comportamento não é aplicado quando feito a partir de uma chamada aninhada. O snippet seguinte imprimirá uma tabela Lua-leitura de máquina:
> ;output [[tree game.ReplicatedStorage]] { game.ReplicatedStorage.EmoteBar, game.ReplicatedStorage.EmoteBar.clientConfig, game.ReplicatedStorage.EmoteBar.emotes, game.ReplicatedStorage.EmoteBar.enums, ...
O RSEXEC executa o espião remoto imediatamente quando for injetado. Também são recebidos eventos enviados ao cliente Vía OnClientEvent, diferentemente de outras implementações avançadas de espião remoto. Não há GUIs lá para desordem a tela. No entanto, os controles remotos preenchem /workspace/_rspy.dat
por sessão. O RSEXEC oferece uma maneira de despejar toras de espionagem remota no console, como mostrado abaixo. A execução do dump
inicia o ponteiro do arquivo a partir do final da leitura anterior, por nome do arquivo:
> 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} ...
O resultado de /workspace/tree.lua
aqui está todo objeto no espaço de trabalho cujo nome dos pais é 'cabeça'.
A string:
[[function return a1.Parent.Name == 'Head']]
... é substituído por:
(function(a1, a2, ...) return a1.Parent.Name == 'Head' end)
A function
prefixo pode ser substituída por func
ou f
.
Os lambdas são úteis para escrever frases dinâmicas que aproveitam outros recursos do idioma rsexec. Eu pessoalmente uso muito para o 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} ...
Os lambdas funcionam de maneira semelhante ao prefixo f
, mas adiciona a palavra -chave return
antes do corpo da função.
A string:
[[lambda a1.Parent.Name == 'Head']]
... é substituído por:
(function(a1, a2, ...) return a1.Parent.Name == 'Head' end)
O prefixo lambda
pode ser substituído por l
.