字符串处理函数通常会被编译器优化为内联函数,本文试分析VS2015下O2优化的strlen和strcpy的识别特征。
n = strlen(szHello);
00409EA2 8D 45 E8 lea eax,[szHello] ;取字符串首地址
00409EA5 83 C4 08 add esp,8 ;无关代码
00409EA8 8D 50 01 lea edx,[eax+1] ;首地址加1
00409EAB 0F 1F 44 00 00 nop dword ptr [eax+eax] ;作用不明
00409EB0 8A 08 mov cl,byte ptr [eax] ;逐个取字符
00409EB2 40 inc eax ;自增
00409EB3 84 C9 test cl,cl ;判断是否为'\0'
00409EB5 75 F9 jne main+30h (0409EB0h) ;do循环首
00409EB7 2B C2 sub eax,edx ;计算长度
strlen特征:
lea eax,[String]
lea edx,[eax+1]
未知语句
mov cl,[eax]
inc eax
test cl,cl
jne LoopBegin
sub eax,edx
strcpy(szBuff, szHello);
00409EA5 33 C0 xor eax,eax ;eax清0
00409EA7 66 0F 1F 84 00 00 00 00 00 nop word ptr [eax+eax] ;未知语句
00409EB0 8A 4C 05 D4 mov cl,byte ptr szHello[eax] ;逐个取字符
00409EB4 8D 40 01 lea eax,[eax+1] ;仅仅是让eax递增 为什么要用这句呢 是因为其他类型也适用吗 要不inc eax岂不是更快
00409EB7 88 4C 05 E7 mov byte ptr [ebp+eax-19h],cl ;逐个赋值
00409EBB 84 C9 test cl,cl
00409EBD 75 F1 jne main+30h (0409EB0h)
strcpy特征 :
xor eax,eax
未知语句
mov cl,String[eax]
lea eax,[eax+1]
mov [ebp+eax-ArraryLength],cl
test cl,cl
jne LoopBegin