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

CAN XL和10Base-T1S全对比:在区域架构中如何选择最适合的车载通信协议? 本文深入对比了CAN XL和10Base-T1S在车载网络架构中的性能差异,通过实测数据和典型应用场景分析,为区域架构设计提供选型指南。重点探讨了带宽、延迟、成本等关键指标,帮助工程师在ADAS传感器部署和车身控制网络优化中做出明智选择。 阅读详情

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

在x86平台上,无论是在调试器中跟到系统DLL中时,还是反汇编某个系统DLL时,经常会发现很多API的第一条汇编指令都是mov edi, edi。根据经验来讲,C函数的汇编形式,应该是首先push ebp保存原始栈顶,然后mov ebp, esp构造新的栈帧,接下来sub esp, 0nnh分配局部变量空间,之后就是函数体了,结束时先mov esp, ebp恢复栈指针,然后pop ebp恢复栈顶指针,最后retn。

复制代码
push    ebp             ; 保存原始栈顶指针到栈
mov     ebp, esp        ; 获取新栈顶指针,用以访问参数和局部变量
sub     esp, 0NNh       ; 分配局部变量空间,大小0xNN字节
...
...

mov     esp, ebp        ; 恢复初始栈指针
pop     ebp             ; 恢复原始栈顶指针,调用者用来访问参数和局部变量
retn                    ; 返回到调用者
复制代码

现在,前面多了一条mov edi, edi,是用来干什么的呢?看了网上好多论坛博客,众说纷纭。有的说是一条延时指令为了实现一个短的等待,有的说是为了对齐以便于Cache,等等。看了半天,都不是很有说服力,最终在MSDN Blog上找到一篇相关说明,应该是最有道理的。上面说,这条指令的添加主要是为了支持hotpatch,翻译过来好像是叫热修补,类似于Inline Hook。说到这里就要先提一下MSDN帮助文档上与此相关的说明,是关于hotpatch的两个编译链接选项:

首先是编译器选项/hotpatch:

When /hotpatch is used in a compilation, the compiler ensures that first instruction of each function is at least two bytes, which is required for hot patching.
To complete the preparation for making an image hotpatchable, after you use /hotpatch to compile, you must use /FUNCTIONPADMIN to link. When you compile and link an image by using one invocation of cl.exe, /hotpatch implies /functionpadmin.
Because instructions are always two bytes or larger on the ARM architecture, and because x64 compilation is always treated as if /hotpatch has been specified, you don't have to specify /hotpatch when you compile for these targets; however, you must still link by using /functionpadmin to create hotpatchable images for them. The /hotpatch compiler option only affects x86 compilation.

大致含义:

当/hotpatch用于编译时,编译器会确保每个函数的第一条指令至少占两个字节,这是热修补的要求。
要使生成的映像文件可以热修补,除了使用/hotpatch来编译,你还必须使用/FUNCTIONPADMIN进行链接。当你使用cl.exe一次性完成编译和链接时,/hotpatch隐含了/FUNCTIONPADMIN。
因为ARM架构的指令至少占两个字节,而且x64编译总是视为/hotpatch已指定,所以当编译目标为这两种架构时不必指定/hotpatch参数;然而,你仍然必须使用/FUNCTIONPADMIN来为它们生成可以热修补的映像文件。/hotpatch编译器选项仅影响x86编译。

连接器选项/FUNCTIONPADMIN:

The amount of padding to add to the beginning of each function, 5, 6, or 16. x86 images require five bytes of padding, x64 images require 6 bytes, and images built for the Itanium Processor Family require 16 bytes of padding at the beginning of each function.
By default, the compiler will add the correct amount of space to the image, based on the machine type of the image.
In order for the linker to produce a hotpatchable image, the .obj files must have been compiled with /hotpatch (Create Hotpatchable Image).
When you compile and link an image with a single invocation of cl.exe, /hotpatch implies /functionpadmin.

机器译文:

要添加到每个函数开头的填充量,为 5、6 或 16字节。在每个函数的开头,x86 映像需要填充 5 个字节,x64 映像需要填充 6 个字节,为 Itanium 处理器系列生成的映像需要填充 16 个字节。
默认情况下,编译器根据映像的计算机类型将正确的空格数添加到映像中。
为了使链接器生成可热修补的映像,.obj 文件必须已使用 /hotpatch 进行编译。
使用 cl.exe 的单个调用来编译和链接映像时,/hotpatch 隐含表示 /functionpadmin。

