mirror of
				https://github.com/maride/afl-transmit.git
				synced 2025-10-11 01:56:50 +00:00 
			
		
		
		
	Add compression between peers
This commit is contained in:
		
							parent
							
								
									ed6baf7753
								
							
						
					
					
						commit
						58b0820899
					
				| @ -3,6 +3,7 @@ package logistic | ||||
| import ( | ||||
| 	"archive/tar" | ||||
| 	"bytes" | ||||
| 	"compress/flate" | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| @ -11,7 +12,7 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| // Packs a whole fuzzer directory - at least queue/, fuzz_bitmap, fuzzer_stats | ||||
| func PackFuzzer(fuzzerName string, directory string) []byte { | ||||
| func PackFuzzer(fuzzerName string, directory string) ([]byte, error) { | ||||
| 	// Gather contents | ||||
| 	contentArray := [][]byte{ | ||||
| 		[]byte(fuzzerName), | ||||
| @ -20,21 +21,34 @@ func PackFuzzer(fuzzerName string, directory string) []byte { | ||||
| 		packQueueFiles(directory), | ||||
| 	} | ||||
| 
 | ||||
| 	// Prepare FLATE compression | ||||
| 	var flateBuffer bytes.Buffer | ||||
| 	flateWrite, flateErr := flate.NewWriter(&flateBuffer, flate.BestCompression) | ||||
| 	if flateErr != nil { | ||||
| 		return nil, fmt.Errorf("unable to prepare flate compressor: %s", flateErr) | ||||
| 	} | ||||
| 
 | ||||
| 	// Convert all parts to base64, and concat them to the packet | ||||
| 	var result []byte | ||||
| 	firstRun := true | ||||
| 	for _, a := range contentArray { | ||||
| 		b64Buf := make([]byte, base64.StdEncoding.EncodedLen(len(a))) | ||||
| 		base64.StdEncoding.Encode(b64Buf, a) | ||||
| 
 | ||||
| 		// Add newline char as separator | ||||
| 		result = append(result, '\n') | ||||
| 		// Add newline char as separator, avoiding it on the first run | ||||
| 		if firstRun { | ||||
| 			firstRun = false | ||||
| 		} else { | ||||
| 			flateWrite.Write([]byte("\n")) | ||||
| 		} | ||||
| 
 | ||||
| 		// Append base64 encoded content | ||||
| 		result = append(result, b64Buf...) | ||||
| 		flateWrite.Write(b64Buf) | ||||
| 	} | ||||
| 
 | ||||
| 	flateWrite.Close() | ||||
| 
 | ||||
| 	// Return result: a big byte array, representing concatted base64-encoded files | ||||
| 	return result | ||||
| 	return flateBuffer.Bytes(), nil | ||||
| } | ||||
| 
 | ||||
| // Reads a single file and returns it | ||||
|  | ||||
| @ -3,6 +3,7 @@ package logistic | ||||
| import ( | ||||
| 	"archive/tar" | ||||
| 	"bytes" | ||||
| 	"compress/flate" | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| @ -14,8 +15,13 @@ import ( | ||||
| 
 | ||||
| // Unpacks a raw string, creates files and stores them in the target directory. May return an error if one occurrs | ||||
| func UnpackInto(raw []byte, targetDir string) error { | ||||
| 	// Clean raw bytes: trim possibly leading and/or trailing newlines | ||||
| 	raw = bytes.Trim(raw, "\n") | ||||
| 	// Prepare FLATE decompressor | ||||
| 	var flateBuffer bytes.Buffer | ||||
| 	flateReader := flate.NewReader(&flateBuffer) | ||||
| 
 | ||||
| 	// Uncompress | ||||
| 	flateBuffer.Write(raw) | ||||
| 	raw, _ = ioutil.ReadAll(flateReader) | ||||
| 
 | ||||
| 	// Process raw bytes | ||||
| 	splitted := bytes.Split(raw, []byte("\n")) | ||||
|  | ||||
| @ -1,11 +1,11 @@ | ||||
| package net | ||||
| 
 | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"github.com/maride/afl-transmit/logistic" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net" | ||||
| 	"strings" | ||||
| @ -50,23 +50,20 @@ func handle(conn net.Conn, outputDirectory string) { | ||||
| 	// Make sure to close connection on return | ||||
| 	defer conn.Close() | ||||
| 
 | ||||
| 	// Loop until we either hit EOF or an error | ||||
| 	for { | ||||
| 		// Read raw content | ||||
| 		cont, contErr := bufio.NewReader(conn).ReadString('\x00') | ||||
| 	// Read raw content | ||||
| 	cont, contErr := ioutil.ReadAll(conn) // bufio.NewReader(conn).ReadString('\x00') | ||||
| 
 | ||||
| 		if contErr == io.EOF { | ||||
| 			// We received the whole content, time to process it | ||||
| 			unpackErr := logistic.UnpackInto([]byte(cont), outputDirectory) | ||||
| 			if unpackErr != nil { | ||||
| 				log.Printf("Encountered error processing packet from %s: %s", conn.RemoteAddr().String(), unpackErr) | ||||
| 			} | ||||
| 			return | ||||
| 		} else if contErr != nil { | ||||
| 			// We encountered an error on that connection | ||||
| 			log.Printf("Encountered error while reading from %s: %s", conn.RemoteAddr().String(), contErr) | ||||
| 			return | ||||
| 	if contErr == nil || contErr == io.EOF { | ||||
| 		// We received the whole content, time to process it | ||||
| 		unpackErr := logistic.UnpackInto([]byte(cont), outputDirectory) | ||||
| 		if unpackErr != nil { | ||||
| 			log.Printf("Encountered error processing packet from %s: %s", conn.RemoteAddr().String(), unpackErr) | ||||
| 		} | ||||
| 
 | ||||
| 		return | ||||
| 	} else { | ||||
| 		// We encountered an error on that connection | ||||
| 		log.Printf("Encountered error while reading from %s: %s", conn.RemoteAddr().String(), contErr) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -31,7 +31,11 @@ func WatchFuzzers(outputDirectory string) { | ||||
| 		for _, localFuzzDir := range localFuzzers { | ||||
| 			// Pack important parts of the fuzzer directory into a byte array | ||||
| 			fuzzerName := filepath.Base(localFuzzDir) | ||||
| 			packedFuzzer := logistic.PackFuzzer(fuzzerName, localFuzzDir) | ||||
| 			packedFuzzer, packerErr := logistic.PackFuzzer(fuzzerName, localFuzzDir) | ||||
| 			if packerErr != nil { | ||||
| 				log.Printf("Failed to pack fuzzer: %s", packerErr) | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			// and send it to our peers | ||||
| 			net.SendToPeers(packedFuzzer) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user