首页
社区
课程
招聘
mov edi,edi有什么特殊的意义吗?[求助]
发表于: 2007-3-26 14:02 7554

mov edi,edi有什么特殊的意义吗?[求助]

2007-3-26 14:02
7554
01003265  /$  8BFF          MOV EDI,EDI
01003267  |.  55            PUSH EBP
01003268  |.  8BEC          MOV EBP,ESP
0100326A  |.  33C0          XOR EAX,EAX
0100326C  |.  3945 08       CMP DWORD PTR SS:[EBP+8],EAX
0100326F  |.  74 06         JE SHORT magnify.01003277
01003271  |.  837D 08 02    CMP DWORD PTR SS:[EBP+8],2
01003275  |.  75 03         JNZ SHORT magnify.0100327A
01003277  |>  33C0          XOR EAX,EAX
01003279  |.  40            INC EAX
0100327A  |>  5D            POP EBP
0100327B  \.  C2 0400       RETN 4

――――――――――――――――――――――――――――――――
如题,不明白mov edi,edi的意义何在?
望高人指教,谢。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
个人理解,方便HOOK
2007-3-26 14:09
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
3
http://bbs.pediy.com/showthread.php?threadid=18863
2007-3-26 14:51
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
http://blog.xfocus.net/index.php?blogId=28
以前,就发现xp的sp2里面出现了一些怪怪的东西,今天要说的就是函数的prolog。你会发现在ntdll.dll中。



.text:7C80B664 ; Attributes: bp-based frame

.text:7C80B664

.text:7C80B664 ; BOOL __stdcall IsDBCSLeadByte(BYTE TestChar)

.text:7C80B664 public IsDBCSLeadByte

.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

.text:7C80B6AA ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?

.text:7C80B6AC dd 90909090h

.text:7C80B6B0 db 90h

.text:7C80B6B1 ; Exported entry 535. InitializeCriticalSectionAndSpinCount

.text:7C80B6B1

.text:7C80B6B1 ; 圹圹圹圹圹圹圹?S U B R O U T I N E ?







为了达到running patch的目的,看来MS不得不牺牲了很多空间啊!

还有一个问题了,为什么MS这么笨啊,用detour的技巧不就OK了。呵呵。大家仔细想想如果用detour的技巧一定会遇到一些麻烦的。1、必须suspend这个线程。2、多线程情况下,可能就会出错。所以不适用于做hot-patch!

又想了一下,我们的hook是否也多了一种手段呢,呵呵



这个解释经典。。。避免多线程下HOT PATCH出错。。。

如果按照这个思路,要想避免出错,就得先写入长跳转,然后写短跳转。。
2007-3-26 15:49
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
5
谢谢楼上几位大大。
似乎有点明白了,主要是TCL,没有往hook方面去想过。
另外我想知道为什么要用edi而不是用其他的通用寄存器呢?
这个有什么好点的理由吗?
2007-3-27 13:16
0
游客
登录 | 注册 方可回帖
返回
//