看完上面两段文字,应该会有所思。回过头来继续刚才的mov edi, edi,先来看一下函数开始几条指令的大小:

00000000    8BFF          mov     edi, edi        ; 2字节
00000002    55            push    ebp             ; 1字节
00000003    8BEC          mov     ebp, esp        ; 2字节

我们可以看到正如上面帮助文档所讲,mov edi, edi占用了两个字节。那么为什么第一条指令不能少于两个字节呢?其实以前的MSDN上本来说的是确保第一条指令为两字节,后来更改为不少于两字节,估计早时就是针对x86上的mov edi, edi来说的。。根据hotpatch的设计思路,要在第一条指令处写入一个短跳转,x86平台为0xEB后跟一字节偏移立即数,通过这个短跳转跳转到函数间的填充区域,在填充区域写入一个长跳转,x86平台为0xE9后跟一个双字立即数偏移,通过这个长跳转就可以跳转到我们的Patch函数或者Hook函数。

00000000    E902000000    jmp     07h             ; 函数间至少有5字节填充,将双字偏移2改为实际函数的相对地址
00000005    EBF9          jmp     0h              ; 原来的mov edi, edi,负向跳转7字节到长跳转指令

函数头部的第一条指令如果是像mov edi, edi这样的一条无作用指令,那么跳回前也不需要再进行等价操作来实现这条指令的作用了,直接跳转回mov edi, edi的下一条指令即可。看一看现在好多Inline Hook在实现的时候,并没有利用这种机制,而是直接覆盖掉函数的前5字节,然后自己实现被覆盖的指令。其实如果目标函数前三条指令是mov edi, edi、push ebp和mov ebp, esp的话,这样也是一个普适的方法,就是跳转回来之前需要自己实现push ebp和mov ebp, esp这两条指令。对于其他情况,需要有针对的特殊化处理。

综上所述,在Hook以mov edi, edi开头的函数时,还是使用短跳转加长跳转的方式实现起来最方便,完全用C语言即可实现,不需要再写汇编代码,还可以做成一个通用Hook函数。只是这种方便只存在于32位的大多数API中,还是有很大局限性的。

OK. That's all. 学识有限,大家有好的思路欢迎交流。

基于生存结局(生存分析/COX回归)的中介效应分析 ① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。 阅读详情

相关推荐

ABB机器人ModbusTCP通信实战:如何高效传输Float数据到PLC(附完整代码)

本文详细介绍了ABB机器人通过ModbusTCP协议高效传输Float数据到PLC的实战方法,包括底层逻辑解析、RAPID程序架构设计、PLC服务器配置及现场调试技巧。特别针对浮点数据传输中的字节顺序问题提供了解决方案,并附有完整代码示例,助力工程师快速实现工业自动化设备间的高精度数据交互。

weixin_30836759的博客 483

妙用mov edi,edi和5个nop实现inline hook

妙用mov edi,edi和5个nop实现inline hook 2008年2月22日 | 分类: 其它技术 | 标签: inline hook, nop 这方法MJ很早时就说过了,简单重复下。 大家应该发现大部分API的第一条指令都是mov edi,edi,比如在我的电脑上MessageBoxA的代码如下: 77D5058A > 8BFF

linuxheik的专栏 869

树莓派3-改装wifi外置天线

声明:本文只是技术性探讨,改装引起的产品损坏等后果,由用户自负! 改装主要有两种方法 方法一:直接替换原来的天线 1、移除原有的小陶瓷天线,就在Made in PRC(或UK)那边的那个 清理一下阻焊剂方便天线接地(图中PRC左侧) 2、焊接天线 天线的屏蔽层焊接到清理完阻焊剂的地方,中间的信号线焊接到PRC右侧焊盘。 3、最终的样子

huayucong的博客 2万+

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

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

CodeBowl的博客 605

SGM5860x高精度ADC驱动开发与SPI接口实战指南

本文详细介绍了SGM5860x高精度ADC芯片的驱动开发与SPI接口配置实战。内容涵盖芯片特性、SPI通信设置、寄存器映射、驱动初始化、数据采集处理、校准优化及调试技巧,帮助开发者快速掌握国产24位ADC的应用,提升工业测量项目的精度与稳定性。

vvv99的博客 726

CANbus收发器ADM3053BRWZ-REEL7应用原理图设计

