天天看点

逆向常见函数

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里面反编译出来的数组再也不用一个一个敲出来了 直接用这个函数把空格替换成逗号就行,是不是美滋滋。

继续阅读