婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > VBS字符串的內部實現

VBS字符串的內部實現

熱門標簽:打電話的外呼系統貴不貴 新密防封卡外呼系統違法嗎 百度地圖標注怎么卸載 外呼營銷下單系統 海外美發店地圖標注 陜西高頻外呼回撥系統哪家好 加盟電銷機器人好的品牌 前鋒辦理400電話申請 辦理膠州400電話財稅
最近對 VBS 字符串 Chr(0) 注①截斷討論得比較多,看來有必要介紹一下 VBS 字符串的內部實現。Demon 友情提示:本文需要一些 C 語言和 Windows 編程的知識,VBScript 初學者慎入。

VBS 是基于微軟的 ActiveX/COM 技術實現的,而 COM 對象為了做到支持任何語言,定義了一系列通用的數據類型,微軟稱之為自動化對象類型(Automation data types),其中之一就是 BSTR。VBS 在內部是以 BSTR 來表示字符串的,BSTR 在 WTypes.h 中定義:
復制代碼 代碼如下:

typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR *BSTR;

從定義可以看出,BSTR 是指向 wchar_t 類型(也就是 C 語言中的 Unicode)的指針,但是 BSTR 并不是普通的 wchar_t 指針。標準 BSTR 指向一個有長度前綴和 NUL 結束符的 wchar_t 數組。BSTR 的前4字節是一個表示字符串長度的前綴。BSTR 長度域的值是字符串的字節數,并且不包括 NUL 結束符。常用的 BSTR 處理函數請參考 MSDN 文檔。

理論說的有點抽象,下面用代碼來說明:

復制代碼 代碼如下:

str = "Hello" Chr(0) "world"

這是一句很簡單的 VBS 代碼,但是 VBScript 解釋器在內部做了什么呢?其實就是初始化了一個 BSTR 變量(不考慮字符串連接過程):
復制代碼 代碼如下:

/* 僅僅為了演示,實際代碼肯定不是這樣的 */
BSTR str = SysAllocStringLen(L"Hello\0world", 11);為了更清楚地了解 BSTR 的結構,我們換一種寫法:

/* BSTR 包含長度前綴,但是卻實際指向第一個字符 */
wchar_t arr[] = {22,0,'H','e','l','l','\0','w','o','r','l','d','\0'};
BSTR str = arr[2];這個 BSTR 在內存中的結構為:

00000000 16 00 00 00 48 00 65 00 6C 00 6C 00 6F 00 00 00
00000010 77 00 6F 00 72 00 6C 00 64 00 00 00

橙色表示四個字節的長度前綴。紅色高亮表示 BSTR 指針的當前指向,藍色高亮表示字符串中的 Chr(0) 字符,綠色高亮表示 BSTR 的結束字符 NUL(該字符是 SysAllocStringLen 函數加上去的,因為是 Unicode,所以要占兩個字節)。也就是說,如果不考慮前面四個字節,BSTR 就是 C 語言中的 null-terminated string。

再看一段 VBS 代碼:

MsgBox Len(str)用 MsgBox 來顯示剛才定義的字符串長度,VBScript 解釋器內部又做了什么呢?是不是像 C 語言標準庫函數 strlen 一樣,遍歷整個字符串,以 NUL 作為字符串結束的標識呢?
復制代碼 代碼如下:

/* C語言 strlen 函數的簡單實現 */
size_t strlen (const char * str)
{
const char *eos = str;
while( *eos++ ) ;
return( (int)(eos - str - 1) );
}

答案顯然是否定的,因為字符串中含有 Chr(0),如果像 strlen 這樣實現,那么就會被 Chr(0) 截斷,Len 函數應該返回5才對,然而實際上返回的是11這個正確的數字。

VBS 的 Len 函數內部應該是這么實現的:
復制代碼 代碼如下:

/* 同上,僅為演示 */
size_t Len(const BSTR str)
{
return SysStringLen(str);
}

或者不調用 Windows API,由于 BSTR 前4個字節前綴表示字符串的字節數(不包括結尾的 BUL 字符),所以只要移動一下指針就行了:
復制代碼 代碼如下:

/* 強制轉換成int指針減一后讀取,然后除以2(一個Unicode字符兩字節) */
size_t Len(const BSTR str)
{
return *((int *)str - 1) / 2;
}

可以看出,由于 BSTR 的長度可以通過前綴取得,并不需要以 NUL 來作為字符串結束符,也就是說,VBS 字符串是 binary safe (二進制安全)的。

那么為什么下面的代碼只能顯示 Hello 呢?

