函数开始处的MOV EDI, EDI的作用收藏

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑 本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。 阅读详情

函数开始处的MOV EDI, EDI的作用收藏


BYTE JMP[10] = {0x8b,0xFF, 0x55, 0x8b, 0xEC, 0xE9, 0x00, 0x40/0x00, 0x00, 0x00};
Posted on 2009-04-01 11:19  S.l.e!ep.¢% 阅读(631)  评论(0)   编辑  收藏  引用 所属分类:  Reverse Engineering 
调试程序调试到系统库函数的代码时,总会发现系统函数都是从一条 MOVEDI,  EDI指令开始的,紧接着这条指令下面才是标准的建立函数局部栈的代码。对系统DLL比如ntdll.dll进行反汇编,可以发现它的每个导出函数都是如此,并且每个导出函数开始处的 MOVEDI,  EDI上面紧接着5条NOP指令。比如在WinDbg中查看TextOutA周围的代码: 
0:000> u TextOutA-0x0a L 10 
GDI32!NtGdiTransparentBlt+0xa: 
77efc43f ff12            call    dword ptr [edx] 
77efc441 c22c00          ret     2Ch 
77efc444 90              nop 
77efc445 90              nop 
77efc446 90              nop 
77efc447 90              nop 
77efc448 90              nop 
GDI32!TextOutA: 
77efc449 8bff            mov     edi,edi
77efc44b 55              push    ebp 
77efc44c 8bec            mov     ebp,esp 
很明显,两个字节的 MOVEDI, EDI指令什么事情也不做,那么,就有两个问题:第一,为什么不直接从函数体开始而要从这条什么都不做的指令开始呢?第二,即使需要在函数一开始空出两个字节,为什么不直接使用两条NOP指令,而要使用这条 MOV指令呢?在网上查阅一些资料后,得到了答案: 
对于第一个问题,答案是为了实现hot-patching技术,即运行时修改一个函数的行为。修改过程如下:把 MOVEDI,  EDI修改为一条短跳转指令(一条短跳转指令恰好两个字节),把 MOVEDI,  EDI上面的五个NOP修改为一条长跳转指令(一条长跳转指令恰好五个字节),短跳转指令跳到长跳转指令上,长跳转指令跳到修改后的函数体上。 
对于第二个问题,答案是为了提高效率。执行一条 MOV指令比执行两条NOP指令花费更少的时间。 
  
下面是在网上搜索到的相关资料: 
http://blogs.msdn.com/ishai/archive/2004/06/24/165143.aspx
在这篇日志中作者指出这是一种实现hot-patching和hot-fix的技术,而且解释了为什么不使用detours技术来实现hot-patching。此外,作者提到了具体是如何使用这种技术来实现hot-patching的,但是只是一句话带过。 
  
http://msmvps.com/blogs/kernelmustard/archive/2005/04/25/44413.aspx
这篇文章中作者从效率和其它方面详细解释了为什么选择用这种技术来实现hot-patching以及为什么要这样实现(短跳转加长跳转而不是一次性长跳转)。 
  
http://xelf.info/knowledge/MemoryCopy.cpp
这里给出了具体的memcpy的C语言源代码。如果在安装VC6的时候选择了安装CRT源代码,则在VC安装目录的SRC/INTEL/目录中有memcmp.asm等文件,它们就是对应的CRT函数的源代码,这些源代码中也都有详细的注释。 
  
另外,在自己的日志 http://blog.youkuaiyun.com/jcwKyl/archive/2008/03/25/2217428.aspx里面,曾经对strcmp函数中的 MOVEDI,  EDI指令感到困惑,其实只要看看strcmp.asm中的源代码就可以明白,那条 MOVEDI,  EDI完全是为了内存四字节对齐的。源代码中写的是align 4,在运行时,如果需要一个填充字节,则会填充一条NOP指令,如果需要两个字节来填充,则会填充一条 MOVEDI,  EDI指令,之所以不用两条NOP,是出于效率的考虑。


标 题: XP系统程序中开头的 MOV EDI, EDI指令的解释
发帖人:chaykovsky
时 间: 2005-11-25 13:55 
原文链接:http://bbs.pediy.com/showthread.php?threadid=18863
曙光服务器RAID配置避坑指南:MegaRAID SAS 9361-8i实战(含Foreign状态处理) 本文详细解析了曙光服务器搭配MegaRAID SAS 9361-8i控制器的RAID配置全流程,包括RAID0和RAID5的创建、Foreign状态处理及性能优化策略。特别针对磁盘迁移中的Foreign状态问题,提供了系统化的解决方案和高级恢复技巧,助力企业级IT运维提升存储配置的稳定性和可靠性。 阅读详情

