I’m trying to make a java RAT but atm I only have screen displaying. When I run it it displays the screen on the JFrame fine, but it keeps dragging the same image a little lower with each draw like this:

Client:
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.io.IOException;
import java.net.Socket;
import java.util.zip.GZIPOutputStream;
import javax.imageio.ImageIO;
public class Client {
public static void main(String[] args) {
try {
Robot robot = new Robot();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Rectangle screen = new Rectangle((int) toolkit.getScreenSize().getWidth(), (int) toolkit.getScreenSize().getHeight());
Socket socket = new Socket("127.0.0.1", 25565);
GZIPOutputStream out = new GZIPOutputStream(socket.getOutputStream());
while(socket.isConnected()) {
ImageIO.write(robot.createScreenCapture(screen), "png", out);
}
out.close();
} catch (AWTException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server:
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.zip.GZIPInputStream;
import javax.imageio.ImageIO;
public class Server {
public static void main(String[] args) {
try {
ServerFrame frame = new ServerFrame();
ServerSocket serverSocket = new ServerSocket(25565);
Socket socket = serverSocket.accept();
GZIPInputStream in = new GZIPInputStream(socket.getInputStream());
BufferedImage image = null;
while(socket.isConnected()) {
image = ImageIO.read(in);
if(image != null) {
frame.setBufferedImage(image);
}
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerFrame:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
public class ServerFrame extends JFrame {
private BufferedImage image;
public ServerFrame() {
setTitle("RAT");
setSize(1920, 1080);
setVisible(true);
image = null;
}
public void setBufferedImage(BufferedImage image) {
this.image = image;
this.repaint();
}
public void paint(Graphics g) {
if(image != null) {
g.drawImage(image, 0, 0, this);
}
}
}
For some reason the drawing of the screen capture in the
g.drawImage(image, 0, 0, this);line, when drawing in theJFrame, begins to slide up and left when you view the frame maximized.Try extending
ServerFramefromJPaneland adding it to aJFrame, that way you get an anchor in the top-left corner. You can add aJScrollPanein there too, so that you can navigate the whole panel with the screen capture.Here’s the code I used to replicate your situation, it captures the screen whenever a key is pressed. I renamed the
ServerFrameclass toScreenCapture.Hope it helps.
EDIT
Here’s a piece of code to wrap the image in a
JScollPane.