Skip to content

Commit 443c6e8

Browse files
committed
2 parents 4921fb4 + 6564149 commit 443c6e8

File tree

6 files changed

+1810
-2
lines changed

6 files changed

+1810
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ proslikefan | Proslikefan | | [link](https://johannesbader.ch/2016/06/proslikefa
3939
vawtrak | Vawtrak | | [link](http://www.threatgeek.com/2016/11/vawtrak-dga-round-2.html)
4040
unnamed_downloader | Unnamed Downloader | |
4141
chinad | Chinad | | [link](https://github.com/360netlab/DGA/issues/1)
42+
tempedreve | Tempedreve | | [link](https://github.com/baderj/domain_generation_algorithms/tree/master/tempedreve/images)

qadars/dga.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def rand(r, seed):
99

1010
def dga(date, seed):
1111
charset = string.ascii_lowercase + string.digits
12-
if seed in [0xE1F2, 0xE1F1]:
12+
if seed in [0xE1F2, 0xE1F1, 0xE1F5]:
1313
tlds = [".com", ".org", ".net"]
1414
else:
1515
tlds = [".net", ".org", ".top"]
@@ -33,7 +33,7 @@ def dga(date, seed):
3333
help="date for which to generate domains")
3434
parser.add_argument("-s", "--seed",
3535
help="seed as hexstring", choices={"89f5", "4449", "E1F1",
36-
"E1F2", "E08A"},
36+
"E1F2", "E08A", "E1F5"},
3737
default="e08a")
3838
args = parser.parse_args()
3939

tempedreve/dga.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
"""
2+
Time-Dependent DGA of Tempedreve
3+
--------------------------------
4+
sample: https://www.virustotal.com/en/file/6d0f7460569993ffeedfb67514f50e1d93b7124e132f0de6bb3f57d00d779c9d/analysis/1493892364/
5+
md5: a1310a8d9a6a51be4a6600a2be7ddab2
6+
7+
8+
This DGA is very similar to the time-independent one described
9+
by Anubis Networks, see
10+
https://www.anubisnetworks.com/tempedreve-botnet-report
11+
"""
12+
13+
import string
14+
import argparse
15+
from datetime import datetime, timedelta
16+
17+
def rand(r):
18+
r = (16843009 * r) & 0xFFFFFFFF
19+
r = (r + 65805) & 0xFFFFFFFF
20+
return r
21+
22+
def shuffle(letters, seed):
23+
r = seed;
24+
for j in range(len(letters)):
25+
i = r % len(letters)
26+
r = rand(r)
27+
letters[j], letters[i] = letters[i], letters[j]
28+
return letters
29+
30+
def dga(d):
31+
enddate = datetime.strptime("2015-03-23", "%Y-%m-%d")
32+
while d >= enddate:
33+
days = days_since_unix_epoch(d)
34+
seed = (((1664525*days) & 0xFFFFFFFF) + 1013904223) & 0xFFFFFFFF
35+
tlds = ['.com', '.net', '.org', '.info']
36+
letters = list(string.ascii_lowercase)
37+
letters = shuffle(letters, seed)
38+
length = seed % 5 + 7
39+
domain = ""
40+
r = seed
41+
for i in range(length):
42+
domain += letters[r % len(letters)]
43+
r = rand(r)
44+
tld = tlds[seed & 3]
45+
domain += tld
46+
d -= timedelta(days=1)
47+
yield domain
48+
49+
def days_since_unix_epoch(dt):
50+
return (dt - datetime(1970,1,1)).days
51+
52+
if __name__=="__main__":
53+
parser = argparse.ArgumentParser()
54+
parser.add_argument("-d", "--date", help="date for which to generate domains")
55+
args = parser.parse_args()
56+
if args.date:
57+
d = datetime.strptime(args.date, "%Y-%m-%d")
58+
else:
59+
d = datetime.now()
60+
for domain in dga(d):
61+
print(domain)

0 commit comments

Comments
 (0)