菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。
最近剖析Internet Explorer历史破绽,遂对VBScript剧本剖析引擎举行研究,详细环境如下:
- OS版本:Windows 7 Service Pack 1
- Internet Explorer版本:8.0.7601.17514
- vbscript.dll版本:5.8.7601.17514
0x01 变量
VBScript中仅有一种数据类型——Variant。其结构界说如下:
typedef struct tagVARIANT {
union {
struct {
VARTYPE vt;
WORD wReserved1;
WORD wReserved2;
WORD wReserved3;
union {
LONGLONG llVal;
LONG lVal;
BYTE bVal;
SHORT iVal;
FLOAT fltVal;
DOUBLE dblVal;
VARIANT_BOOL boolVal;
VARIANT_BOOL __OBSOLETE__VARIANT_BOOL;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
IUnknown *punkVal;
IDispatch *pdispVal;
SAFEARRAY *parray;
BYTE *pbVal;
SHORT *piVal;
LONG *plVal;
LONGLONG *pllVal;
FLOAT *pfltVal;
DOUBLE *pdblVal;
VARIANT_BOOL *pboolVal;
VARIANT_BOOL *__OBSOLETE__VARIANT_PBOOL;
SCODE *pscode;
CY *pcyVal;
DATE *pdate;
BSTR *pbstrVal;
IUnknown **ppunkVal;
IDispatch **ppdispVal;
SAFEARRAY **pparray;
VARIANT *pvarVal;
PVOID byref;
CHAR cVal;
USHORT uiVal;
ULONG ulVal;
ULONGLONG ullVal;
INT intVal;
UINT uintVal;
DECIMAL *pdecVal;
CHAR *pcVal;
USHORT *puiVal;
ULONG *pulVal;
ULONGLONG *pullVal;
INT *pintVal;
UINT *puintVal;
struct {
PVOID pvRecord;
IRecordInfo *pRecInfo;
} __VARIANT_NAME_4;
} __VARIANT_NAME_3;
} __VARIANT_NAME_2;
DECIMAL decVal;
} __VARIANT_NAME_1;
} VARIANT;
其中VARTYPE
可参阅Microsoft Docs——VARIANT Type Constants。例:
'显式声明
Dim Name,Age,Hex,Pi
Name="Ethon"
Age=27
Hex=&h80000000
Pi=3.1415926
'隐式声明
Hello="ABC123"
赋值对应函数为vbscript!AssignVar
,于该函数处设断,查看其参数:
0x400C
示意VT_VARIANT
:
判断pvargSrc—>vt
值(详细数值可自行剖析,不赘述),若均不知足,执行如下语句:
简朴来说,即VariantCopyInd(&pvarDest, pvargSrc)
——>copy pvarDest
to pvarg
:
隐式声明变量其pvarg
全为零:
0x02 数组
数组存储结构由SAFEARRAY
界说:
typedef struct tagSAFEARRAY {
USHORT cDims;
USHORT fFeatures;
ULONG cbElements;
ULONG cLocks;
PVOID pvData;
SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY;
其中各字段寄义可参阅Microsoft Docs——SAFEARRAY,SAFEARRAYBOUND
结构界说如下:
typedef struct tagSAFEARRAYBOUND {
ULONG cElements;
LONG lLbound;
} SAFEARRAYBOUND, *LPSAFEARRAYBOUND;
数组界说及赋值操作:
Dim stu_name(3)
stu_name(0)="Alan"
stu_name(1)="Susan"
stu_name(2)="Lisa"
stu_name(3)="Mary"
VBS中数组下标由0更先,数组元素个数为n+1(Dim array_name(n)
)。另一种界说数组方式:
Dim stu_name
stu_name=Array("Alan","Susan","Lisa","Mary")
对应函数为vbscript!MakeArray
:
通报给函数的参数有二——cDims
对应维数,VAR
对应n。cDims
应介于1-64:
先来看一维数组的确立:
为rgsabound
结构各字段赋值:
之后则直接挪用SafeArrayCreate
函数举行确立,各参数寄义可参阅Microsoft Docs——SafeArrayCreate。确立完成:
为数组元素赋值则直接将该元素所在内存偏移通报给vbscript!AssignVar
:
下面来看看二维数组(Dim stu_name(2,3)
)确立历程:
,菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。
可以看到数组各维巨细于内存中并列存储,之后挪用VAR::PvarGetTypeVal
逐一读取为rgsabound
中cElements
字段赋值:
各维巨细于内存中由更高维——>更低维存储,故读取时首先盘算出v3
变量指向更低维巨细所在内存偏移,之后递减。确立完成:
Redim
语句用于重新界说数组巨细:
'界说一维动态数组
Dim MyArray()
'重新界说该数组巨细
ReDim MyArray(3)
MyArray(0) = "A"
MyArray(1) = "B"
MyArray(2) = "C"
MyArray(3) = "C"
再次挪用vbscript!MakeArray
历程如下:
而在重新界说时加上Preserve
要害字用于保留之前元素:
Dim MyArray()
ReDim MyArray(3)
MyArray(0) = "A"
MyArray(1) = "B"
MyArray(2) = "C"
MyArray(3) = "D"
ReDim Preserve MyArray(5)
MyArray(4) = "E"
MyArray(5) = "F"
其对应vbscript!RedimPreserveArray
函数:
为psaboundNew
各字段赋值完成后通报给SafeArrayRedim
函数:
0x03 可用于调试时函数
IsEmpty(var)
对应vbscript!VbsIsEmpty
,其第三个参数对应var
。一例:
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
dim a
a = &h1234
IsEmpty(a)
</script>
</body>
</html>
IsObject(var)
对应vbscript!VbsIsObject
,同样,其第三个参数对应var
。一例:
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
dim a
a = &h1234
IsObject(a)
</script>
</body>
</html>
在调试时可借助这两个函数以确定变量值或内存位置。
0x04 VarType函数
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
dim a
a = &h1234
VarType(a)
</script>
</body>
</html>
VarType
对应vbscript!VbsVarType
,其挪用GetVarType
函数获取类型值并完成赋值操作:
参数1用于存储类型值,参数2为VarType
参数:
GetVarType
函数挪用PvarGetVarVal
——判断类型值是否为0x4A
或0x0C
:
之后与0x09
举行对照,若不是则直接返回工具进而获取vt
值:
由VbsVarType
函数完成最终赋值给参数1操作:
0x05 LenB函数
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
On Error Resume Next
Dim length,a
a=1.12345678901235
length=LenB("Hello")
length=LenB(a)
</script>
</body>
</html>
该函数用于返回存储字符串字节巨细,其对应vbscript!VbsLenB
。参数为字符串时,该函数先是call VAR::BstrGetVal
,返回pbstrVal
:
之后call cbLengthBstr
返回长度:
参数为变量时, VAR::BstrGetVal
函数挪用VAR::PvarConvert
,将其内容转换为字符串:
之后再举行盘算:
cbLengthBstr
函数功效仅是读取字符串存储位置之前4字节内容,该内容为字符串长度:
0x06 参阅链接
- Microsoft Docs——SAFEARRAY structure
- Microsoft Docs——VARIANT structure
- Microsoft Docs——VARIANT Type Constants
- Microsoft Docs——SafeArrayCreate
- Microsoft Docs——DECIMAL structure
电银付安装教程(dianyinzhifu.com)是官方网上推广平台。在线自动销售电银付激活码、电银付POS机。提供电银付安装教程、电银付使用教程、电银付APP使用教程、电银付APP安装教程、电银付APP下载等技术支持。面对全国推广电银付加盟、电银付大盟主、电银付小盟主业务。很好嘛