s2x: Flashのcookieファイル(*.sol)とXMLフォーマットの互换用Pythonスクリプトソース

すみませんけど、「古い」の話だかも^^)、WINDOWSシステムに、「Application Data」→「Macromedia」(現在はAdobe)→「Flash Player」の配下の何にかフォルダの下には、「.sol」ファイルというのがある可能性があります。これって一体何ですか?

SOLファイルというのは、Flashのcookieファイルです。「Flash Player が利異様するクッキー(.solファイル)には、システムファイルの場所を推定できるような情報が含まれている。一方、リモートからその場所にファイルを保存させることができるので、クッキーにスクリプトを含ませておけばローカルのスクリプトとしてブラウザから実行させることができてしまう。ただし、そのためには攻撃者がローカルのユーザ名を知っている必要がある。」という弱点があります(現在のバージョンはその問題がなくなるね)。

以前、solファイルの内容を見に安いXMLに変換するため「s2x」というPythonスクリプトがあります。持っているリリースされた公式サイトには、すでにアクセスできないようです。そのスクリプト、現在のFlash Player環境などでは、すでに意味がないと思いますが、開発者に対しては、いい資料だと思います。

※XMLとは、文書やデータの意味や構造を記述するためのマークアップ言語の一つ。マークアップ言語とは、「タグ」と呼ばれる特定の文字列で地の文に構造を埋め込んでいく言語のことで、XMLはユーザが独自のタグを指定できることから、マークアップ言語を作成するためのメタ言語とも言われる。

ソースは以下のようです。


