movzx eax, byte ptr [ebp+var_28+2] -> BYTE2(v20)
那么BYTE2(v20)就是从v20开始的第2个字节,即v20[2]。
v1 = (wchar_t *)operator new;
v2 = a1;
do
{
v3 = *v2;
(__int16 )((char )v2 + (char )v1 - (char *)a1) = *v2;
++v2;
}
while ( v3 );
result = 0;
if ( wcslen(v1) == 25 && v1[4] == 123 && v1[8] == 95 && 95 == v1[10] && 95 == v1[15] && v1[24] == 125 )
{
wcstok(v1, L”{_}”);
v4 = wcstok(0, L”{_}”);
if ( (_DWORD )v4 == 6815860 && v4[4] == 52 )
{
v5 = wcstok(0, L”{_}”);
v6 = wtoi(v5);
if ( v6 >> 1 == v6 - 2 )
{
v7 = wcstok(0, L”{_}”);
if ( sub_401000(v7) )
{
v8 = wcstok(0, L”{_}”);
if ( sub_401180(v8) )
result = 1;
L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节,详情见[这里写链接内容](https://zhidao.baidu.com/question/1603990754796413147.html)
wcslen():
strlen返回的是字节数(对中英文不一致,中文占两个字节,不包括’/0’),而wcslen返回的是字符数(对中英文一致)。而sizeof返回的是字节数(包含’/0’,而’/0’在Unicode下也是占两个字节的)细节详情见 http://blog.csdn.net/zim3oo/article/details/60331673
宽字符处理函数:为什么要专门定义这些函数呢?最根本的原因是,ANSI下的字符串都是以’\0’来标识字符串尾的(Unicode字符串以“\0\0”结束),许多字符串函数的正确操作均是以此为基础进行。而我们知道,在宽字符的情况下,一个字符在内存中要占据一个字的空间,这就会使操作ANSI字符的字符串函数无法正确操作。 宽字符处理函数wcstok() 相当于单字符处理函数strtok() 根据标示符把宽字符串分解成一系列字符串 详情见http://blog.csdn.net/netanimals/article/details/7337159
下面引自百度百科:
-
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok(“abc,def,ghi”,”,”),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。 strtok的函数原型为char *strtok(char *s, char
*delim),功能为“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting
point. ”
翻译成汉语就是:作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。详情https://baike.baidu.com/item/strtok/5522728?fr=aladdin
是不是涨了姿势(^▽^) 破解的时候ida里面反编译出来的数组再也不用一个一个敲出来了 直接用这个函数把空格替换成逗号就行,是不是美滋滋。