func (p *Proxy) pipe(src, dst *net.TCPConn) { //data direction var f, h string isFromDebugger := src == p.Lconn if isFromDebugger { f = "\nDebugger >>> IDE\n================" } else { f = "\nIDE >>> Debugger\n================" } h = "%s" //directional copy (64k buffer) buff := make([]byte, 0xffff) for { n, err := src.Read(buff) if err != nil { p.err("Read failed '%s'\n", err) return } b := buff[:n] p.log(h, f) if p.Config.VeryVerbose { if isFromDebugger { p.log("Raw protocol:\n%s\n", logger.Colorize(fmt.Sprintf(h, b), "blue")) } else { p.log("Raw protocol:\n%s\n", logger.Colorize(fmt.Sprintf(h, logger.FormatTextProtocol(b)), "blue")) } } //extract command name if isFromDebugger { b = p.PathMapper.ApplyMappingToXML(b) } else { b = p.PathMapper.ApplyMappingToTextProtocol(b) } //show output if p.Config.VeryVerbose { if isFromDebugger { p.log("Processed protocol:\n%s\n", logger.Colorize(fmt.Sprintf(h, b), "blue")) } else { p.log("Processed protocol:\n%s\n", logger.Colorize(fmt.Sprintf(h, logger.FormatTextProtocol(b)), "blue")) } } else { p.log(h, "") } //write out result n, err = dst.Write(b) if err != nil { p.err("Write failed '%s'\n", err) return } if isFromDebugger { p.sentBytes += uint64(n) } else { p.receivedBytes += uint64(n) } } }
func (p *PathMapper) doXmlPathMapping(b []byte) []byte { var processedMapping = map[string]string{} r := regexp.MustCompile(`filename=["]?file://(\S+)/Data/Temporary/[^/]*/Cache/Code/Flow_Object_Classes/([^"]*)\.php`) for _, match := range r.FindAllStringSubmatch(string(b), -1) { path := match[1] + "/Data/Temporary/" + p.Config.Context + "/Cache/Code/Flow_Object_Classes/" + match[2] + ".php" if _, ok := processedMapping[path]; ok == false { if originalPath, exist := mapping[path]; exist { if p.Config.VeryVerbose { logger.Info("Umpa Lumpa can help you, he know the mapping\n%s\n%s\n", logger.Colorize(">>> "+fmt.Sprintf(h, path), "yellow"), logger.Colorize(">>> "+fmt.Sprintf(h, p.getRealFilename(originalPath)), "green")) } processedMapping[path] = originalPath } else { originalPath = p.readOriginalPathFromCache(path) processedMapping[path] = originalPath } } } for path, originalPath := range processedMapping { path = p.getRealFilename(path) originalPath = p.getRealFilename(originalPath) b = bytes.Replace(b, []byte(path), []byte(originalPath), -1) } return b }
func (p *PathMapper) readOriginalPathFromCache(path string) string { dat, err := ioutil.ReadFile(path) errorhandler.PanicHandling(err) r := regexp.MustCompile(`(?m)^# PathAndFilename: (.*)$`) match := r.FindStringSubmatch(string(dat)) //todo check if the match contain something originalPath := match[1] if p.Config.VeryVerbose { logger.Info("Umpa Lumpa need to work harder, need to reverse this one\n>>> %s\n>>> %s\n", logger.Colorize(fmt.Sprintf(h, path), "yellow"), logger.Colorize(fmt.Sprintf(h, originalPath), "green")) } p.registerPathMapping(path, originalPath) return originalPath }