.text:7C80B664 IsDBCSLeadByte proc near ; CODE XREF: sub_7C80F926+1119Cp
.text:7C80B664 ; sub_7C821CF6+C0p ...
.text:7C80B664
.text:7C80B664 TestChar = byte ptr 4
.text:7C80B664
.text:7C80B664 mov edi, edi
.text:7C80B666 push ebp
.text:7C80B667 mov ebp, esp
.text:7C80B669 mov eax, dword_7C8836D0
.text:7C80B66E test eax, eax
.text:7C80B670 jz loc_7C84AF1C
.text:7C80B676 mov eax, [eax+18h]
看上去mov edi, edi一点用也没有啊,简直就是废话嘛!相当于2个字节的nop,后来才发现原来是用于运行时patch,这样2个字节足以做到一个短跳转,这样打了系统补丁就不需要再重启了,但是。。。。两个字节的短跳转能做什么呀,可以用来跳到长跳转,长跳转需要5个字节。我可以给你很简单的证据,你可以disassemble一下就会发现,下面给你看得是kernel32.dll的例子。在函数之间都有很多nop,他们就是用来这个的干活。
.text:7C80B690 push [ebp+arg_4]
.text:7C80B693 call ds:RtlIsDosDeviceName_U
.text:7C80B699 test eax, eax
.text:7C80B69B jnz loc_7C83CF80
.text:7C80B6A1 push edi
.text:7C80B6A2 call sub_7C80937B
.text:7C80B6A7 or eax, 0FFFFFFFFh
.text:7C80B6AA jmp short loc_7C80B658
.text:7C80B6AA ; END OF FUNCTION CHUNK FOR GetFileAttributesW