如何单独修改XMM0寄存器[00]和[+04]位置的存储数值
实现方案
你之前使用movsd加载双精度数到XMM0时,双精度占8字节刚好覆盖XMM0低2个连续dword,因此会同时修改前两个值。要实现两个值独立修改,改用单精度向量操作指令即可,修改后的注入代码如下:
newmem: ; 自定义修改第一个值(XMM0最低位dword,对应原1973.66) movss xmm0, [p_first_val] ; 自定义修改第二个值(XMM0 +04偏移位置dword,对应原295.23) insertps xmm0, [p_second_val], 01h code: movq [ecx+38],xmm0 je flashplayer11_7r700_224_win_sa.exe+27845 jmp return ; 独立配置两个单精度数值 p_first_val: dd (float)1973.66 ; 替换为你需要的第一个自定义值 p_second_val: dd (float)295.23 ; 替换为你需要的第二个自定义值 INJECT: jmp newmem return:
兼容低版本CPU的替代写法
如果运行环境不支持SSE4.1指令集的insertps,可以用以下通用SSE2指令实现相同效果:
newmem: movss xmm0, [p_first_val] movss xmm1, [p_second_val] unpcklps xmm0, xmm1
逻辑说明
movss指令仅操作XMM寄存器的最低4字节,不会影响寄存器其他位置的数值insertps参数01h表示将源单精度值插入到XMM0的第1个dword位(索引从0开始计算,对应+04偏移位置)- 后续
movq指令依然正常输出XMM0低8字节的两个修改后的值到内存地址[ecx+38],和原有业务逻辑完全兼容
内容的提问来源于stack exchange,提问作者Lith
相关产品推荐
相关产品推荐

