MCPcopy Create free account
hub / github.com/SySS-Research/hallucinate / JavaAgentHandler

Class JavaAgentHandler

hallucinate/java.py:17–65  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15
16
17class JavaAgentHandler(socketserver.BaseRequestHandler):
18
19 def read_bytes(self, n):
20 r = b''
21 while len(r) < n:
22 r += self.request.recv(n - len(r))
23 return r
24
25 def read_string(self):
26 length, = struct.unpack(">H", self.read_bytes(2))
27 return self.request.recv(length).decode('utf-8')
28
29 def read_entry(self):
30 return self.read_string(), self.read_string()
31
32 def handle(self):
33 key = self.read_string()
34
35 if not compare_digest(key, self.server.key):
36 logging.warning("Client provided wrong key")
37 self.request.close()
38 return
39
40 while True:
41 r = self.read_bytes(4)
42 nentries, = struct.unpack('>I', r)
43 rdata = dict()
44 for i in range(nentries):
45 k, v = self.read_entry()
46 rdata[k] = v
47
48 # emulate conn entry, no nested array support
49 rdata['conn'] = {
50 'l': {'ip': rdata['localAddr'], 'port': int(rdata['localPort'])},
51 'r': {'ip': rdata['remoteAddr'], 'port': int(rdata['remotePort'])}
52 }
53 logging.debug('Received request from Java agent: %s', rdata)
54
55 def rhandle(data):
56 logging.debug('Sending response to Java agent: %s', data)
57 p = struct.pack('>I', len(data))
58 for k, v in data.items():
59 ke = str(k).encode('utf-8')
60 ve = str(v).encode('utf-8')
61 p += struct.pack('>H', len(ke)) + ke
62 p += struct.pack('>H', len(ve)) + ve
63 self.request.sendall(p)
64
65 self.server.handler(rdata, rhandle)
66
67
68class JavaAgentServer(socketserver.ThreadingMixIn, socketserver.TCPServer):

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected