sent via API : torIRC9050.py

[chan] general
Dec 11 12:55 [raw]

#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- ''' ### TOR IRC ### Fully anonymous text chat. Launch it using your python language interpreter in a bash shell / Konsole. ### TorTextChat (TTC) ### release home site https://gist.github.com/torifier/f1a7c1ac7b6b003cd9e1c187df2c5347 TorTextChat version 1.990 find chat partners, see also : https://beamstat.com/chan/general rendez-vous site beamstat.com : http://bm6hsivrmdnxmw2f.onion.to/chan/torirc-rendezvous referral, see also stem : https://stem.torproject.org/tutorials/double_double_toil_and_trouble.html UBF = Ultimate BM Forum : bitmessage.mybb.im UBF release thread : http://bitmessage.mybb.im/viewtopic.php?id=21 original Project homepage : https://github.com/froozen/torirc new Project homepage : https://github.com/torifier wiki : https://github.com/torifier/torirc/wiki project alias name : TTC = TorTextChat don't forget: set executable bit ! use python2 not python3 use correct port numbers above 1030 ! have socks.py from sourceforge "socksipy" in the same subdirectory as torIRC ! works with tor Tor 0.2.9.12 , works with TBB in --connect mode (port 9150, not 9050) but --server mode difficult to set up hidden service served by TBB The project simply consists of this very file - a single python script. No additional file is needed from github.com/froozen/torirc to run torIRC . Very handy and kewl ! TorIRC is also published on Bitmessage, chan "general" as a torIRC.tar archive file to avoid indentation problems after text-copy-paste. Right-click, "save BM as file" named "torIRC.tar" and untar the .py scriptfile. Else, save this whole text as a file named " torIRC.py " --- it is a python v2.7 executable script Actually, 'torIRC' is a bit of a misnomer (taken over the original project name) since no IRC protocol is involved at all. torIRC uses very simple raw text exchange without any protocol as such on the python level. It works with both python2.7 and pypy. Maybe this project will later be renamed 'TTC' = TorTextChat . With TOR running, run torIRC as ./torIRC.py --server MY-CHAT --- this will start a chat server, now you need clients to connect to it The server will tell you how to connect , such as : [I] Adding hidden service... hit CTRL-C to stop your chat server [C] Hostname is savjd7h4riras2aq.onion [I] Server Active [I] Connect with the command ./torirc.py --connect=savjd7h4riras2aq.onion #################### ./torirc.py --connect will run the client mode, so you can actually chat #################### ./torirc.py --server will run the server mode, to which the clients must connect. CTRL-C will stop server. In the Client window, you'll see sth. like: ~$./torirc.py -c x6nz4zuolgq5hhkr.onion Trying to connect to x6nz4zuolgq5hhkr.onion:11009 clientConnection: Connected to x6nz4zuolgq5hhkr.onion Now you can start to text chat ! In the client window, type /help for a documentation help text. It takes ca. one minute, then you have a chat server going ! So kewl ! No need to edit /etc/tor/torrc - except sometimes. Make sure the port numbers match up between this file (user var section) and torrc . Test TOR-IRC by opening 3 Konsole-windows, then run 1 server and also run 2 clients. Then you can chat with yourself in the 2 client windows. Expect 2-5 seconds of delay for every chat line. STEM is located at https://stem.torproject.org Full auto mode with STEM library, install STEM and all other prerequisites beforehand with your package manager. Run run_tests.py -a inside STEM lib dir from downloaded stem-master.zip to see if anything is reported missing , e.g. : socksiPy https://pypi.python.org/pypi/SocksiPy ### stem needs: mock pyflakes pep8 pycrypto tox don't forget stem itself ! TO DO: use re-usable onions like in the mini Tor-WebServer at https://gist.github.com/anonymous/a4b798b1a31a2a0d8caaf4770387b540 ### to reduce the torIRC project into this single one .py-file, the original README file is attached below: ### no additional files needed, tor-IRC is now an "all-in-one-file project" :-) TorIRC Anonymous IRC-like multiuser chat using TOR hidden services, with emphasis in network-analysis protection. This is a simple client/server chat using TOR hidden services and the python Stem controller library, implemented in a single python file. License is GNU-GPL Usage: torirc.py [options] Options: -h, --help show this help message and exit -c CONNECT, --connect=some-Server Acts as client, connect to server -s, --server Acts as server Example use: This is a console-only application. You need a recent version of TOR configured and in your path. Also the time of the computer needs to be correct or else TOR won't connect. In the Server: ~$ sudo -u debian-tor ./torirc.py -s #EXAMPLESRV [I] Connecting to TOR via Stem [I] Tor relay is alive. 369347 bytes read, 317787 bytes written. [C] Tor Version: 0.2.3.22-rc (git-4a0c70a817797420) [C] Socks port is: 9050 [I] Adding hidden service... [C] Hostname is x6nz4zuolgq5hhkr.onion [I] Server Active [I] Connect with the command "./torirc.py --connect=x6nz4zuolgq5hhkr.onion" In the Client: ~$./torirc.py -c x6nz4zuolgq5hhkr.onion Trying to connect to x6nz4zuolgq5hhkr.onion:11009 clientConnection: Connected to x6nz4zuolgq5hhkr.onion You will be assigned a randomly generated nick. You need to set your nick with '/nick' and you are good to go. If you want multiple chatrooms, start multiple servers, each one will auto-generate their own hidden-service url. Objectives Anonymous/Encrypted chat resistant to: Network analysis techniques Exploits Crypto attacks Trust minimization To reach those objectives the design of torirc follows: Simplicity: Small means less bugs and easier to audit Interpreted language: Avoid most memory corruption bugs Minimize library use: Again, less code susceptible to bugs Entropy maximization: When possible, random delays and useless data is transmitted. Discussion of choices Python: I selected python because it's what I know, and the interpreter is relatively small. Second choice would have been Java, but the JRE is too big and cumbersome. Also Python usually comes installed in most Linux distros. Also TOR has Stem, a very nice python-controller lib. TOR: big ugly chunk of C code that I do not trust entirely, but at this time is the only software that provides the functionality that I need, that is, hidden services and onion routing. Also, the current version of torirc doesn't have his own cryptography routines and uses TOR for it, but this may change in the future. Alternatives Here are alternative software and why I do not like it: IRC over tor: This is the best alternative, but only if you don't use any public server. Anyway this is vulnerable to exploits as IRC servers and clients tend to be huge pieces of C code. Also Network analysis is trivial with this protocol. MSN/Gtalk/Pidgin: Horrible choices, huge codebases, hundreds of libraries riddled with bugs, vulnerable to exploits, central server sees all your (often plaintext) messages, etc. Some plugins like OTR fix some shortcomings, but network analysis is also trivial. Silc: They wrote their own crypto, that's a big mistake. Also, it's written in C. I do believe they also don't protect against network analysis. torchat: Nice alternative but only P2P, latest versions started to creep with unsafe functionality like emoticons, etc. Network analysis protections This still is experimental software so no strong network-analysis-proof must be assumed. At this moment: Thanks to TOR, nobody, the server or the clients, known the IP address of nobody else. However, the server knows when a client is connected. The client periodically sends random data at random intervals. Every message is padded to minimum_message_len (currently 256 bytes) The server doesn't accurately report the number of clients in the chatroom, it only erases a nick approximately a day after it disconnects (this delay is also random) Network analysis is a hard problem and there are hundreds of side-channels that can be used to determine if a user is connected or not. This information can be the difference between life and death for some people, so it's a useful problem to tackle IMHO. Stem Latest tor-irc version uses the Stem python library to connect and control TOR, and now it makes uses of the system TOR daemon instead of spawning it's own TOR process. This is more clean but it requires you to install the Stem library and configure the TOR control port. If you do not want to do this, the torirc-nostem.py script doesn't uses Stem, but it's bigger and uglier. still TO DO: Authentication # to restrict access to the tor process Network-timing analysis graph errors TODO [E] Ephemeral hidden services were added in tor version 0.2.7.1-alpha [notice] debian jessie : Tor v0.2.5.12 (git-e7d9695a6fd06d08) running on Linux with Libevent 2.0.21-stable, OpenSSL 1.0.1t https://packages.debian.org/jessie-backports/amd64/tor/download has the needed 0.2.8 with ephemerals :-) ### python source part below fixed June 19th, 2016 by some BitMessage person Copyright (C) 2012-2013, Alfredo Ortega <alfred@groundworkstech.com> All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or google it. licence see: https://github.com/alfred-gw/torirc/blob/master/COPYING ''' __author__="version of alfred from " __date__ ="$Jul 30, 2013$" import curses from threading import Thread from optparse import OptionParser import time,os,subprocess import socket,select,random,sys import tempfile ## ---------- Start of user-configurable variables ---------------- minimum_message_len=256 # Network-related variables tor_server='127.0.0.1' # Used if can't load it from configuration tor_server_control_port = 9051 # 9051 TBB / TOR ControlPort 9051 tor_server_socks_port = 9050 # 9050 9150 TBB SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. #tor_server_socks_port = 9150 # 9150 with TBB client mode is working but not server mode ######################################################################################################## adjust this if you want hidden_service_interface='127.0.0.1' hidden_service_port=11009 # 1109 is original port no. #11801 # # #HiddenServicePort 11801 127.0.0.1:11802 # if you change 11009 , you must tell your clients to change to your new portnumber number too! do not go below 1030 # in torrc: HiddenServiceDir /var/lib/tor/hidden_service/ # 11801 remote ....: ## Time "noise". Increase this value in dire situations clientRandomWait=1 # Random wait before sending messages clientRandomNoise=10 # Random wait before sending the "noise message" to the server serverRandomWait=1 # Random wait before sending messages ## Gui buddywidth=20 ## ---------- End of user-configurable variables ----------------- # lists for the gui chantext=[] roster=[] ## Tor stem glue class class torStem(): def connect(self,addr='127.0.0.1',cport=9051): print "[I] Connecting to TOR via Stem library" # Load Stem lib try: from stem.control import Controller except: print "[E] Cannot load stem module." print "[E] Try installing python-stem with the package manager of your distro ('pacman' or whatever)" exit(0) # Connect to TOR self.controller = Controller.from_port(address=addr,port=cport) self.controller.authenticate() # provide the password here if you set one bytes_read = self.controller.get_info("traffic/read") bytes_written = self.controller.get_info("traffic/written") print "[I] Tor relay is alive. %s bytes read, %s bytes written." % (bytes_read, bytes_written) print "[C] Tor Version: %s" % str(self.controller.get_version()) # Get socks port try: self.SocksPort=self.controller.get_conf("SocksPort") if self.SocksPort==None: self.SocksPort=9050 else: self.SocksPort=int(self.SocksPort) print "[C] Socks port is: %d" % self.SocksPort except: print "[E] Failed to get Socks port, trying 127.0.0.1:9050..." self.SocksPort=9050 pass # Add hidden service ----------------------------------------------- error fixed now in 2016 print "[I] Adding hidden service. Hit CTRL-C to stop server afterwards. Please wait ca. one minute until hidden service is ready." self.hostname = self.controller.create_ephemeral_hidden_service({hidden_service_port: '%s:%d' % (hidden_service_interface, hidden_service_port)}, await_publication = True).service_id + '.onion' print "[C] Hostname is %s" % self.hostname def disconnect(self): # Remove hidden service print "Removing hidden service and shutting down torIRC." self.controller.remove_ephemeral_hidden_service(self.hostname.replace('.onion', '')) # stuff from 2013 not working any longer : #newHiddenServiceDir=tempfile.mkdtemp() #self.origConfmap = self.controller.get_conf_map("HiddenServiceOptions") #self.controller.set_options([ #('HiddenServiceDir' ,self.origConfmap["HiddenServiceDir"]), #('HiddenServicePort',self.origConfmap["HiddenServicePort"]), #('HiddenServiceDir',newHiddenServiceDir), #('HiddenServicePort',"%d %s:%d" % (hidden_service_port,hidden_service_interface,hidden_service_port)) #]) #self.hostname=open("%s/hostname" % newHiddenServiceDir,"rb").read().strip() #def disconnect(self): ## Remove hidden service #print "Removing hidden service..." #self.controller.set_options([ #('HiddenServiceDir',self.origConfmap["HiddenServiceDir"]), #('HiddenServicePort',self.origConfmap["HiddenServicePort"]) #]) ## Log Mode (Server logs to stdout, client do not) STDoutLog=False # Add padding to a message up to minimum_message_len def addpadding(message): if len(message)<minimum_message_len: message+=chr(0) for i in range(minimum_message_len-len(message)): message+=chr(random.randint(ord('a'),ord('z'))) return message ## Return sanitized version of input string def sanitize(string): out="" for c in string: if (ord(c)==0): break # char(0) marks start of padding if (ord(c)>=0x20) and (ord(c)<0x80): out+=c return out ## Log function ## Logs to STDOut or to the chantext channel list def log(text): if (STDOutLog): print text else: maxlen=width-buddywidth-1 while (True): if (len(text[:maxlen])>0): chantext.append(text[:maxlen]) text=text[maxlen:] if text=='': break redraw(stdscr) stdscr.refresh() ### Server class # Contains the server socket listener/writer class Server(): # Server roster dictionary: nick->timestamp serverRoster={} ## List of message queues to send to clients servermsgs=[] ## channel name channelname="" ## Eliminate all nicks more than a day old def serverRosterCleanThread(self): while True: time.sleep(10) current=time.time() waittime = random.randint(01*60*01,01*60*02) # 1-2 min 10 hours to 1.5 days 60*60*10, 10hrs 1.5d 60*60*36 for b in self.serverRoster: if current-self.serverRoster[b]>waittime: # Idle for more than the time limit self.serverRoster.pop(b) # eliminate nick waittime = random.randint(01*60*10,01*60*15) # 60*60*10,60*60*36 ## Thread attending a single client def serverThread(self,conn,addr,msg,nick): log("(ServerThread): Received connection - a buddy connected !") conn.setblocking(0) randomwait=random.randint(1,serverRandomWait) while (True): try: time.sleep(1) ready = select.select([conn], [], [], 1.0) if ready[0]: data=sanitize(conn.recv(minimum_message_len)) if len(data)==0: continue message="%s: %s" % (nick,data) # Received PING, send PONG if data.startswith("/PING"): message="" msg.append(data) continue # Change nick. Note that we do not add to roster before this operation if data.startswith("/nick "): newnick=data[6:].strip() if newnick.startswith("--"):continue log("Nick change: %s->%s" % (nick,newnick)) nick=newnick self.serverRoster[newnick]=time.time() # save/refresh timestamp message="Nick changed to %s" % newnick msg.append(message) continue # Return roster if data.startswith("/roster"): message = "--roster" message+=" %s" % self.channelname totalbuddies=len(self.servermsgs) for r in self.serverRoster: message+=" %s" % r totalbuddies-=1 message+=" --anonymous:%d" % totalbuddies msg.append(message) continue if data.startswith("/serverhelp"): msg.append("These are the commands which are supported:") msg.append(" /serverhelp : Send this help text") msg.append(" /roster : Send the list of connected buddies") msg.append(" /nick <my-new-name> : Changes your nickname") continue # refresh timestamp self.serverRoster[nick]=time.time() # Send 'message' to all queues for m in self.servermsgs: m.append(message) # We need to send a message if len(msg)>0: randomwait-=1 # Wait some random time to add noise if randomwait==0: m = addpadding(msg.pop(0)) conn.sendall(m) randomwait=random.randint(1,serverRandomWait) # Random wait before sending noise to the client if random.randint(0,clientRandomNoise)==0: ping="/PING " for i in range(120): ping+="%02X" % random.randint(ord('a'),ord('z')) msg.append(ping) except: self.servermsgs.remove(msg) conn.close() print "exiting: msgs %d" % len(self.servermsgs) raise ## Server main thread def serverMain(self,channel_name): global STDOutLog STDOutLog=True self.channelname=channel_name # Connects to TOR and create hidden service self.ts=torStem() try: self.ts.connect(tor_server,tor_server_control_port) except Exception as e: log("[E] %s" % e) log("[E] Check if the control port is activated in /etc/tor/torrc") log("[E] Try to run as the same user as tor, i.e. sudo -u debian-tor ./torirc.py -s MY-CHAT (maybe useful or not) ") exit(0) ## advice is not useful in Arch Linux with user "tor" # Start server socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((hidden_service_interface,hidden_service_port)) log('[I] chat Server now Active') log('[I] Connect in order to chat typing the command "%s --connect=%s"' % (sys.argv[0],self.ts.hostname)) s.listen(5) # Create server roster cleanup thread t = Thread(target=self.serverRosterCleanThread, args=()) t.daemon = True t.start() while True: try: conn,addr = s.accept() cmsg=[] nick="anon_%d" % random.randint(0,10000) cmsg.append("Welcome %s, this is %s" % (nick,self.channelname)) self.servermsgs.append(cmsg) t = Thread(target=self.serverThread, args=(conn,addr,cmsg,nick)) t.daemon = True t.start() except KeyboardInterrupt: self.ts.disconnect() log("[I] (Main chat Server Thread): Exiting") exit(0) except: pass ## Client commands commands =[] def chat_help(): pass # Client Help def chat_help(args): chantext.append("\ttor-IRC, %s %s" % (__author__,__date__)) chantext.append("\tCommands available:") for c in commands: chantext.append("\t\t/%s: %s" % (c[0],c[2])) return "" commands.append(("help",chat_help,"Local help")) # Server help def chat_server_help(args): return "/serverhelp" commands.append(("serverhelp",chat_server_help,"Request server commands help text")) # Quit def chat_quit(args): exit(0) commands.append(("quit",chat_quit,"Exit the python application 'TOR-IRC'")) ## --- end client commands ## Client GUI functions count=0 cmdline="" inspoint=0 pagepoint=0 def changeSize(stdscr): global width,height size = stdscr.getmaxyx() width=size[1] height=size[0] def redraw(stdscr): global textpad global roster stdscr.clear() # draw Text line=height-3 for i in reversed(range(len(chantext)-pagepoint)): try: stdscr.addstr(line,0,chantext[i],0) if line==0: break else: line-=1 except: pass # draw roster for i in range(len(roster)): buddy=roster[i] stdscr.addstr(i,width-buddywidth+1,str(buddy),0) # draw lines stdscr.hline(height-2,0,curses.ACS_HLINE,width) stdscr.vline(0,width-buddywidth,curses.ACS_VLINE,height-2) # prompt prompt="~ " stdscr.addstr(height-1,0,"%s%s" % (prompt,cmdline),0) stdscr.move(height-1,len(prompt)+inspoint) # Process command line # Returns string to send to server def processLine(command): if command.startswith("/"): comm=command[1:].split(' ') for t in commands: if comm[0].startswith(t[0]): func=t[1] return func(comm) return command # Client connection thread def clientConnectionThread(stdscr,ServerOnionURL,msgs): global roster # Try to load Socksipy try: import socks except: print "[E] Cannot load socksiPy module." print "[E] Try installing python-socksiPy with package manager of your distro : pypi.python.org/pypi/SocksiPy " exit(0) while(True): try: log("Trying to connect to %s:%d" % (ServerOnionURL,hidden_service_port)) ## Connects to TOR via Socks s=socks.socksocket(socket.AF_INET,socket.SOCK_STREAM) s.setproxy(socks.PROXY_TYPE_SOCKS5,tor_server,tor_server_socks_port) s.settimeout(100) s.connect((ServerOnionURL,hidden_service_port)) s.setblocking(0) log("clientConnection: Connected to %s" % ServerOnionURL) log("clientConnection: Autorequesting roster...") msgs.append("/roster") randomwait=random.randint(1,clientRandomWait) except: log("clientConnection: Cannot connect! retrying...") time.sleep(1) continue try: while(True): time.sleep(1) ready = select.select([s], [], [], 1.0) # received data from server if ready[0]: data=sanitize(s.recv(minimum_message_len)) # received pong (ignore) if data.find("/PING ")>-1: continue # received roster list if data.startswith("--roster"): roster=[] for i in data.split(' ')[1:]: roster.append(i) # Write received data to channel log(data) # We need to send a message if len(msgs)>0: randomwait-=1 # Wait some random time to add noise if randomwait==0: m = addpadding(msgs.pop(0)) s.sendall(m) randomwait=random.randint(1,clientRandomWait) # send noise in form of PINGs if random.randint(0,clientRandomNoise)==0: ping="/PING " for i in range(120): ping+="%02X" % random.randint(0,255) #log("Sending %s" % ping) msgs.append(ping) except: s.close() pass ## Client main procedure def clientMain(stdscr,ServerOnionURL): global cmdline global inspoint global pagepoint global width,height changeSize(stdscr) redraw(stdscr) ## Message queue to send to server msgs=[] t = Thread(target=clientConnectionThread, args=(stdscr,ServerOnionURL,msgs)) t.daemon = True t.start() # Main Loop while True: input=stdscr.getch() # event processing if (input == curses.KEY_RESIZE): changeSize(stdscr) # Basic line editor if (input == curses.KEY_LEFT) and (inspoint>0): inspoint-=1 if (input == curses.KEY_RIGHT) and (inspoint<len(cmdline)): inspoint+=1 if (input == curses.KEY_BACKSPACE) and (inspoint>0): cmdline=cmdline[:inspoint-1]+cmdline[inspoint:] inspoint-=1 if (input == curses.KEY_DC) and (inspoint<len(cmdline)): cmdline=cmdline[:inspoint]+cmdline[inspoint+1:] if (input == curses.KEY_HOME): inspoint=0 if (input == curses.KEY_END): inspoint=len(cmdline) #PgUp/PgDown if (input == curses.KEY_PPAGE): pagepoint+=height-2 if len(chantext)-pagepoint<0: pagepoint=len(chantext) if (input == curses.KEY_NPAGE): pagepoint-=height-2 if pagepoint<0: pagepoint=0 #History: TODO """ if (input == curses.KEY_UP): if (input == curses.KEY_DOWN): """ if (input == 10): tosend=processLine(cmdline) if len(tosend)>0: msgs.append(tosend) cmdline="" inspoint=0 # Ascii key if input>31 and input<128: if len(cmdline)<(width-5): cmdline=cmdline[:inspoint]+chr(input)+cmdline[inspoint:] inspoint+=1 redraw(stdscr) # Client # Init/deinit curses def Client(ServerOnionURL): global stdscr global STDOutLog STDOutLog=False try: # Initialize curses stdscr=curses.initscr() curses.noecho() curses.cbreak() stdscr.keypad(1) # Enter the main loop clientMain(stdscr,ServerOnionURL) # Set everything back to normal stdscr.keypad(0) curses.echo() curses.nocbreak() # Terminate curses curses.endwin() exit(0) except: # In event of error, restore terminal to sane state. stdscr.keypad(0) curses.echo() curses.nocbreak() curses.endwin() # Main proc: # Parse options, invoke Server or Client if __name__=='__main__': parser = OptionParser() parser.add_option("-c", "--connect", action="store", type="string", dest="connect", help="Acts as client, connect to server") parser.add_option("-s", "--server" , action="store", type="string", dest="channel_name", help="Acts as server") # no arguments->bail if len(sys.argv)==1: parser.print_help() exit(0) (options, args) = parser.parse_args() if options.channel_name: s=Server() s.serverMain(options.channel_name) else: if len(options.connect)>0: Client(options.connect) else: parser.print_help()

