[tor-commits] [ooni-probe/master] Half working mutator thing

art at torproject.org art at torproject.org
Wed Jul 11 13:56:42 UTC 2012


commit 614e7b51762fb99018ab0022b275969c00684b31
Author: Arturo Filastò <hellais at torproject.org>
Date:   Tue Jul 10 19:37:04 2012 +0200

    Half working mutator thing
---
 oonib/b0wser.py      |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++
 oonib/oonibackend.py |    4 ++
 2 files changed, 121 insertions(+), 0 deletions(-)

diff --git a/oonib/b0wser.py b/oonib/b0wser.py
new file mode 100644
index 0000000..072b4b9
--- /dev/null
+++ b/oonib/b0wser.py
@@ -0,0 +1,117 @@
+from twisted.internet import protocol
+
+class Mutator:
+    idx = 0
+    step = 0
+    state = 0
+    waiting = False
+    waiting_step = 0
+
+    def __init__(self, steps):
+        self.steps = steps
+
+    def next_mutation(self):
+        """
+        Increases by one the mutation state.
+
+        ex. (* is the mutation state, i.e. the byte to be mutated)
+        before [___*] [____]
+               step1   step2
+        after  [____] [*___]
+        """
+        current_idx = self.idx + 1
+        current_step = self.step
+        current_data = self.steps[c_step]['data']
+        data_to_receive = self.steps[c_step]]['recv']
+
+        if self.waiting and self.waiting_step == data_to_receive:
+            self.waiting = False
+            self.waiting_step = 0
+
+        elif self.waiting:
+            self.waiting_step += 1
+
+        elif current_idx > len(current_data):
+            self.step += 1
+            self.idx = 0
+            self.waiting = True
+
+    @classmethod
+    def mutate(data, idx):
+        """
+        Mutate the idx bytes by increasing it's value by one
+
+        @param data: the data to be mutated.
+
+        @param idx: what byte should be mutated.
+        """
+        ret = data[:idx-1]
+        ret += chr(ord(data[idx]) + 1)
+        ret += data[idx:]
+        return ret
+
+    def get_mutation(self):
+        """
+        returns the current packet to be sent to the wire.
+        If no mutation is necessary it will return the plain data.
+        """
+        self.next_mutation()
+        if self.state != self.step or self.waiting:
+            return self.steps[self.state]
+
+        data = self.steps[self.state]
+        return self.mutate(data, self.idx)
+
+    def get_data(self, i):
+        """
+        XXX remove this shit.
+        """
+        j = 0
+        pkt_size = len(self.steps[j]['data'])
+        while i > pkt_size:
+            j += 1
+            pkt_size += len(self.steps[j])
+        # I am not in a state to send mutations
+        if j != self.state:
+            return self.steps[j]['data']
+
+        rel_idx = i % (pkt_size - len(self.steps[j-1]))
+        data = self.steps[j]
+        data[rel_idx] = chr(ord(data[rel_idx]) + 1)
+        return data
+
+class B0wserProtocol(protocol.Protocol):
+    steps = [{'data': "STEP1", 'recv': 20},
+             {'data': "STEP2", 'recv': 20},
+             {'data': "STEP3", 'recv': 20}]
+
+    mutator = None
+    state = 0
+    received_data = 0
+
+    def next_state(self):
+        data = self.mutator.get_mutation()
+        self.transport.write(data)
+        self.mutator.state += 1
+        self.received_data = 0
+
+    def dataReceived(self, data):
+        if len(self.steps) <= self.state:
+            self.transport.loseConnection()
+            return
+        self.received_data += len(data)
+        if self.received_data >= self.steps[self.state]['recv']:
+            print self.received_data
+            self.next_state()
+
+class B0wserServer(protocol.ServerFactory):
+    protocol = B0wserProtocol
+    mutations = {}
+    def buildProtocol(self, addr):
+        p = self.protocol()
+        p.factory = self
+
+        if addr.host not in self.mutations:
+            self.mutations[addr.host] = Mutation(p.steps)
+        p.mutator = self.mutations[addr.host]
+        return p
diff --git a/oonib/oonibackend.py b/oonib/oonibackend.py
index fc5bbdb..4ae275e 100755
--- a/oonib/oonibackend.py
+++ b/oonib/oonibackend.py
@@ -18,6 +18,7 @@ from twisted.names import dns
 
 from oonib.httpbackend import HTTPBackend
 from oonib.dnsbackend import ProxyDNSServer
+from oonib.b0wser import B0wserServer
 
 # This tells twisted to set the
 server.version = "Apache"
@@ -32,3 +33,6 @@ internet.TCPServer(8002, TCPDNSServer).setServiceParent(serviceCollection)
 UDPFactory = dns.DNSDatagramProtocol(TCPDNSServer)
 internet.UDPServer(5354, UDPFactory).setServiceParent(serviceCollection)
 
+# Start the ooni backend thing
+b0wser = B0wserServer()
+internet.TCPServer(9666, b0wser).setServiceParent(serviceCollection)





More information about the tor-commits mailing list