wsclen函数是用于获得字符串长度的函数,准确地说,是用于获得UNICODE字符串长度的函数,其界定如下所示:
该界定源自MSDN。wcslen()函数的实际用法,这儿也不开展讲解了,关键看它的反汇编编码完成。
用OD开启一个自身写的程序,这一程序里运用了UNICODE字符串数组,也采用了wsclen()函数来测算UNICODE字符串数组函数的长短,随后在OD中的wsclen()函数处设定中断点,运作程序。当程序启用wcslen()函数时,OD会被终断,各自查询OD的反汇编对话框、转存窗口(也称数据信息对话框)和栈窗口,如下图1、图2和图3所显示。
图1 反汇编对话框
图2 转存窗口
图3 栈对话框
从图 3 中可以看得出,wcslen()函数的基本参数是“c:\windows\system32\notepad.exe”这一UNICODE字符串数组。图2中展现了wcslen()函数主要参数的运行内存状况。图1是wcslen()函数的反汇编编码。
wcslen()函数的反汇编代码如下所示:
在OD中应用F8断点调试到77C17FD4详细地址处,查询存储器eax的值。eax的值储存的是wcslen()函数的主要参数。实际上根据“mov eax, dword ptr [ebp 8]”就可以看得出eax被取值为wcslen()函数的变量值。
上边3句反汇编编码是eax详细地址处的2字节数的內容取值给cx存储器,随后将eax的详细地址持续加2次1。
上边2句反汇编编码是检测cx中的信息是不是为0。UNICODE字符串数组是以2个0来开展末尾的。假如不以完毕得话,表明都还没到UNICODE字符串数组的末尾,那麼就自动跳转到77C17FD4详细地址处,再度实行“mov cx, word ptr [eax]”命令。这一循环系统是逐一解析xmlUNICODE字符串数组,直到字符串完毕才行。
当上边的循环系统解析xml详细个UNICODE字符串数组后,eax的值偏向了字符串数组末尾的2个0后边的详细地址部位。由于从77C17FD4到77C17FD8这三个详细地址处的编码可以看得出,该函数是先取字符串数组中的內容,再改动UNICODE表针的详细地址。那样当得到字符串数组的末尾详细地址后,再改动字符串数组表针详细地址,则表针会偏向字符串数组末尾的2个0后边的详细地址。
在77C17FDE处,将eax的地址(也就是字符串数组末尾2个0后边的详细地址)减掉字符串数组的开始详细地址,就获得字符串数组所占有的运行内存字节。在计算机系统中,二进制位偏移一位,等同于乘2;偏移一位,等同于除于2。在77C17FEl中,sar命令是将目地操作数开展偏移计算。“sar eax, 1”是将eax中的值除于2,并将結果存放在eax中。字符串数组用UNICODE方法开展储存,1字符占有2字节数,那麼将所占有的运行内存数除于2也就获得了字符串数组的标识符数量。而“dec eax”的功能是将eax的值减一,将結果存放在eax中。
最终,完成一个wcslen()函数。为了更好地使其看上去像反汇编编码,将其写的略微繁杂些,详细如下: