간단한 WMF exploit 검사 도구입니다.
아래의 소스 파일을 저장한다음에 윈도우의 경우엔
ruby 파일명.rb [wmf파일명]
과 같이 하시면 되고, 리눅스라면
./파일명.rb [wmf파일명]
로 하면 됩니다. 제가 루비 초보라서 코드 작성은 이정도가 한계인 듯….
이 프로그램으로 검사해서 안전했다고 안전하다고 보장은 못합니다.
제가 아는 룰 한개만 넣었으니.
#!/usr/bin/ruby
# Simple WMF Exploit Detection
file_type = {
0 => “Memory”,
1 => “Disk”,
2 => “fjear”
}
if ARGV.length != 1
puts “USAGE: wmf_detect [file_to_detect]”
Kernel.exit
end
f = File.new(ARGV[0], “rb”)
print “File type: #{file_type[f.read(2).unpack(“v”)[0]]}\n”
print “Header size(9): ”
unless f.read(2).unpack(“v”)[0] == 9
print “Header size doesn’t match. Something went wrong!\n”
Kernel.exit
else
print “Confirmed\n”
end
print “Window Version Used: #{f.read(2).unpack(“v”)[0] == 0x0300 ? “Windows 3.0 or later” : “Unknown”}\n”
print “File Size: #{f.read(4).unpack(“V”)[0] * 2} bytes\n”
print “# of objects: #{num_records = f.read(2).unpack(“v”)[0]}\n”
print “Size of the largest record: #{f.read(4).unpack(“V”)[0]}\n”
print “Zero padding: ”
unless f.read(2).unpack(“v”)[0] == 0
print “Not a zero padding. Something went wrong!\n”
Kernel.exit
else
print “Confirmed\n”
end
puts “\nHere comes the #{num_records} records…\n\n”
infected = false
for i in 1..num_records
record_size = f.read(4).unpack(“V”)[0]
function_no = f.read(2).unpack(“v”)[0]
unless record_size – 4 ==0
f.read((record_size – 3) * 2) unless record_size – 3 < = 0
else
param = f.read(2).unpack("v")[0]
if function_no & 0x0026 == 0x0026 && param == 0x09
puts "INFECTED WMF!!!!!!"
puts "-" * 50
puts "Record Size: #{record_size} bytes"
puts "Function No: 0x#{function_no.to_s(16)}"
puts "Param[0]: 0x#{param.to_s(16)}"
puts "-" * 50
infected = true
break
else
f.read((record_size - 4) * 2) unless record_size - 4 <= 0
end
end
end
unless infected
puts "This is a safe file"
end
puts "\nScanning done."
f.close
[/code]