ADM3053 在 CAN 协议控制器与物理层总线之间创建一个 完全隔离的接口。该器件具有限流和热关断特性,可防止输出短路。额定温 度范围为工业温度范围,提供 20 引脚、宽体 SOIC 封装。该器件采用 5 V 单电源供电, 提供完全隔离的 CAN 解决方案。ADM3053 是一款隔离式控制器区域网络 (CAN) 物理层收 发器,集成隔离 DC/DC 转换器,符合 ISO 11898 标准。该器件采用 ADI 公司的。Coupler® 技术,将双通道隔离器、 CAN 收发器和 ADI 公司的。

zhusl6688的博客 1244

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

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

jcwKyl的专栏 8258

vivo X200 Ultra前瞻系列(1):重塑影像旗舰标准

在色彩风格化、视频专业度上实现了安卓阵营的突破性进步。其2亿像素长焦、双LYT-818传感器及5轴防抖技术,对追求个性化创作的用户具有强吸引力。若真机表现能兑现硬件承诺,X200 Ultra有望重新定义手机影像的“专业”标准。然而,其厚重设计、价格门槛及生态适配问题,仍需市场检验。vivo X200 Ultra作为2025年上半年影像旗舰,以“全焦段夜视仪+电影级视频”为核心卖点,主打。,对标小米15 Ultra、OPPO Find X8 Ultra等竞品。,顶配版(24GB+2TB)逼近万元。

专注:太空算力、AI infra、异构调度、大模型成本工程 966

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

Kubernetes 集群升级与备份恢复:从 1.24 到 1.30 的平滑升级实战

详解 Kubernetes 集群版本升级流程(kubeadm 方式),包括前置检查、组件逐个升级、节点排水与恢复,同时演示 etcd 备份与集群灾难恢复方案。

kaixin110a的博客 36

【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解

自动驾驶车辆的运动学模型以自行车模型为核心,通过状态方程。

一碗白开水一 832

为什么会有mov edi, edi?(转)

原来一直被windows上的一些固定汇编指令搞的有点糊涂, 各种说法其实都有, 比如这个mov edi, edi. 实际这个指令是干什么用的呢? 每个人都有不同的说法, 今天了解到一种比较靠谱的说法!在VS的安装目录中的listing.inc文件中定义了1到7个字节的无破坏性NOP操作的宏MOV EDI,EDI 就是两个字节的NOP在程序中与NOP指令的意义相同。为什么要用MOV EDI,EDI

u012129783的博客 661

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

函数调用之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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

轻量应用服务器续费升配原理与云资源生命周期管理

轻量应用服务器是面向开发者与中小业务的开箱即用型云主机,其核心价值在于封装底层复杂性、提供固定带宽与预装环境。技术原理上依赖虚拟化隔离、分层资源池(计算/存储/网络)及热迁移能力,实现免停机升配;商业价值体现在成本确定性、部署极简性与运维低门槛。典型应用场景包括静态网站托管、小程序后端、SaaS子站部署及教学实验环境。本文深入解析腾讯云轻量服务器6周年活动中‘1折续费+免费升配’背后的资源调度逻辑、真实折扣算法与配置升级边界,并延伸至云服务生命周期中的成本优化、性能治理与架构演进路径。

weixin_34259232的博客 455

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

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

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

HOOK挂钩技术

文章目录1.Address Hook1.1.PE的IAT1.2.PE的EAT1.3.PE的user32.dll的回调函数表1.4.IDT1.5.SSDT和ShadowSSDT1.6.C++类的虚函数表2.Inline Hook3.Hook位置 1.Address Hook 地址hook顾名思义,就是将原函数地址直接替换成hook函数地址 1.1.PE的IAT 因为IAT具体指某个PE模块的IAT,所以他的作用范围只针对被Hook的模块,且必须在以静态链接的方式调用API时才会被Hook,在使用LoadLib

醉等佳人归 1056

UE4 热更新经验总结与hotpatch插件分析

因为热更这种基本技术,在联网游戏里也是必修课。之前搞unity时候做过这个,但是到了ue4也算是从零开始。想掌握UE4热更第一步肯定是看各种博客官方文档,我先把我看过的热更相关文章地址列出给大家参考参考,这些文章也是我筛选过的有可以学习的知识。 一、如果之前没怎么接触过热更的我建议先看官方文档,对整体有一个理解,我也是先跟着官方文档做了一遍热更流程 https://docs.unreal...

盲人东的博客 4364
上一篇: Detours 使用方法 HOOK API
下一篇: mov edi,edi - hook api
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值