相关推荐

Mac用户必看:Parallels Desktop 18.1.1最新破解版安装与优化全攻略(附资源)

本文为Mac用户提供Parallels Desktop 18.1.1的详细安装与优化指南,涵盖虚拟化技术选型、专业级配置流程及性能调优技巧。重点解析Parallels Desktop在图形加速、系统资源调度方面的核心优势,并分享生产力增强技巧与典型应用场景实战方案,帮助用户最大化利用这一高效虚拟化工具。

weixin_29240343的博客 825

函数开始处的MOV EDI, EDI的作用

调试程序调试到系统库函数的代码时,总会发现系统函数都是从一条MOV EDI, EDI指令开始的,紧接着这条指令下面才是标准的建立函数局部栈的代码。对系统DLL比如ntdll.dll进行反汇编,可以发现它的每个导出函数都是如此,并且每个导出函数开始处的MOV EDI, EDI上面紧接着5条NOP指令。比如在WinDbg中查看TextOutA周围的代码: 0:000> u TextOutA-0x0a

jcwKyl的专栏 8258

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 351

MOV EDI,EDI指令的解释(整理)

XP系统程序中开头的MOV  EDI,EDI指令的解释: 在VS .NET 2003的VC7\INCLUDE目录中的listing.inc文件中定义了1到7个字节的无破坏性NOP操作的宏 MOV  EDI,EDI 就是两个字节的NOP 在程序中与NOP指令的意义相同。 为什么要用MOV  EDI,EDI 而不用两个NOP? 我的理解是: 用两个NOP指令耗费的CPU时钟周期

绝迹·危言的专栏 8076

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 182

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3493

函数调用之mov edi, edi

