ふとした思いつきで、簡単にセキュリティ的にイケてないソフト探す事ができるかもしれないなと思ったのでイケてないソフトを探すソフトを作ってみた。
やってる事
- C言語の文字列操作関数を使っているか調べる(セキュリティホールになりやすい)
- スタック保護がなかった時代のVisualC++を使っているか調べる
- DLL/EXEの作成日時を調べる
C言語の文字列関数を使っているDLL/exe(といっても文字列探索してるだけ)を見つけたら表示します。作成年が2003年とか古かったらメンテナンスされていない可能性のある要注意ソフトです。
さらに後ろにtrue/falseと表示してますが、trueの倍スタック保護がなかった(or 弱かった)時代のVisualC++を使っているソフトです。
実行例
以下はFirefoxでの実行例です
C:\Program Files (x86)\Mozilla Firefox/d3dcompiler_46.dll 2013 true
C:\Program Files (x86)\Mozilla Firefox/uninstall/helper.exe 2010 true
使い方:
ruby installerでrubyをインストールした後に
以下のソースを拡張子.rbで保存して、実行すればいいです。(c:\以下を探索)
(実行時にパスを引数として渡すと、そのパス以下を処理します)
(installerはバージョン2.0系を使っとけばとりあえず無難かなと。)
#!/usr/bin/ruby
# coding: ASCII-8BIT
def dumpTime(file)
dangerFunc = false
oldVC=false
begin
content = File.binread(file);#.binread()
rescue
return
end
year=2014
pos=content[0..2000].index("PE\0\0")
if(pos!=nil)then
date=content.getbyte(pos+8)+
content.getbyte(pos+9)*2**8+
content.getbyte(pos+10)*2**16+
content.getbyte(pos+11)*2**24
year = Time.at(date,0).strftime("%Y").to_i
end
psFlag=false
sprintFlag=false
content.split(/[\s\0]+/).each do |line|
oldVC = true if (/(MFC\.DLL)|(MFC42\.DLL)|(MFC70\.DLL)|(MFC80\.DLL)|(MSVCRT\.DLL)/i =~ line)
psFlag = true if(/\%s/ =~ line && !(/CLSID(\\)*\%s/=~line) )
sprintFlag = true if(/sprintf/ =~ line)
dangerFunc = true if(sprintFlag && psFlag)
dangerFunc = true if(/strcat/ =~ line) #strcpy getは当面除外
end
puts "#{file}\t#{year}\t#{oldVC}" if(dangerFunc && (oldVC || year <2009 || 2030<year) )
end
def run(dir)
#$stderr.puts "DIR: #{dir}"
begin
dd=Dir.open(dir)
rescue
return
end
dd.each do |f|
next if( f=="." || f == ".." || /^\$/=~f )
file=dir +( "/" + f)
run(file) if FileTest.directory?(file)
dumpTime(file) if(( f=~ /\.exe$/i || f=~ /\.dll$/i|| f=~ /\.ocx$/i ) && FileTest.file?(file))
end
end
start=ARGV[0]
start="c:/" if(start==nil)
run start
$stderr.puts "End===press any key to exit===="
$stdin.gets
0 件のコメント:
コメントを投稿