好友
阅读权限10
听众
最后登录1970-1-1
|
最近在学习逆向。但是调试crackme中的VB代码时候,最烦的人就是VB字符串,因为地址不是直接指向。所以调试时候很麻烦。
调试过程中,突然想分析VB字符串在内存中布局。我一开始猜测是不是,VB字符串内存布局按照: 4byte的字符串长度+4byte位置用途 + 字符串地址指针。
因为我C++用的多一点,就是按照c++ string来猜测的。
我调试到了第31个,cracking4all中,有突然发现为啥进去的数字,出来的字符串。
和自己一开始对字符串的内存布局不匹配,然后我跟进去VB的函数里面调试了一下。突然发现吧在比较 前两个字节,而且比较的数字还比较特别。
貌似是COM中,常用的VARIANT. 然后我仔细调试了,发现果然是。发个帖,记录一下自己调试心得.
其中VARTYPE 值如下
typedef enum { VT_EMPTY = 0, VT_NULL = 1, VT_I2 = 2, VT_I4 = 3, VT_BOOL = 11, VT_VARIANT = 12, VT_I1 = 16, VT_UI1 = 17, VT_UI2 = 18, VT_UI4 = 19, VT_I8 = 20, VT_UI8 = 21, VT_LPWSTR = 31, VT_BLOB = 65, VT_CLSID = 72, VT_VECTOR = 0x1000, } VARENUM;
下面是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; |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|