我遇到了一个正在分析的恶意软件,发现它使用某种数学方法随机选择特定指令的寄存器
我不明白这个操作是如何计算的取决于什么?
这是我的意思的一个例子
假设我想为指令随机选取一个寄存器
ADD DWORD PTR DS:[0],EAX
我们知道这条指令的操作码是 01 05 00 00 00 00
粗体数字代表该指令的寄存器
05 == EAX 0D == ECX
为了更好地解释这一点,这里是所有寄存器的指令
0041580B 0105 00000000 ADD DWORD PTR DS:[0],EAX
00415811 010D 00000000 ADD DWORD PTR DS:[0],ECX
00415817 0115 00000000 ADD DWORD PTR DS:[0],EDX
0041581D 011D 00000000 ADD DWORD PTR DS:[0],EBX
00415823 0125 00000000 ADD DWORD PTR DS:[0],ESP
00415829 012D 00000000 ADD DWORD PTR DS:[0],EBP
0041582F 0135 00000000 ADD DWORD PTR DS:[0],ESI
00415835 013D 00000000 ADD DWORD PTR DS:[0],EDI
恶意软件使用从 0 (EAX) 到 7 (EDI) 的寄存器索引
该数字首先与数字 3 进行 SHLed,然后与 5 进行或运算以获得正确的寄存器操作码。所以我的问题是作者是如何得出这个结论的?
我会说 SHL REG,3 等于 REG*8,即最大寄存器的数量?但是为什么我们需要用 05 来 OR 它呢?是不是因为这条指令的起始操作码是05?
有人对此有更好的解释吗?或任何提示词以更好地理解?