美文网首页
在PPC反汇编遇到的一些坑

在PPC反汇编遇到的一些坑

作者: 不毛 | 来源:发表于2020-09-06 22:33 被阅读0次

    1.将两个int合成一个double

    image.png

    以这三行为例,第一行是将r0的值放在了var_60+4的位置,此时赋值的是一个整型,第二行则在var_60处赋值了一个整型,第三行直接从var_60取指向的值,且这个值为float(或者double)类型。
    我们知道int类型占4字节,float也是4个字节,所以这里合成的是一个double。
    具体转换为C语言可以参考如下代码

    //hex2double
    int a = 0;  //存入低4字节
    *(&a+1) = 3FF00000;  //存入高4字节
    double final = *(double *) &a; //强制类型转换,将a的地址转换为double类型的指针,然后取这个指针的指向的值
    printf("%f",final);  //输出1.0
    

    反过来的话

    //double2hex
    //第一个数
    int a  = *(int*)(&final+1);
    //第二个数
    int b = *(int*)(&final);
    

    2.数组

    经常会看到类似于这样的代码

    image.png
    在这里涉及到偏移,同时r0如果是循环体内递增的变量,那么很可能这是一个数组array,每次循环取数组内某个元素array[i]
    比如这里我们取r0=1(每次递增1,用1来算增量,以确定数组大小)
    左移位n位即相当于乘了2^n
    从第二行到第四行,得出最后一个r9 = (r02+r0)2^5 = 0x60,于是我们可以得出数组的每个元素大小为0x60。
    后面stwx r0,r9,r11 ; 这里的操作就是把r0的值存入r11偏移r9的位置。
    r11从上一句看出是var_38这个变量,那么从上面的结论我们可以看出var_38是个大小为0x60的数组。所以到这里为止,翻译成C语言大概是
    var_38[r0] = 1;
    

    3.函数指针

    因为汇编可以先将函数地址保存在某个寄存器中,在后续需要使用的时候才调用,前面可能会有一个判断,来选择后续执行哪一个函数(但是由于参数后面才会获得,所以不会立刻执行)
    这种情况对于C语言来说不太好直接处理

    image.png
    比如上图只是判断后,将后续要执行的函数保存在r21寄存器中
    这个时候我们可以使用到函数指针操作
    对于函数指针的话这一篇文章讲的比较详细易懂,不再赘述了
    http://c.biancheng.net/view/228.html

    相关文章

      网友评论

          本文标题:在PPC反汇编遇到的一些坑

          本文链接:https://www.haomeiwen.com/subject/qdehektx.html