很多函数前面几个指令都是下面这样: mov     edi, edi push    ebp mov     ebp, esp 第一行指令,是不是没用呢? 你还会在上面发现5个没用的nop 这样的做法是方便做hook,比如你要挂钩这个函数,你可以用一个2字节的短jmp(eb xx)转移到那5个nop那里,然后在那5个nop那里做一个大的jmp(e9 xx xx xx x

HUA的专栏 1771

SBP依赖计算中的蝴蝶效应:一个Prefab修改如何触发全量重建?

本文深入探讨了Unity中SBP(Scriptable Build Pipeline)依赖计算的蝴蝶效应,解析了Prefab修改如何触发全量重建的机制。通过分析Asset与Object的层级关系、依赖计算的三种维度及CacheEntry系统,揭示了全量重建的根本原因,并提供了依赖可视化工具开发、优化策略与最佳实践,帮助开发者提升构建效率。

weixin_29015051的博客 445

mov edi,edi和Hot Patching详解

mov edi,edi和Hot Patching的一点解释 2011年7月13日代码疯子发表评论阅读评论 最近发现不少函数开头都有mov edi,edi这样的指令,正好在《Advanced Windows Debugging》一书中看到了一点解释。书上说是为了Hot Patching,网上也有这样的解释。 不过网上的解释有两种情况,一种是函数开头有mov edi, e

linuxheik的专栏 1294

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 981

基于VisionMaster实现数据实时存储至MySQL (二)

摘要:之前的分享主要聚焦于简单的一维数据实时存储。但在做缺陷检测项目时,情况往往更加复杂:一张检测图像中可能同时存在多个缺陷,每个缺陷都有一组独立的核心参数(如质心、长短轴、面积等)。如何在 MySQL 中记录这些成组出现的缺陷数据,而不只是简单的单条记录?

haier123888的博客 226

函数开始处的MOV EDI EDI的作用

函数开始处的MOV EDI EDI的作用

qq_43668159的博客 286

在STM32F103RBT6微控制器上利用USB虚拟Com端口技术,高效实现ADC数据传输:详细操作步骤与示例代码解析

以上就是在STM32F103RBT6上使用USB虚拟Com端口实现ADC数据传输的全部内容。虽然过程中有很多步骤和细节需要注意,但只要按照步骤来,理解每一段代码的作用,就完全可以掌握这个过程。在实际应用中,我们可能需要根据实际需要修改一些代码,如调整ADC的参数,改变数据的处理方式等。但是,只要理解了这个过程,我们就可以很灵活地进行修改。希望这篇文章对你有所帮助。如果你有任何疑问,欢迎在评论区留言,我会尽我所能进行解答。

qq_38334677的博客 1168

mov edi,edi是

mov edi,edi - hook api 系统: windows xp 查看系统函数的反汇编代码时会发现开头有个"mov edi,edi"(2字节),再往前则是5个nop指令(当然这不会引人注意),可是"mov edi,edi"有什么用了. 上网搜索"mov edi,edi",结果让人惊奇,据说系统函数都添加了这段"无用"的代码,为的是Hot Patching,详细内容请自行搜索

Neo_86的专栏 1894

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于MOV EDI,EDI

最近在逆向一个程序,以前倒是没有怎么注意。无论在OD,还是在ida里面,进入一个子程序后会发现有这样三句代码:     MOV    EDI, EDI     PUSH   EBP     MOV    EBP, ESP第二句和第三句的意思相信不用多说,就是第一句 mov edi,edi。于是查了资料说法不一,在http://blogs.msdn.com/ishai/archive

功夫牛的专栏 1201

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

XP系统程序中开头的MOV EDI,EDI指令的解释

XP系统程序中开头的MOV  EDI,EDI指令的解释:在VS .NET 2003的VC7/INCLUDE目录中的listing.inc文件中定义了1到7个字节的无破坏性NOP操作的宏MOV  EDI,EDI 就是两个字节的NOP在程序中与NOP指令的意义相同。为什么要用MOV  EDI,EDI 而不用两个NOP?我的理解是:用两个NOP指令耗费的CPU时钟周期要比用MOV  EDI,EDI指令要

guansong02的专栏 710

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Win32API起始处的mov edi, edi与用户空间InlineHook

孤影对酌 Win32API起始处的mov edi, edi与用户空间InlineHook 在x86平台上,无论是在调试器中跟到系统DLL中时,还是反汇编某个系统DLL时,经常会发现很多API的第一条汇编指令都是mov edi, edi。根据经验来讲,C函数的汇编形式,应该是首先push ebp保存原始栈顶,然后mov ebp, esp构造新的栈帧,接下来su

linuxheik的专栏 699

热补丁:为什么Windows API都以无意义的 mov edi,edi 开头?

为什么Windows函数都以无意义的MOVEDI、EDI指令开始? 我们参考Windows 的反汇编,返现函数的开始都是以mov edi,edi,它看似毫无意义(该指令将寄存器复制到自己,并没有更新标志;这是完全没有意义的。) 原因是:这是故意设计的热补丁(hot-patching)。 热补丁 这个MOV EDI, EDI指令是两个字节。NOP,这仅够在跳转指令中进行修补,以便可以动态更新函数,即运行时修改一个函数的行为。 修改过程如下: 把MOV EDI, EDI修改为一条短跳转指令(一条短跳转指令恰好

CodeBowl的博客 605

XP系统程序中开头的MOV EDI,EDI指令的解释

导读:5   发帖人:chaykovsky   时 间: 2005-11-25 13:55   原文链接:http://bbs.pediy.com/showthread.php?threadid=18863   详细信息: XP系统程序中开头的MOV  EDI,EDI指令的解释:在VS .NET 2003的VC7/INCLUDE目录中的listing.inc文件中定义了1到7个字节的无破

xu的blog 1672

Move EDI, EDI的作用

玩WinDBG的时候, 发现函数的反汇编代码的最开始部分总是包含一条move edi, edi的指令. 比如下面的代码static unsigned int __stdcall Fibonacci_stdcall(unsigned int n) { switch(n) { case 0: STOP_ON_DEBUGGER;return 0; ...

weixin_34010566的博客 249

Why does the compiler generate a MOV EDI, EDI instruction at the beginning of functions?

Why does the compiler generate a MOV  EDI, EDI instruction at the beginning of functions?   I’ve recently noticed that on the XPSP2 Beta that I am running the function prologs look like this:

crkres9527 561

[zz]Why does the compiler generate a MOV EDI, EDI instruction at the beginning of functions?

http://blogs.msdn.com/ishai/archive/2004/06/24/165143.aspx Why does the compiler generate a MOV EDI, EDI instruction at the beginning of functions? I’ve recently noticed that on the XPSP2 Beta t...

weixin_30732825的博客 87
上一篇: API hook 原理与Windows hook 应用
下一篇: Inline HOOK API 改进版(hot-patching)
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值