/* * Java Payloads. * * Copyright (c) 2010, Michael 'mihi' Schierl * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package javapayload.handler.stager; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import javapayload.handler.stage.StageHandler; public abstract class ListeningStagerHandler extends StagerHandler { protected final void handle(StageHandler stageHandler, String[] parameters, PrintStream errorStream, Object extraArg) throws Exception { startListen(parameters); final Object socket = acceptSocket(); stopListen(); handleSocket(socket, stageHandler, parameters, errorStream); } protected final boolean needHandleBeforeStart() { return true; } private boolean multiRunning = true; private boolean multiListening = false; public void handleMulti(StageHandler stageHandler, final String[] parameters, final PrintStream errorStream) throws Exception { final PrintStream consoleOut = stageHandler.consoleOut; synchronized(this) { if (multiRunning) { startListen(parameters); multiListening = true; consoleOut.println("Listening started"); } } while (multiRunning) { final Object socket = acceptSocket(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final StageHandler realStageHandler = stageHandler.createClone(new PrintStream(baos, true)); new Thread(new Runnable() { public void run() { try { handleSocket(socket, realStageHandler, parameters, errorStream); synchronized(ListeningStagerHandler.this) { consoleOut.println("=== BEGIN INSTANCE ==="); consoleOut.write(baos.toByteArray()); consoleOut.println(); consoleOut.println("=== END INSTANCE ==="); } } catch (Exception ex) { synchronized(ListeningStagerHandler.this) { ex.printStackTrace(consoleOut); } } } }).start(); } synchronized(this) { if (multiListening) { stopListen(); multiListening = false; } consoleOut.println("Listening stopped"); } } public synchronized void stopMulti() throws Exception { multiRunning = false; if (multiListening) { stopListen(); multiListening = false; } } protected abstract void startListen(String[] parameters) throws Exception; protected abstract void stopListen() throws Exception; protected abstract Object acceptSocket() throws Exception; protected abstract void handleSocket(Object socket, StageHandler stageHandler, String[] parameters, PrintStream errorStream) throws Exception; }