我被困试图扭转这个公式

时间:2019-01-15 16:32:12

标签: c++ reverse-engineering bit-shift

我正在尝试对游戏函数进行逆向工程,该函数需要一个整数并返回64位整数,方法是编写一个函数,该函数返回通过游戏函数输入之前的原始值。我该如何实现?

我只能设法扭转这些步骤:

x = ((1 - x) << 16)

我不确定如何在没有原始值的情况下反转加法。

这是游戏功能:

int64_t convert(int x) {
  if (x <= 0)
    return (1 - ((((x + 1) >> 31) + x + 1) >> 16));
  else
    return 0;
}

例如,如果原始值为-5175633,则转换后的值为80,我需要从80中获取原始值。

3 个答案:

答案 0 :(得分:2)

我认为这不可能。当您右移整数时,位会丢失。这意味着有多个输入值将返回相同的输出值。

对不起,维克多,但您的解决方案不起作用。您应该比较r和i,而不是c和cc。

答案 1 :(得分:1)

我们假设通过步骤(1 - ((((x + 1) >> 31) + x + 1) >> 16))x已转换为y,我们得到:

y = 1 - ((((x + 1) >> 31) + x + 1) >> 16)
1 - y = (((x + 1) >> 31) + x + 1) >> 16
(1 - y) << 16 = (x + 1) >> 31 + x + 1

如果x <= 0,则x + 1 <=1。但这无法确定符号位。所以我们应该再假设一次。

如果x + 1 <0,则(x + 1) >> 31为-1,其中x <-1,y为{{1} }

1 - ((((x + 1) >> 31) + x + 1) >> 16)

如果1 - (x >> 16) == 0,则(1 - y) << 16 = -1 + x + 1 (1 - y) << 16 = x 为0,即x + 1> = -1,而(x + 1) >> 31x,为1 ((注意:现在x只能是0或-1

y

因此,将这两个结果放在一起,我们可以得到:

1 - ((((x + 1) >> 31) + x + 1) >> 16)

此外,(1 - y) << 16 = x + 1 (1 - y) << 16 - 1 = x 函数是Surjective-only函数,这意味着多个输入可以获得相同的输出,因此不可能将 precise 输出反转为输入。 / p>

答案 2 :(得分:0)

我假设sizeof(int)是4。所有操作都在32位上完成。

#include <iostream>

using namespace std;

int64_t convert(int32_t x) {
  if (x <= 0)
    return (1 - ((((x + 1) >> 31) + x + 1) >> 16));
  else
    return 0;
}

int32_t revconvert(int64_t r) {
    if (r == 0) return 0;
    if (r == 1) return -1;
    return (1-r) << 16;
}

int main()
{
    int32_t i;
    for (i=0;i>-10000000;--i) {
        auto c = convert(i);
        auto r = revconvert(c);
        auto cc = convert(r);
        if( c!=cc) break;
    }

    cout << i << endl; // just to see if we got to the end

    cout << convert(-5175633) << endl; // Will give 80
    cout << revconvert(80) << endl; // Will give -5177344
    cout << convert(-5177344) << endl; // Will give 80

    return 0;
}