11import argparse
22from datetime import datetime
33
4- r = 0x1DB98930
5- r = 0x1DBA8930
6- len_l = 0xC
7- len_u = 0x18
8-
9-
10- def init_rand_and_chars (year , month , day , nr_b ):
11- global r
4+ def init_rand_and_chars (year , month , day , nr_b , r ):
125 r = (r + year + ((nr_b << 16 ) + (month << 8 ) | day )) & 0xFFFFFFFF
136 charset = [chr (x ) for x in xrange (ord ('a' ), ord ('z' ))] + \
147 [chr (x ) for x in xrange (ord ('0' ), ord ('9' ))]
158
16- return charset
9+ return charset , r
1710
18- def generate_domain (charset ):
19- global r
11+ def generate_domain (charset , r ):
12+ len_l = 0xC
13+ len_u = 0x18
2014 r = (1664525 * r + 1013904223 ) & 0xFFFFFFFF
2115 domain_len = len_l + r % (len_u - len_l )
2216 domain = ""
@@ -25,19 +19,23 @@ def generate_domain(charset):
2519 domain += charset [r % len (charset )]
2620 domain += ".ddns.net"
2721 print (domain )
22+ return r
2823
2924if __name__ == "__main__" :
3025 parser = argparse .ArgumentParser ()
26+ parser .add_argument ("-s" , "--seed" , help = "seed" , default = "1DBA8930" )
3127 parser .add_argument ("-d" , "--date" , help = "date for which to generate domains" )
32- parser .add_argument ("-n" , "--nr" , help = "nr of domains to generate" , type = int , default = 40 )
28+ parser .add_argument ("-t" , "--debug" , help = "debug DGA (day set to 8)" )
29+ parser .add_argument ("-n" , "--nr" , help = "nr of domains to generate" ,
30+ type = int , default = 40 )
3331 args = parser .parse_args ()
34- if args .date :
35- d = datetime .strptime (args .date , "%Y-%m-%d" )
36- else :
37- d = datetime .now ()
32+
33+ d = datetime .strptime (args .date , "%Y-%m-%d" ) if args .date else datetime .now ()
34+ day = 8 if args .debug else d .day
3835
39- charset = init_rand_and_chars (d .year , d .month , 8 , 1 )
36+ charset , r = init_rand_and_chars (d .year , d .month , day , 1 ,
37+ int (args .seed , 16 ))
4038 for _ in range (40 ):
41- generate_domain (charset )
39+ r = generate_domain (charset , r )
4240
4341
0 commit comments