import sys
from struct import *
from xml.dom import minidom
#s2x Runtime Error Class Definition:
class s2xErr(Exception):
def __init__(self,msg):
self.msg=msg
#constants start:
#————————————————————#
NUMBER=’\x00′
BOOLEAN=’\x01′
STRING=’\x02′
OBJOBJ=’\x03′
NULL=’\x05′
UNDEF=’\x06′
OBJARR=’\x08′
#RAWARR=’\x0A’
OBJDATE=’\x0B’
OBJM=’\x0D’
OBJXML=’\x0F’
OBJCC=’\x10′
#constants end.
#————————————————————#
argv=sys.argv
if len(argv)<3: print 's2x v 0.75 by iceeLyne, Dec., 2003.' print 'usage:' print 'python s2x.py -x foo.sol [foo.xml]' print 'python s2x.py -s foo.xml [foo.sol]' else: argvSw=argv[1] argvInpFile=argv[2] if len(argv)>3:
argvOutFile=argv[3]
else:
argvOutFile=”
if argvSw==’-x’:
# parse sol to xml
try:
f=open(argvInpFile,’rb’)
except IOError:
print ‘Could Not Open The Input File: ‘+argvInpFile
else:
def num2x():
global cparent,sVname
s=f.read(8)
if s==’\x7F\xF0\x00\x00\x00\x00\x00\x00′:
sValue=’Infinity’
elif s==’\xFF\xF0\x00\x00\x00\x00\x00\x00′:
sValue=’-Infinity’
elif s==’\x7F\xF8\x00\x00\x00\x00\x00\x00′:
sValue=’NaN’
else:
nValue,=unpack(‘>d’,s)#Double,Big-endian
sValue=str(nValue)
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’number’)
c.setAttribute(‘name’,sVname)
c.setAttribute(‘value’,sValue)
def bol2x():
global cparent,sVname
b=f.read(1)
if b==’\x00′:
sValue=’false’
elif b==’\x01′:
sValue=’true’
else:
print ‘Warning: Boolean Value Error.’
sValue=’true’
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’boolean’)
c.setAttribute(‘name’,sVname)
c.setAttribute(‘value’,sValue)
def str2x():
global cparent,sVname
nLenStr,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
s=f.read(nLenStr)
s=s.decode(‘utf-8’)#
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’string’)
c.setAttribute(‘name’,sVname)
c.appendChild(d.createCDATASection(s))
def obj2x():
global cparent,sVname,nLenVname#is necessary
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’object’)
c.setAttribute(‘name’,sVname)
cparent=cparent.lastChild
nLenVname,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
while nLenVname!=0:
sVname=f.read(nLenVname)
sVname=sVname.decode(‘utf-8’)#
type=f.read(1)
if type==NUMBER:
num2x()
elif type==BOOLEAN:
bol2x()
elif type==STRING:
str2x()
elif type==OBJARR:
arr2x()
elif type==OBJOBJ:
obj2x()
elif type==OBJDATE:
dat2x()
elif type==OBJXML:
xml2x()
elif type==OBJCC:
occ2x()
elif type==OBJM:
ojm2x()
elif type==NULL:
nul2x()
elif type==UNDEF:
und2x()
else:
raise s2xErr(‘Unexpected Data Type: ‘+hex(ord(type)))
nLenVname,=unpack(‘>H’,f.read(2))
objend=f.read(1)#==’\x09′
cparent=cparent.parentNode
def arr2x():
global cparent,sVname,nLenVname#is necessary
nArrLength,=unpack(‘>L’,f.read(4))#Unsigned Long,Big-endian
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’array’)
c.setAttribute(‘name’,sVname)
c.setAttribute(‘length’,str(nArrLength))
cparent=cparent.lastChild
nLenVname,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
while nLenVname!=0:
sVname=f.read(nLenVname)
sVname=sVname.decode(‘utf-8’)#
type=f.read(1)
if type==NUMBER:
num2x()
elif type==BOOLEAN:
bol2x()
elif type==STRING:
str2x()
elif type==OBJOBJ:
obj2x()
elif type==OBJARR:
arr2x()
elif type==OBJDATE:
dat2x()
elif type==OBJXML:
xml2x()
elif type==OBJCC:
occ2x()
elif type==OBJM:
ojm2x()
elif type==NULL:
nul2x()
elif type==UNDEF:
und2x()
else:
raise s2xErr(‘Unexpected Data Type: ‘+hex(ord(type)))
nLenVname,=unpack(‘>H’,f.read(2))
objend=f.read(1)#==’\x09′
cparent=cparent.parentNode
def dat2x():
global cparent,sVname
nMsec,=unpack(‘>d’,f.read(8))#Double,Big-endian
nMinOffset,=unpack(‘>h’,f.read(2))#Short,Big-endian
nOffset=nMinOffset/60
c=cparent.appendChild(d.createComment(‘DateObject:Milliseconds Count From Dec. 1, 1969; Timezone UTC + Offset.’))
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’date’)
c.setAttribute(‘name’,sVname)
c.setAttribute(‘msec’,str(nMsec))
c.setAttribute(‘utcoffset’,str(-nOffset))
def xml2x():
global cparent,sVname
nLenCData,=unpack(‘>L’,f.read(4))#Unsigned Long,Big-endian
sCData=f.read(nLenCData)
sCData=sCData.decode(‘utf-8’)#
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’xml’)
c.setAttribute(‘name’,sVname)
c.appendChild(d.createCDATASection(sCData))
def occ2x():
global cparent,sVname,nLenVname#is necessary
nLenCname,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
sCname=f.read(nLenCname)
sCname=sCname.decode(‘utf-8’)#
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’c_object’)
c.setAttribute(‘name’,sVname)
c.setAttribute(‘class_name’,sCname)
cparent=cparent.lastChild
nLenVname,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
while nLenVname!=0:
sVname=f.read(nLenVname)
sVname=sVname.decode(‘utf-8’)#
type=f.read(1)
if type==NUMBER:
num2x()
elif type==BOOLEAN:
bol2x()
elif type==STRING:
str2x()
elif type==OBJARR:
arr2x()
elif type==OBJOBJ:
obj2x()
elif type==OBJDATE:
dat2x()
elif type==OBJXML:
xml2x()
elif type==OBJCC:
occ2x()
elif type==OBJM:
ojm2x()
elif type==NULL:
nul2x()
elif type==UNDEF:
und2x()
else:
raise s2xErr(‘Unexpected Data Type: ‘+hex(ord(type)))
nLenVname,=unpack(‘>H’,f.read(2))
objend=f.read(1)#==’\x09′
cparent=cparent.parentNode
def ojm2x():
global cparent,sVname
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’m_object’)
c.setAttribute(‘name’,sVname)
def nul2x():
global cparent,sVname
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’null’)
c.setAttribute(‘name’,sVname)
def und2x():
global cparent,sVname
c=cparent.appendChild(d.createElement(‘data’))
c.setAttribute(‘type’,’undefined’)
c.setAttribute(‘name’,sVname)
d=minidom.parseString(‘‘)
try:
f.seek(0,2)
nLenFile=f.tell()
f.seek(0)
sHeader=f.read(2)
sLenData=f.read(4)
nLenData,=unpack(‘>L’,sLenData)#Unsigned Long,Big-endian
if nLenFile!=nLenData+6:
print ‘Warning: Data Length Mismatch.’
sFileType=f.read(4)#==’TCSO’
sth1=f.read(6)
nLenSoln,=unpack(‘>H’,f.read(2))#Unsigned Short,Big-endian
solname=f.read(nLenSoln)
solname=solname.decode(‘utf-8’)#
sth2=f.read(4)
solxroot=d.firstChild
solxroot.setAttribute(‘std_version’,’0.75′)
solxroot.setAttribute(‘std_author’,’iceeLyne’)
solxroot.setAttribute(‘sol_name’,solname)
cparent=solxroot
while f.tell()H’,f.read(2))#Unsigned Short,Big-endian
sVname=f.read(nLenVname)
sVname=sVname.decode(‘utf-8’)#
type=f.read(1)
if type==NUMBER:
num2x()
elif type==BOOLEAN:
bol2x()
elif type==STRING:
str2x()
elif type==OBJOBJ:
obj2x()
elif type==OBJARR:
arr2x()
elif type==OBJDATE:
dat2x()
elif type==OBJXML:
xml2x()
elif type==OBJCC:
occ2x()
elif type==OBJM:
ojm2x()
elif type==NULL:
nul2x()
elif type==UNDEF:
und2x()
else:
raise s2xErr(‘Unexpected Data Type: ‘+hex(ord(type)))
end=f.read(1)#==’\x00’
sxmloutput=d.toprettyxml(‘\t’,’\n’,’utf-8′)
if argvOutFile==”:
argvOutFile=argvInpFile[:argvInpFile.rfind(‘.’)]+’.xml’
foutput=open(argvOutFile,’w’)
foutput.write(sxmloutput)
foutput.close()
print ‘Converted File: ‘+argvOutFile+’ Was Successfully Created.’
except s2xErr,e:
print e.msg
except:
print ‘Unexpected Error.’
d.unlink()#
f.close()#
elif argvSw==’-s’:
# parse xml to sol
try:
d=minidom.parse(argvInpFile)
except IOError:
print ‘Could Not Open The Input File: ‘+argvInpFile
except:
print ‘Error At Parsing XML File Input.’
else:
def x2num():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+NUMBER
sValue=c.getAttribute(‘value’)
if sValue==’Infinity’:
sData+=’\x7F\xF0\x00\x00\x00\x00\x00\x00′
elif sValue==’-Infinity’:
sData+=’\xFF\xF0\x00\x00\x00\x00\x00\x00′
elif sValue==’NaN’:
sData+=’\x7F\xF8\x00\x00\x00\x00\x00\x00′
else:
nValue=float(sValue)
sData+=pack(‘>d’,nValue)
def x2bol():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+BOOLEAN
sValue=c.getAttribute(‘value’)
if sValue==’true’:
sData+=’\x01′
elif sValue==’false’:
sData+=’\x00′
else:
raise s2xErr(‘Unexpected Boolean Value: ‘+sValue)
def x2str():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+STRING
sCData=”
for cData in c.childNodes:
if cData.nodeType==4:#CDATA_SECTION_NODE
sCData=cData.nodeValue
break
sCData=sCData.encode(‘utf-8’)#
nLenCData=len(sCData)
sLenCData=pack(‘>H’,nLenCData)
sData+=sLenCData+sCData
def x2obj():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJOBJ
temp=c
c=c.firstChild
while c:
if c.nodeType==1:#ELEMENT_NODE
sVname=c.getAttribute(‘name’)
sVname=sVname.encode(‘utf-8’)#
nLenVname=len(sVname)
sLenVname=pack(‘>H’,nLenVname)
type=c.getAttribute(‘type’)
if type==’number’:
x2num()
elif type==’boolean’:
x2bol()
elif type==’string’:
x2str()
elif type==’object’:
x2obj()
elif type==’array’:
x2arr()
elif type==’date’:
x2dat()
elif type==’xml’:
x2xml()
elif type==’c_object’:
x2occ()
elif type==’m_object’:
x2ojm()
elif type==’null’:
x2nul()
elif type==’undefined’:
x2und()
else:
raise s2xErr(‘Unexpected Data Type: ‘+type)
c=c.nextSibling
sData+=’\x00\x00\x09’
c=temp
def x2arr():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJARR
nArrLength=float(c.getAttribute(‘length’))
sArrLength=pack(‘>L’,nArrLength)
sData+=sArrLength
temp=c
c=c.firstChild
while c:
if c.nodeType==1:#ELEMENT_NODE
sVname=c.getAttribute(‘name’)
sVname=sVname.encode(‘utf-8’)#
nLenVname=len(sVname)
sLenVname=pack(‘>H’,nLenVname)
type=c.getAttribute(‘type’)
if type==’number’:
x2num()
elif type==’boolean’:
x2bol()
elif type==’string’:
x2str()
elif type==’object’:
x2obj()
elif type==’array’:
x2arr()
elif type==’date’:
x2dat()
elif type==’xml’:
x2xml()
elif type==’c_object’:
x2occ()
elif type==’m_object’:
x2ojm()
elif type==’null’:
x2nul()
elif type==’undefined’:
x2und()
else:
raise s2xErr(‘Unexpected Data Type: ‘+type)
c=c.nextSibling
sData+=’\x00\x00\x09’
c=temp
def x2dat():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJDATE
nMsec=float(c.getAttribute(‘msec’))
nMinOffset=-60*int(c.getAttribute(‘utcoffset’))
sData+=pack(‘>dh’,nMsec,nMinOffset)
def x2xml():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJXML
sCData=”
for cData in c.childNodes:
if cData.nodeType==4:#CDATA_SECTION_NODE
sCData=cData.nodeValue
break
sCData=sCData.encode(‘utf-8’)#
nLenCData=len(sCData)
sLenCData=pack(‘>L’,nLenCData)
sData+=sLenCData+sCData
def x2occ():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJCC
sCname=c.getAttribute(‘class_name’)
sCname=sCname.encode(‘utf-8’)#
nLenCname=len(sCname)

