Skip to content

Instantly share code, notes, and snippets.

@CryptoManiac
Created April 24, 2018 03:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save CryptoManiac/3cfce4c1518a7181788f6baedd48c77a to your computer and use it in GitHub Desktop.
Save CryptoManiac/3cfce4c1518a7181788f6baedd48c77a to your computer and use it in GitHub Desktop.
Generic NoDevfee proxy for ethereum
#!/usr/bin/python2.7
import sys
import socket
import threading
import json
from collections import OrderedDict
import binascii
import datetime
import time
def server_loop(local_host, local_port, remote_host, remote_port):
# create the server object
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# lets see if we can stand up the server
try:
print "Daemon is launched, do not close this windows"
server.bind((local_host, local_port))
except:
print "[!!] Failed to listen on %s:%d" % (local_host, local_port)
print "[!!] Check for other listening sockets or correct permissions"
sys.exit(0)
# listen with 5 backlogged--queued--connections
server.listen(5)
while True:
client_socket, addr = server.accept()
# print out the local connection information
print"[+] Received incomming connections from %s:%d" % (addr[0], addr[1])
# start a new thread to talk to the remote host
proxy_thread = threading.Thread(target=proxy_handler,
args=(client_socket, remote_host, remote_port))
proxy_thread.daemon = False
proxy_thread.start()
def receive_from(connection):
buffer = ""
# We set a 2 second time out depending on your
# target this may need to be adjusted
connection.settimeout(0)
try:
# keep reading into the buffer until there's no more data
# or we time out
while True:
data = connection.recv(4096)
if not data:
break
buffer += data
except:
pass
return buffer
# modify any requests destined for the remote host
def request_handler(socket_buffer):
#Here is the good part
#If it is an Auth packet
if ('submitLogin' in socket_buffer) or ('eth_login' in socket_buffer) or ('eth_submitLogin' in socket_buffer) or ('mining.authorize' in socket_buffer) or ('mining.submit' in socket_buffer):
json_data = json.loads(socket_buffer, object_pairs_hook=OrderedDict)
print('[+] Auth in progress with address: ' + json_data['params'][0])
#If the auth contain an other address than our
if wallet not in json_data['params'][0]:
print('[*] DevFee Detected - Replacing Address - ' + str(datetime.datetime.now()))
# print('[*] OLD: ' + json_data['params'][0]) + ' -eworker ' + json_data['worker']
# print(' ---OLD----')
# print(socket_buffer)
# print(' ')
#We replace the address
json_data['params'][0] = wallet + worker_name
json_data['worker'] = 'eth1.'+worker_name_devfee
print('[*] NEW: ' + json_data['params'][0]) + ' -eworker ' + json_data['worker']
socket_buffer = json.dumps(json_data) + '\n'
#Packet is forged, ready to send.
return socket_buffer
# modify any responses destined for the local host
def response_handler(buffer):
return buffer
def proxy_handler(client_socket, remote_host, remote_port):
# We prepare the connection
remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# We will try to connect to the remote pool
for attempt_pool in range(3):
try:
remote_socket.connect((remote_host, remote_port))
except:
print "[!] Impossible to connect to the pool. Try again in few seconds "
time.sleep(2)
else:
# Connection OK
break
else:
print "[!] Impossible initiate connection to the pool. Claymore should reconnect. (Check your internet connection) "+ str(datetime.datetime.now())
#Closing connection
client_socket.shutdown(socket.SHUT_RDWR)
client_socket.close()
#Exiting Thread
sys.exit()
# now let's loop and reading from local, send to remote, send to local
# rinse wash repeat
while True:
# read from local host
local_buffer = receive_from(client_socket)
if len(local_buffer):
# print('--------proxy_handler local buffer-----------')
# print local_buffer
# print('----------------------------------------------')
# send it to our request handler
local_buffer = request_handler(local_buffer)
#print local_buffer
# Try to send off the data to the remote pool
try:
remote_socket.send(local_buffer)
except:
print "[!] Sending packets to pool failed."
time.sleep(0.02)
print "[!] Connection with pool lost. Claymore should reconnect. (May be temporary) "+ str(datetime.datetime.now())
#Closing connection
client_socket.shutdown(socket.SHUT_RDWR)
client_socket.close()
#Exiting loop
break
# Adding delay to avoid too much CPU Usage
time.sleep(0.001)
# receive back the response
remote_buffer = receive_from(remote_socket)
if len(remote_buffer):
# print('--------proxy_handler remote_buffer-----------')
# print remote_buffer
# print('----------------------------------------------')
# send to our response handler
remote_buffer = response_handler(remote_buffer)
# Try to send the response to the local socket
try:
client_socket.send(remote_buffer)
except:
print('[-] Auth Disconnected - Ending Devfee or stopping mining - ' + str(datetime.datetime.now()))
client_socket.close()
break
# Adding delay to avoid too much CPU Usage
time.sleep(0.001)
time.sleep(0.001)
#Clean exit if we break the loop
sys.exit()
def main():
# cursory check of command line args
if len(sys.argv[1:]) != 5:
print "Usage: ./proxy.py [localhost] [localport] [remotehost] [remoteport] [ETH Wallet]"
print "Example: ./proxy.py 127.0.0.1 9000 eth.realpool.org 9000 0x..."
sys.exit(0)
# set up listening parameters
local_host = sys.argv[1]
local_port = int(sys.argv[2])
# set up remote targets
remote_host = sys.argv[3]
remote_port = int(sys.argv[4])
# Set the wallet
global wallet
wallet = sys.argv[5]
global worker_name
worker_name = 'NoDevFee'
global worker_name_devfee
worker_name_devfee = 'NoDevFee'
#Uncomment if you meet issue with pool or worker name - This will disable the worker name
#worker_name = ''
pool_slash = ['nanopool.org','dwarfpool.com']
pool_dot = ['ethpool.org','ethermine.org','alpereum.ch']
pool_ru = ['etherdig.ru','ethermine.ru','etherdig.net']
if worker_name:
if any(s in remote_host for s in pool_slash):
worker_name = '/' + worker_name
elif any(d in remote_host for d in pool_dot):
worker_name = '.' + worker_name
# elif any(d in remote_host for d in pool_ru):
# worker_name = ' -eworker ' + worker_name
else:
#No worker name for compatbility reason
print "Unknown pool - Worker name is empty"
worker_name = ''
print "Wallet set: " + wallet + worker_name
# now spin up our listening socket
server_loop(local_host, local_port, remote_host, remote_port)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment