PowerPC学习笔记

前言

个人正在学习PowerPC逆向,这里记录一下自己遇到的一些难点汇编代码。

三目运算符

遇到以下汇编代码,直接使用三目运算符。参考: ARM/MIPS/PowerPC/RISC-V 指令集快速入门 | FANG - 🍉 (moooc.cc)

汇编指令对应C代码
subfic rA, rB, 0
adde rC, rA, rB
rC = (rB ? 0 : 1)
addic rA, rB, -1
subfe rC, rA, rB
rC = (rB ? 1 : 0)
addic rA, rB, -1
subfe rC, rA, rA
rC = (rB ? 0 : -1)
extsb rA, rA<br/>srawi rB, rA, 0x1F
xor rC, rB, rA
subf rC, rC, rB
srawi rC, rC, 0x1F


rC = (rA ? -1 : 0)
extsb rA, rA
xor rC, rA, rS
srawi rB, rC, 0x1F
xor rC, rB, rC
subf rC, rC, rB
srawi rC, rC, 0x1F



rC = (rA == rS) ? 0 : -1

整形浮点转换

这里指的是int和double的转换。

我们先使用C语言来实现两个int转换为double(也研究了一小会才整出来):

//两个int合成double应该是这样的:
//hex2double的第二个数
int a = 0;
//hex2double的第一个数
*(&a+1) = 0x3ff00000;
double final = *(double*)&a;
double取两个int是这样:
//hex2double的第一个数
int a = *(int*)(&final+1);
//第二个数
int b = *(int*)(&final);

这样,我们就实现了两个int⇔double

在PowerPC中,我们只需要注意若是int转double,汇编代码若操作了较大的数,那么就是注释中的第一个数(即*(&a+1)),操作了较小的数,就是注释中的第二个数(即a)。反之是double转int,则相反。然后直接根据上面的C代码更改对应的数字即可。

其它重要汇编语句

其实有些IDA里反应的语句实际翻译起来无需实际代码,只是内部逻辑需要,但这部分往往难以理解。

clrlwi

关于 clrlwi 常见的语句:

clrlwi    r0, r9, 24
#等同于rlwinm r0,r9,0,24,31,按照rlwinm指令的意义,其执行结果实际上为:
r0 = r9 & MASK(24,31)
= r9 & 1111 1111b
= r9 & 0xFF

所以上面的语句其实就是r9的值传入r0 。至于为什么要使用这条语句来传值,就是适应高位清零之类的需求。

clrlwi    r0, r9, 16
#此时等同于:
r0 = r9 & MASK(16,31)
= r9 & 0xFFFF

是一个short。

extsh

extsh     r9, r11

即将r11中的一个半字扩展成一个单字(WORD),放入r9寄存器中。 一般涉及这条指令的变量,为有符号的。

文章作者: Leaflag
文章链接: https://www.leaflag.cn/2020/08/27/PowerPC学习笔记/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeaflagのBlog