数组
vbscript中数组由SAFEARRAY和SAFEARRAYBOUND结构体定义
SAFEARRAY:
1. typedef struct tagSAFEARRAY {
2. USHORT cDims; // 数组维数
3. USHORT fFeatures; // 数组特性
4. ULONG cbElements; // 每个元素大小
5. ULONG cLocks; // 锁定计数
6. PVOID pvData; // 实际数组数据指针
7. SAFEARRAYBOUND rgsabound[1]; // 数组下标相关信息
8. } SAFEARRAY;
SAFEARRAYBOUND:
typedef struct tagSAFEARRAYBOUND {
1. ULONG cElements; // 该维数数组大小,即元素个数
2. LONG lLbound; // 该维数数组索引的起始值
3. } SAFEARRAYBOUND, *LPSAFEARRAYBOUND;
完整版的variant
参考:https://docs.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-variant
dt VARIANT 005cfe98
UxTheme!VARIANT
+0x000 vt : 8
+0x002 wReserved1 : 0
+0x004 wReserved2 : 0xd2a4
+0x006 wReserved3 : 0x212
+0x008 llVal : 0n207683933920534092
+0x008 lVal : 0n48471628
+0x008 bVal : 0x4c 'L'
+0x008 iVal : 0n-25012
+0x008 fltVal : 3.344551015e-037
+0x008 dblVal : 8.7298524972645008e-295
+0x008 boolVal : 0n-25012
+0x008 scode : 0n48471628
+0x008 cyVal : tagCY
+0x008 date : 8.7298524972645008e-295
+0x008 bstrVal : 0x02e39e4c "hello"
+0x008 punkVal : 0x02e39e4c IUnknown
+0x008 pdispVal : 0x02e39e4c IDispatch
+0x008 parray : 0x02e39e4c tagSAFEARRAY
+0x008 pbVal : 0x02e39e4c "h"
+0x008 piVal : 0x02e39e4c -> 0n104
+0x008 plVal : 0x02e39e4c -> 0n6619240
+0x008 pllVal : 0x02e39e4c -> 0n30399761347838056
+0x008 pfltVal : 0x02e39e4c -> 9.275530847e-039
+0x008 pdblVal : 0x02e39e4c -> 1.246114697985077e-306
+0x008 pboolVal : 0x02e39e4c -> 0n104
+0x008 pscode : 0x02e39e4c -> 0n6619240
+0x008 pcyVal : 0x02e39e4c tagCY
+0x008 pdate : 0x02e39e4c -> 1.246114697985077e-306
+0x008 pbstrVal : 0x02e39e4c -> 0x00650068 "햿Ȃ햰Ȃմ???"
+0x008 ppunkVal : 0x02e39e4c -> 0x00650068 IUnknown
+0x008 ppdispVal : 0x02e39e4c -> 0x00650068 IDispatch
+0x008 pparray : 0x02e39e4c -> 0x00650068 tagSAFEARRAY
+0x008 pvarVal : 0x02e39e4c tagVARIANT
+0x008 byref : 0x02e39e4c Void
+0x008 cVal : 76 'L'
+0x008 uiVal : 0x9e4c
+0x008 ulVal : 0x2e39e4c
+0x008 ullVal : 0x02e1d770`02e39e4c
+0x008 intVal : 0n48471628
+0x008 uintVal : 0x2e39e4c
+0x008 pdecVal : 0x02e39e4c tagDEC
+0x008 pcVal : 0x02e39e4c "h"
+0x008 puiVal : 0x02e39e4c -> 0x68
+0x008 pulVal : 0x02e39e4c -> 0x650068
+0x008 pullVal : 0x02e39e4c -> 0x006c006c`00650068
+0x008 pintVal : 0x02e39e4c -> 0n6619240
+0x008 puintVal : 0x02e39e4c -> 0x650068
+0x008 pvRecord : 0x02e39e4c Void
+0x00c pRecInfo : 0x02e1d770 IRecordInfo
+0x000 decVal : tagDEC
调试用到的代码
整数:
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
dim a
a = &h1234
IsEmpty(a)
</script>
</body>
</html>
字符串时替换代码
dim d
d = "hello"
IsEmpty(d)
数组时替换代码
dim a(2)
a(0) = &h12345678
a(1) = &h87654321
IsEmpty(a)
(1)数字:直接在对应位置处
0:005> dd poi(esp+c) l4
01e79d30 00000002 00000000 00001234 00000000
0:005> dt VARIANT 01e79d30 vt uintVal
UxTheme!VARIANT
+0x000 vt : 2
+0x008 uintVal : 0x1234
(2)字符串:
0:005> dd poi(esp+c) l4
01d695b0 0000004a 01d4cfd4 000efd10 030bfc80
0:005> dt VARIANT 01d695b0 vt bstrVal
UxTheme!VARIANT
+0x000 vt : 0x4a
+0x008 bstrVal : 0x000efd10 "???"
0:005> dt VARIANT 0x000efd10 vt wReserved1 wReserved2 wReserved3 bstrVal
UxTheme!VARIANT
+0x000 vt : 8
+0x002 wReserved1 : 0
+0x004 wReserved2 : 0xcfd4
+0x006 wReserved3 : 0x1d4
+0x008 bstrVal : 0x030c32f4 "hello"
总结:当variant的结构为字符串的时候,其值存储在bstrVal 所指向的地址处```
(3)数组
```c
0:005> dd poi(esp+c) l4
01c885f0 0000600c 00000000 01c80ed8 02f85918
0:005> dt VARIANT 01c885f0 vt pparray
UxTheme!VARIANT
+0x000 vt : 0x600c
+0x008 pparray : 0x01c80ed8 -> 0x02f85918 tagSAFEARRAY
0:005> dt SAFEARRAY 0x02f85918
UxTheme!SAFEARRAY
+0x000 cDims : 1
+0x002 fFeatures : 0x892
+0x004 cbElements : 0x10
+0x008 cLocks : 0
+0x00c pvData : 0x030e2660 Void
+0x010 rgsabound : [1] tagSAFEARRAYBOUND
0:005> dd 0x030e2660 l4
030e2660 00000003 00000000 12345678 00000000
0:005> dd 0x030e2660+0x10 l4
030e2670 00000003 00000000 87654321 00000000