将 C++ 代码转换为 python 代码

逆向工程 反编译 C++ 吉德拉
2021-06-30 01:45:58

当我使用 ghidra 做 RE 时,我看到了这段代码

  byte bVar1;
  byte bVar2;
  uint uVar3;
  
  uVar3 = 0;
  while (bVar2 = (byte)uVar3, (char)bVar2 < '\b') {
    bVar1 = *(byte *)(uVar3 + param_1) ^ *(byte *)(uVar3 + param_2);
    *(byte *)(uVar3 + param_1) = (bVar1 << (bVar2 & 7) | bVar1 >> 8 - (bVar2 & 7)) - bVar2;
    uVar3 = (uint)(byte)(bVar2 + 1);
  }
  return;

我知道代码旋转移位,但我不认为它是相同的我知道这里有点不同,不是简单的位移动

所以写一个python代码将使这里的位滚动有意义

1个回答

可以清理此代码以提高可读性

void __cdecl decrypt(char *dst,char *src)
{
  byte j;
  uint i;

  i = 0;
  while (j = (byte)i, (char)j < 8) {
    dst[i] = ((dst[i] ^ src[i]) << (j & 7) | (byte)(dst[i] ^ src[i]) >> 8 - (j & 7)) - j;
    i = (uint)(byte)(j + 1);
  }
  return;
}

但是 shift 和or-ing 仍然可能令人困惑。在这种情况下,查看反汇编比分解更容易,如果你这样做的话,构成 for 循环体的操作是xor,rolsub所以移位和or是汇编rol操作码的伪代码

它可以通过一个简单的 lambda 来实现

rol = lambda val, r_bits, max_bits: \
    (val << r_bits%max_bits) & (2**max_bits-1) | \
    ((val & (2**max_bits-1)) >> (max_bits-(r_bits%max_bits)))