[chan] general
Dec 11 13:03 [raw]

Not to nitpick, but a PGP signature would be nice.

[chan] general
Dec 11 13:07 [raw]

$ ./torIRC9050.py --connect=7oxvu7yqgymxbmqg.onion File "./torIRC9050.py", line 346 self.SocksPort=9050 ^ IndentationError: unindent does not match any outer indentation level

[chan] general
Dec 11 13:08 [raw]

important for large proj only just run kompare on the file

[chan] general
Dec 11 13:11 [raw]

"just run" will be 5 mBTC extra, thanks http://wiki.c2.com/?JustIsaDangerousWord

[chan] general
Dec 11 13:12 [raw]

the orignal file is working here

[chan] general
Dec 11 13:14 [raw]

I saved it wrong

[chan] general
Dec 11 13:26 [raw]

kick butt chat proggy

[chan] general
Dec 11 13:26 [raw]

best ever dark chat

[chan] general
Dec 11 13:27 [raw]

totally

[chan] general
Dec 11 16:50 [raw]

Yes, and it would be nice to know what effect his changes have made. For all we know, running this version reveals your real IP address to the authorities.

[chan] general
Dec 12 02:22 [raw]

bs. which line would that be?

[chan] general
Dec 12 03:25 [raw]

Really? It is BS that we don't know whether or not there is a backdoor in the code? By your logic it is BS that you don't know which line(s) of code we are concerned about (which, BTW, is all of them since we can't read the damn code) Just because the code is published doesn't mean everybody can read it and understand what it is doing. It is good policy not to blindly trust whoever published the code that there is no backdoor nor anybody who says there is/isn't a backdoor.

[chan] general
Dec 12 03:27 [raw]

i sent u the mini bm try find back door cannot be hard dude

[chan] /pol/
Dec 12 03:29 [raw]

true , the mini torIRC is easy to audit. I found nothing. very small app.

[chan] general
BM-2cW67GEKkHGonXKZLCzouLLxnLym3azS8r

Subject Last Count
In need of muliplatform commandline file encryption tool Apr 20 10:43 11
Free XMPP Server Apr 20 10:19 6
Acronyms for NT ??? Apr 20 08:18 7
Where is bleep from bittorrent? Apr 20 08:18 2
Ending White Slavery Apr 20 06:02 1
▌│█║▌║▌║ Chaos Management: So You Wanna be a Nazi ║▌║▌║█│▌ Apr 20 05:41 1
ephue Apr 20 05:08 2
Satellites Are Fake - Just Another NASA Hoax Apr 20 01:46 10
i am bored Apr 19 23:36 5
Attn: Beneficiary Apr 19 22:31 2
572B87DF7CD971256320B748254D0A51 Apr 19 19:37 1
The Polish Air Force aircraft TU-154M with the President of Poland Lech Kaczyński was destroyed in the air as a result of several explosions. Apr 19 16:40 2
(no subject) Apr 19 16:37 10
why did NASA erase the original moon landing tapes? Apr 19 14:19 2
The old believe everything, the middle-aged suspect everything, the young know everything. - Oscar Wilde Apr 19 14:11 2
Satellites Do Not Exist As Described Apr 19 13:35 2
[chan] 411: DARKNET DIRECTORY ASSISTANCE Apr 19 03:25 1
Why white males should use bitmessage and encourage their token negro friends to use it too Apr 19 03:19 1
i breast feed my son Apr 18 23:21 3
GNG is not GNU. Apr 18 23:21 1
ETERNITY EXPLAINED Apr 18 23:21 1
Earth girls are easy Apr 18 23:17 1
Programming Mother Fucker Apr 18 23:17 2
Nikola Tesla, inventor of radio, microwave, was a Flat Earther Apr 18 23:12 1
Interview w/ Former NASA Employee Turned Flat Earther Apr 18 23:12 1
NASA AND FACEBOOK TRICKED YOU - Must Watch!!! Apr 18 23:12 1
Eric Dubay: Dinosaurs Never Existed! Apr 18 23:12 1
This video blocked in 51 countries. Apr 18 23:09 1
Hypocrisy alarm... Richard Stallman charging money for (restricting) speech: Apr 18 23:07 1
Space may be liquid🌅 Apr 18 23:07 1
Gravity is a mystical force invented by Freemasons. Apr 18 23:05 1
How to Receive the Gift of the Holy Spirit. Apr 18 23:05 1
Internet privacy, funded by spooks: A brief history of the BBG Apr 18 23:03 1
IVANKA TRUMP IS A MAN EASY SEEN AND BRITISH ISRAEL LOVES IT Apr 18 23:03 1
Satanic Pedophilia Network Exposed in Australia — It Starts at the TOP, Just Like in the USA and UK Apr 18 23:03 1
Easter Under Attack in Muslim countries Apr 18 23:00 1
Hair In Space : The NASA Illusion Apr 18 22:56 1
Julian Assange and Pedophile Baby Farms Apr 18 22:56 1
WHY ARE THERE SO MANY DIFFERENT CHURCHES? Apr 18 22:56 1
PROOF GPS Satellites Do Not Exist Apr 18 22:55 1
90% of Linux users are hypocrites Apr 18 22:54 1
Flat Earth - Bible Truth in an Unstable World Apr 18 22:49 1
Why is Australia upside down? And which way is downside up? Apr 18 22:49 1
Child Sex Tourism Apr 18 22:47 1
Whorlando Homocaust Apr 18 22:45 1
ILLUMINATI Melania Trump is a tranny man - Duration: 4:03. Michelle X 3,717 views. 4:03. Lucille Ball. Man. Hellywood SRA Satanic Tranny Cult. Apr 18 22:45 1
the lunar landings were a psyop hoax Apr 18 22:42 1
Conversation with satan Apr 18 22:41 1
The Moon Is ONLY 70 Miles Wide! Apr 18 22:40 1
Report Pedophiles to Authorities Apr 18 22:39 2
ISIS murders more Egyptian Christians Apr 18 22:38 1
Can Old Covenant Worship Laws Become New Covenant Spiritual “Shadows”? Apr 18 22:38 1
> some DoD intern Apr 18 22:37 1
White males don't understand. Apr 18 22:35 1
Consider this problem. Apr 18 22:35 1
A satellite engineer explains the truth about satellite operations Apr 18 22:32 1
Flat Earth Codes Apr 18 22:32 1
European elites hate Jesus Christ and Christians, kiss Mohammed's ass Apr 18 22:30 1
meteors are stars Apr 18 22:29 1
This pilot admits to know the earth is FLAT Apr 18 22:29 1
John McAfee "Bitcoin to $500K" Apr 18 22:29 1
Dunderheads in an imaginary mathematical universe Apr 18 22:29 1
Steve Jobs was female Apr 18 22:28 1
FLAT EARTH, why is there even a debate? ✞ Apr 18 22:23 2
Programming, Motherfucker. Do you speak it? Apr 18 22:23 2
Restrict Information (FREE, FREE, FREE) Apr 18 22:18 1
Hoax, hoax, hoax, Re: Satellites Are Fake - Just Another NASA Hoax Apr 18 20:41 1
Miley Cyrus and Christina Aguilera are Men! (proof) Apr 18 20:09 1
BIGGER THAN FLAT EARTH - SHOCKING VIDEO, UNCOVERING THE DECEPTION OF THE WORLD Apr 18 19:28 1
Antarctica - Sorry We're Closed! Our Hidden Flat Earth Apr 18 19:20 1
Buzzfeed is drinking the flat earth antidote Apr 18 19:18 1
Before there was Flat Earth Man.... Apr 18 19:18 1
Do you still believe we went to the moon? - Flat Earth Man Apr 18 18:51 1
Welcome to the Satellite Hoax - Flat Earth Man Apr 18 18:44 1
UK Column News - 18th April 2018 Apr 18 16:22 2
Collaborative blog Apr 18 11:45 2
Something About the Space X Launch Nobody's Talking About Apr 18 11:45 1
This program saved me thousands of $ Apr 18 11:02 5
Buying computer equipment in Germany/EU with crypto Apr 18 10:21 2
Religious mania Apr 18 06:59 6
how to get movies Apr 18 06:56 17
NUKED Apr 18 03:21 21
JESUIT CONTROLLED PUTIN EXPOSED Apr 17 22:24 1
The Largest Cult in the world: GNU/GPL Apr 17 22:13 1
In surveying advertised secure communication protocols I've come to the conclusion that despite its warts Bitmessage is the only viable option. Apr 17 22:00 1
This is EXACTLY how NASA fakes everything Apr 17 21:55 2
The Homosexual Perversion: A Jewish Criminal Simhke for the Postmodern Corporate Conformist Apr 17 21:55 1
Sandy Hook Victims a Ritual Sacrifice Cover Up? Apr 17 21:42 1
DONT POST ON CHAN W/ YOUR BM ADDRESS Apr 17 21:36 2
Great Lakes Prove Flat Earth Apr 17 21:16 1
fuck you, you whiny pussy Apr 17 20:46 1
Child Abduction Rapid Deployment (CARD) Teams Apr 17 20:36 1
you are an obedient baby fagmason. Apr 17 20:33 1
Fake Moon Landing | As Seen On TV | Movies & Television Apr 17 20:16 1
UK Column News - 17th April 2018 Apr 17 16:05 2
034998B26E902814ECBC76AAE27431CD Apr 17 15:16 1
Get bitcoin while browsing web. Apr 17 13:00 4
A33CE5B06E3049BA2A2F66FDC0B9F866 Apr 17 11:39 1
"There Wasn't A Single Corpse": Russia Claims 'White Helmets' Staged Syria Chemical Attack Apr 17 07:22 5
Lets look at the name more closely in columns of 4 Apr 17 02:48 3