Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要帮助弄清楚这个C代码的功能_C_Function_Reverse Engineering_Ghidra - Fatal编程技术网

我需要帮助弄清楚这个C代码的功能

我需要帮助弄清楚这个C代码的功能,c,function,reverse-engineering,ghidra,C,Function,Reverse Engineering,Ghidra,我从Ghidra那里得到了这段C代码,我不太明白它在做什么。我怀疑某种根,也许 传入的两个参数是平方和(有时是2项有时是3项),以及一个额外的值,如0x18、0x10或0(有时不存在此参数!) uint-FUN\u 80059070(uint-param\u 1,uint-param\u 2) { uint-uVar1; uint-uVar2; uint-uVar3; uint-uVar4; uint-uVar5; uint-uVar6; uVar5=0; uVar4=1; uVar6=0; u

我从Ghidra那里得到了这段C代码,我不太明白它在做什么。我怀疑某种根,也许

传入的两个参数是平方和(有时是2项有时是3项),以及一个额外的值,如0x18、0x10或0(有时不存在此参数!)

uint-FUN\u 80059070(uint-param\u 1,uint-param\u 2)
{
uint-uVar1;
uint-uVar2;
uint-uVar3;
uint-uVar4;
uint-uVar5;
uint-uVar6;
uVar5=0;
uVar4=1;
uVar6=0;
uVar3=12;
uVar4=uVar4-1;
}
返回uVar5;
}

理解代码的一个非常好的方法是重构代码

首先,创建一个测试函数和几个测试用例。然后重写函数。它可以像这样。这是非常简单的,对于更大的重构,我会让它更复杂一点

bool test(uint param_1, uint param_2) 
{
    return (FUN_80059070(param_1, param_2) == my_func(param_1, param2));
}

int main()
{
    uint test_cases[3][2] = { {0,0}, {8, 12}, {12, 14}};

    for(int i=0; i<3; i++) {
        if(! test(test_cases[i][0], test_cases[i][1])) {
             printf("Case %d with values %d and %d failed\n", 
                     i, test_cases[i][0], test_cases[i][1]);
             exit(EXIT_FAILURE);
        }
    }

    printf("All tests passed\n");
}
并将行初始化
uVar3
更改为

uVar3 = 1 << describing_name(param_2);
powi
是我写的一个简单的整数幂函数。上面的代码仍然不是很容易理解,但至少奇怪的位操作和“聪明”的代码部分已经过时了

现在我注意到一些事情<代码>uVar3*4!=0作为一个数学运算实际上没有意义,因为这只适用于
uVar3==0
。但它的作用是检查除两个最重要的位之外的所有位是否为零。因此,您可以将其替换为以下函数:

bool fourteen_least_significant_bits_are_not_zero(uint x) {
    return x << 2 != 0;
}
void describing_name(uint *uVar3p, uint *uVar4p, uint param_1)
         // These are declared so that you can just copy paste the code
         uint uVar3 = *uVar3p;
         uint uVar4 = *uVar4p;

         // Copy paste with no modifications
         while ((uVar3 < param_1 && 
                 fourteen_least_significant_bits_are_not_zero(uVar3)) {
                 uVar4 = uVar4 + 1;
                 uVar3 = uVar3 * 4;
         }

         // And write back the values
         *uVar3p = uVar3;
         *uVar4p = uVar4;
}
将while循环替换为:

describing_name(&uVar3, &uVar4, param_1);

重构代码通常是理解代码的最佳方式。记住,重构时测试是至关重要的。

理解代码的一个非常好的方法就是重构代码

首先,创建一个测试函数和几个测试用例。然后重写函数。它可以像这样。这是非常简单的,对于更大的重构,我会让它更复杂一点

bool test(uint param_1, uint param_2) 
{
    return (FUN_80059070(param_1, param_2) == my_func(param_1, param2));
}

int main()
{
    uint test_cases[3][2] = { {0,0}, {8, 12}, {12, 14}};

    for(int i=0; i<3; i++) {
        if(! test(test_cases[i][0], test_cases[i][1])) {
             printf("Case %d with values %d and %d failed\n", 
                     i, test_cases[i][0], test_cases[i][1]);
             exit(EXIT_FAILURE);
        }
    }

    printf("All tests passed\n");
}
并将行初始化
uVar3
更改为

uVar3 = 1 << describing_name(param_2);
powi
是我写的一个简单的整数幂函数。上面的代码仍然不是很容易理解,但至少奇怪的位操作和“聪明”的代码部分已经过时了

现在我注意到一些事情<代码>uVar3*4!=0作为一个数学运算实际上没有意义,因为这只适用于
uVar3==0
。但它的作用是检查除两个最重要的位之外的所有位是否为零。因此,您可以将其替换为以下函数:

bool fourteen_least_significant_bits_are_not_zero(uint x) {
    return x << 2 != 0;
}
void describing_name(uint *uVar3p, uint *uVar4p, uint param_1)
         // These are declared so that you can just copy paste the code
         uint uVar3 = *uVar3p;
         uint uVar4 = *uVar4p;

         // Copy paste with no modifications
         while ((uVar3 < param_1 && 
                 fourteen_least_significant_bits_are_not_zero(uVar3)) {
                 uVar4 = uVar4 + 1;
                 uVar3 = uVar3 * 4;
         }

         // And write back the values
         *uVar3p = uVar3;
         *uVar4p = uVar4;
}
将while循环替换为:

describing_name(&uVar3, &uVar4, param_1);

重构代码通常是理解代码的最佳方式。记住,重构时测试是至关重要的。

您是否尝试过用几对输入运行它?你注意到输出中有任何模式吗?你能计算出第一个
循环结束后
uVar3
uVar4
的值是多少吗?很难说它们会是什么,因为这是一个游戏,它会执行每一帧。什么是
uint
?@klutt Unsigned IntegerDid你试着用几对输入?你注意到输出中有任何模式吗?你能计算出第一个
循环结束后
uVar3
uVar4
的值是多少吗?很难说它们会是什么,因为这是一个游戏,它会执行每一帧。什么是
uint
?@klutt无符号整数