;原函数作者为Agner Fog,出处为MASM32开发包,在此表示感谢。 ;中文注释修改&添加 By 老刘。 .486 .model flat, stdcall option casemap :none .code OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE align 4 StrLen proc item:DWORD mov eax, [esp+4] ;获得参数item,即字符串指针 lea edx, [eax+3] ;edx=指针+3 push ebp ;备份ebp edi push edi mov ebp, 80808080h @@: REPEAT 3 mov edi, [eax] ;edi=读4个字节 add eax, 4 ;字符串指针指到下4个字节起始,即+4 lea ecx, [edi-01010101h] ;ecx=四字节每个字节-1 not edi ;edi=四字节逻辑取反 and ecx, edi ;ecx=取反后的每个字节和没取反后-1的每个字节进行逻辑与 and ecx, ebp ;判断每个字节的二进制第8位是否为1,为1则说明原字节=0 jnz nxt ;如果出现了一个null异端,跳到nxt继续判断 ENDM mov edi, [eax] ;和上面的一样 add eax, 4 lea ecx, [edi-01010101h] not edi and ecx, edi and ecx, ebp jz @B ;如果没有异端,回去上面循环,有的话都不用跳了,下面就是nxt nxt: test ecx, 00008080h ;测试null是否在前2个字节中 jnz @F shr ecx, 16 ;不在前2字节,ecx右移16个二进制位,即右移2字节,使原来的第3、4字节移位到1、2字节处。 add eax, 2 ;字符串指针+2 @@: shl cl, 1 ;第一个字节逻辑左移1位,如果第一个字节为Null,则CF=1,否则即说明第二个字节为Null sbb eax, edx ;eax=eax-edx-CF=eax-(item+3)-CF=字符串长度 pop edi pop ebp ret 4 StrLen endp OPTION PROLOGUE:PrologueDef OPTION EPILOGUE:EpilogueDef end
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
Lthis 这是要出系列的节奏啊,顶一个!!!
junkboy 等待002
老刘NoOne 附一个效率比较:070K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6X3L8%4u0#2L8g2)9J5k6i4m8Z5M7q4)9K6c8X3#2G2k6q4)9K6c8s2u0W2k6r3W2J5k6h3y4@1i4K6t1$3j5h3#2H3i4K6y4n7j5h3#2H3i4K6y4n7k6$3!0@1L8#2)9K6c8r3k6A6L8X3c8H3L8%4y4@1i4K6t1$3j5h3#2H3i4K6y4n7j5h3#2H3i4K6y4n7M7s2c8A6k6q4)9K6c8o6M7#2z5o6l9@1z5q4)9J5y4X3q4E0M7q4)9K6b7R3`.`. ...
咖啡_741298 老刘NoOne 附一个效率比较:0e9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3f1#2x3Y4m8G2K9X3W2W2i4K6u0W2j5$3&6Q4x3V1k6X3L8%4u0#2L8g2)9J5k6i4m8Z5M7q4)9K6c8X3#2G2k6q4)9K6c8s2u0W2k6r3W2J5k6h3y4@1i4K6t1$3j5h3#2H3i4K6y4n7j5h3#2H3i4K6y4n7j5h3#2H3i4K6y4n7k6$3!0@1L8#2)9K6c8l9`.`. ...