我正在尝试对游戏函数进行逆向工程,该函数需要一个整数并返回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中获取原始值。
答案 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) >> 31
为x
,为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;
}