MsgBox str這看起來好像和上面說的矛盾,其實不然。VBS 字符串的確是兼容 Chr(0) 字符的,MsgBox 之所以會被 Chr(0) 截斷,是因為 MsgBox 在內部調用了 MessageBox 函數,而該函數是以 NUL 作為字符串結束符的。
復制代碼 代碼如下:

/* 簡單起見只實現一個參數
* MessageBox 的第二個參數是以 NUL 作為結束符的
* Pointer to a null-terminated string that contains the message to be displayed.
* 所以 VBS 字符串中包含的 Chr(0) 會把字符串截斷
*/
int MsgBox(const BSTR str)
{
return MessageBoxW(NULL, str, L"", 0);
}

也就是說,如果 VBS 內置的函數或者 COM 組件的某些方法在其內部實現中調的 Windows API 的字符串參數是以 NUL 作為結束符的話,就會被 Chr(0) 字符截斷。

現在再去看《ASP/VBScript中CHR(0)的由來以及帶來的安全問題》、《ASP上傳漏洞之利用CHR(0)繞過擴展名檢測腳本》、《ASP缺陷—-一個特殊字符chr(0)》、《用Python腳本寫ASP頁面》,應該就不會有疑問了吧。

時間關系就不再展開了,如果你想了解更多關于 COM 組件的知識,我推薦你拜讀一下 Jeff Glatt 的神作《COM in plain C》。

僅以此文回答雨中風鈴的問題。

注①:本文中 Chr(0) 和 NUL 交替使用,表示同一個意思。

原文: http://demon.tw/programming/vbs-file-unicode.html

您可能感興趣的文章:
  • zend studio 快捷鍵收集
  • java中Servlet處理亂碼的方法
  • Zend Studio 實用快捷鍵一覽表(精心整理)
  • zend stdio8.0 快捷鍵匯總集合

標簽:武威 阜陽 咸陽 伊春 河南 四平 梅州 牡丹江

