DQQQQQ 发表于 2021-2-5 15:43

VB逆向中字符串处理

最近在学习逆向。但是调试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;
页: [1]
查看完整版本: VB逆向中字符串处理