修改影响 xmm# 浮点值的步长值

逆向工程 部件 x86
2021-06-16 13:08:29

我在汇编方面没有太多经验,我正在尝试更改更改最终值的步长值,这些是我正在使用的操作码,这就是它们的设置方式:

movss xmm0,[eax+30]  
addss xmm0,[esi+00000094]
movss [eax+30],xmm0
movss xmm0,[esi+00000098]
addss xmm0,[eax+34]    
movss [eax+34],xmm0
movss xmm0,[esi+0000009C]
addss xmm0,[eax+38] 
movss [eax+38],xmm0 

现在到目前为止,我认为这些addss行是负责增加或减少xmm0浮点值的那些:

movss [eax+30],xmm0
movss [eax+34],xmm0
movss [eax+38],xmm0

我试图实现的是繁衍将被加入到步长值xmm0addss线路:

addss xmm0,[esi+00000094]
addss xmm0,[eax+34]
addss xmm0,[eax+38]

我假设是[esi+00000094] [eax+34] [eax+38].

我尝试将它们乘以 (float)2.00(以及其他乘法因子,例如 1.50 和 0.20),如下所示

addss xmm0,[esi+00000094]*(float)2.00
addss xmm0,[eax+34]*(float)2.00
addss xmm0,[eax+38]*(float)2.00

但当然,我的无知证明这不是解决问题的方法,而且由于我在该领域的知识几乎为零,因此我决定寻求帮助。

更好地解释我认为这里正在发生的事情以及我正在尝试做的事情是这样的:

addss xmm0,[esi+00000094] == addss 31.00,[0.43]      <- 31 being the current/old
                                                        value and 0.43 being the
                                                        increment value that 
                                                        will add to 31

movss [eax+30],xmm0       == movss [XXXXXXXXX],31.43 <- XXX being the address
                                                        that holds the new value
                                                        and xmm0 the one that
                                                        will copy the new value
                                                        to the target
                                                        address/register


---what I am trying to do if I am correct---


addss 31.00,[0.43*n]    <- n being a float point set by me (2.00 or 1.50 or 0.03)

movss [XXXXXXXXX],31.86 <- final value is copied to the target address with the
                           intended increment/decrement (in case of 0.### float
                           values) effectively set by me

谁能告诉我正确的方法吗?我什至不知道这些addss行是否是我可以修改步长值的正确行(增加或减少 中的最后一个xmm0值的行movss [eax+30],xmm0 | movss [eax+34],xmm0 | movss [eax+38],xmm0)。

我正在使用[CE's]自动汇编器工具来实现这一点,修改内存值。

1个回答

实现最终结果的一种方法是执行蹦床并修改类似于下面显示的逻辑的指令序列并恢复到原始流程

从英特尔获取指令集手册一个现成的参考(第一次谷歌命中)
http://www.rz.uni-karlsruhe.de/rz/docs/VTune/reference/

CPU Disasm
Command                                  Comments
MOVSS   XMM0, DWORD PTR DS:[EAX+30]      ; FLOAT 31.00000  orginal float 
MOVSS   XMM1, DWORD PTR DS:[ESI+94]      ; FLOAT 0.4300000 original flaot
MOVSS   XMM2, DWORD PTR DS:[ESI+9C]      ; FLOAT 2.000000   mov multiplier from location you chose to spare register
MULSS   XMM1, XMM2                       ; FLOAT 0.0, 0.0, 0.0, 2.000000 multiply original float by multiplier
ADDSS   XMM0, XMM1                       ; FLOAT 0.0, 0.0, 0.0, 0.8600000 add modified result to original float
MOVSS   DWORD PTR DS:[EAX+30], XMM0      ; FLOAT 0.0, 0.0, 0.0, 31.86000 return to flow