巨人網絡通訊聲明:本文標題《VBS字符串的內部實現》,本文關鍵詞  VBS,字符串,的,內部,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《VBS字符串的內部實現》相關的同類信息!
  • 本頁收集關于VBS字符串的內部實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品午夜春色av| 日韩欧美国产小视频| 国产精品久久久久婷婷| 欧美视频一区二区三区| av在线综合网| 成人福利视频在线| 久久国产婷婷国产香蕉| 樱桃视频在线观看一区| 精品国产免费一区二区三区四区 | 狠狠色丁香久久婷婷综合_中| 日韩一级完整毛片| 欧美日韩国产精选| 99re成人在线| 欧美日韩一区二区欧美激情| 色噜噜夜夜夜综合网| 欧美色爱综合网| 欧美精品xxxxbbbb| 日韩一区二区三区三四区视频在线观看 | 美女视频免费一区| 日韩成人免费在线| 韩国欧美一区二区| 91免费国产在线| 欧美伦理影视网| 久久久精品综合| 日韩理论片中文av| 捆绑调教美女网站视频一区| 国产美女主播视频一区| 在线视频欧美精品| 久久综合久久久久88| 亚洲一区自拍偷拍| 美女脱光内衣内裤视频久久网站| 国产精品1区2区3区| 91精品91久久久中77777| 日韩一区二区三区av| 国产精品大尺度| 久久99精品久久久| 3d动漫精品啪啪一区二区竹菊| 国产女同互慰高潮91漫画| 亚洲一区二区三区影院| 成人激情免费电影网址| 日韩欧美国产高清| 免费观看一级欧美片| 欧美日韩国产一区二区三区地区| 中文字幕精品一区二区精品绿巨人| 男人操女人的视频在线观看欧美| 色婷婷久久久久swag精品| 综合色天天鬼久久鬼色| 懂色av一区二区三区蜜臀| 精品黑人一区二区三区久久| 国产午夜精品美女毛片视频| 国产精品77777竹菊影视小说| 久久五月婷婷丁香社区| 黑人巨大精品欧美黑白配亚洲| 这里只有精品视频在线观看| 亚洲bt欧美bt精品777| 3d动漫精品啪啪1区2区免费| 天涯成人国产亚洲精品一区av| 在线精品观看国产| 国产自产视频一区二区三区 | aa级大片欧美| 亚洲v中文字幕| 久久久久久一级片| 色综合久久88色综合天天免费| 亚洲成人免费在线| 337p粉嫩大胆色噜噜噜噜亚洲| 国产成人一区二区精品非洲| 亚洲丝袜精品丝袜在线| 欧美三级资源在线| 国产一区二区三区不卡在线观看| 中文字幕在线不卡| 在线综合+亚洲+欧美中文字幕| 美女任你摸久久| 亚洲精品第一国产综合野| 精品999久久久| 欧美影视一区在线| 国产成人精品一区二| 日韩电影一区二区三区四区| 国产精品国产馆在线真实露脸 | 91九色02白丝porn| 成人黄色小视频在线观看| 久久99久久99小草精品免视看| 一区二区三区**美女毛片| 国产亚洲精品久| 欧美一级一区二区| 欧美丰满一区二区免费视频 | 国产一区二区三区在线看麻豆| 亚洲精品va在线观看| 国产亚洲一区二区三区在线观看| 日韩欧美一级特黄在线播放| 色综合久久综合网| 免费成人结看片| 日韩在线观看一区二区| 亚洲国产精品久久一线不卡| 亚洲自拍偷拍av| 亚洲国产精品久久久男人的天堂 | 日韩欧美色综合网站| 欧美揉bbbbb揉bbbbb| 在线观看91视频| 欧美一区二区高清| 国产欧美一区二区三区鸳鸯浴| 久久夜色精品国产噜噜av | 国产亚洲欧洲一区高清在线观看| 久久久国际精品| 亚洲美女视频一区| 韩国av一区二区| 欧美在线视频不卡| 精品1区2区在线观看| 亚洲最大色网站| 美国三级日本三级久久99| 9色porny自拍视频一区二区| 日韩午夜在线观看| 亚洲福利一区二区三区| 成人v精品蜜桃久久一区| 日韩欧美一二三区| 日韩av中文在线观看| 91福利小视频| 国产精品乱子久久久久| 九一久久久久久| 欧美日韩国产一二三| 国产精品免费久久| 天天影视色香欲综合网老头| 国产综合色视频| 国产高清久久久| 欧美丝袜第三区| 国产精品天天看| 蜜臀精品久久久久久蜜臀| 99在线精品一区二区三区| 欧美一区二区视频在线观看2022 | 中文字幕一区av| 久久97超碰国产精品超碰| 91一区一区三区| 精品欧美一区二区在线观看 | www.视频一区| 精品精品国产高清一毛片一天堂| 国产精品久久久久7777按摩| 国模娜娜一区二区三区| 欧美精品久久一区| 一级精品视频在线观看宜春院| 国产电影精品久久禁18| 精品久久久久久久久久久久久久久| 亚洲一区二区在线播放相泽| 亚洲国产成人私人影院tom| 黄色日韩三级电影| 久久亚洲综合色| 日精品一区二区| 欧美一区二区三区在线观看视频 | 欧美tk—视频vk| 精品影视av免费| 欧美日韩在线亚洲一区蜜芽| 一区二区三区在线影院| 欧美自拍丝袜亚洲| 日韩精品中文字幕在线一区| 五月天一区二区| 久久久久国产精品免费免费搜索| 裸体健美xxxx欧美裸体表演| 精品国产123| 91浏览器在线视频| 6080日韩午夜伦伦午夜伦| 国产在线精品一区二区| 中文字幕在线一区二区三区| 国产丝袜在线精品| 91美女福利视频| 美美哒免费高清在线观看视频一区二区| 日韩美一区二区三区| av电影一区二区| 免费在线观看视频一区| 久久夜色精品一区| 欧洲精品中文字幕| 国精产品一区一区三区mba视频| 中文字幕亚洲不卡| 久久青草欧美一区二区三区| 91在线国产观看| 久久99最新地址| 日本欧美一区二区| 中文字幕日本不卡| 欧美va亚洲va国产综合| 91麻豆精品国产91久久久更新时间 | 日韩精品午夜视频| 93久久精品日日躁夜夜躁欧美| 日韩精品成人一区二区在线| 一区二区欧美在线观看| 日本精品一区二区三区高清| 99久久综合狠狠综合久久| 日本vs亚洲vs韩国一区三区| 亚洲bdsm女犯bdsm网站| 亚瑟在线精品视频| 日韩**一区毛片| 蜜臀av一区二区在线观看| 亚洲高清视频中文字幕| 日日摸夜夜添夜夜添精品视频 | 欧美日韩三级在线| 日韩专区一卡二卡| 大陆成人av片| 国产亚洲综合在线| 国产精品综合视频| 亚洲一区二区在线视频| 欧美成人高清电影在线| 丝袜美腿成人在线| 91精品久久久久久久91蜜桃| 美国十次了思思久久精品导航|