sLenCname=pack(‘>H’,nLenCname)
sData+=sLenCname+sCname
temp=c
c=c.firstChild
while c:
if c.nodeType==1:#ELEMENT_NODE
sVname=c.getAttribute(‘name’)
sVname=sVname.encode(‘utf-8’)#
nLenVname=len(sVname)
sLenVname=pack(‘>H’,nLenVname)
type=c.getAttribute(‘type’)
if type==’number’:
x2num()
elif type==’boolean’:
x2bol()
elif type==’string’:
x2str()
elif type==’object’:
x2obj()
elif type==’array’:
x2arr()
elif type==’date’:
x2dat()
elif type==’xml’:
x2xml()
elif type==’c_object’:
x2occ()
elif type==’m_object’:
x2ojm()
elif type==’null’:
x2nul()
elif type==’undefined’:
x2und()
else:
raise s2xErr(‘Unexpected Data Type: ‘+type)
c=c.nextSibling
sData+=’\x00\x00\x09′
c=temp
def x2ojm():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+OBJM
def x2nul():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+NULL
def x2und():
global sData,sLenVname,sVname,c
sData+=sLenVname+sVname+UNDEF
try:
solxroot=d.firstChild
if solxroot.tagName!=’solx’ or float(solxroot.getAttribute(‘std_version’))>0.75:
raise s2xErr(‘Not Solx File Or Incorrect File Version.’)
sHeader=’\x00\xBF’
sLenData=’\x00\x00\x00\x00′
sFileType=’TCSO’
sth1=’\x00\x04\x00\x00\x00\x00′
solname=solxroot.getAttribute(‘sol_name’)
solname=solname.encode(‘utf-8’)#
nLenSoln=len(solname)
sLenSoln=pack(‘>H’,nLenSoln)#2 bytes
sth2=’\x00\x00\x00\x00′
sData=sFileType+sth1+sLenSoln+solname+sth2
c=solxroot.firstChild
while c:
if c.nodeType==1:#ELEMENT_NODE
sVname=c.getAttribute(‘name’)
sVname=sVname.encode(‘utf-8’)#
nLenVname=len(sVname)
sLenVname=pack(‘>H’,nLenVname)
type=c.getAttribute(‘type’)
if type==’number’:
x2num()
elif type==’boolean’:
x2bol()
elif type==’string’:
x2str()
elif type==’object’:
x2obj()
elif type==’array’:
x2arr()
elif type==’date’:
x2dat()
elif type==’xml’:
x2xml()
elif type==’c_object’:
x2occ()
elif type==’m_object’:
x2ojm()
elif type==’null’:
x2nul()
elif type==’undefined’:
x2und()
else:
raise s2xErr(‘Unexpected Data Type: ‘+type)
sData+=’\x00’
c=c.nextSibling
if argvOutFile==”:
argvOutFile=argvInpFile[:argvInpFile.rfind(‘.’)]+’.sol’
f=open(argvOutFile,’wb’)
sLenData=pack(‘>L’,len(sData))
f.write(sHeader+sLenData+sData)
f.close()
print ‘Converted File: ‘+argvOutFile+’ Was Successfully Created.’
except s2xErr,e:
print e.msg
## except:
## print ‘Unexpected Error.’
d.unlink()#
else:
print ‘Invalid Switch: ‘+argvSw

リソース
http://osflash.org/s2x そこだけs2xに関して資料はまだ残してるようです。。。

2 thoughts on “s2x: Flashのcookieファイル(*.sol)とXMLフォーマットの互换用Pythonスクリプトソース”

Leave a Reply

Your email address will not be published. Required fields are marked *