如何求解混淆函数__slp_f1tb1t的返回值?解析四维数组_[2][2][2][2]
解析混淆函数
__slp_f1tb1t 咱们一步步拆解这个看起来绕人的函数,先从你搞不懂的四维数组开始讲。
先搞懂_[2][2][2][2]是什么
这是一个4维的无符号字符数组,每个维度的长度都是2,算下来总共有 2×2×2×2=16 个元素——刚好对应4位二进制数的所有组合(从0000到1111)。
你看它的初始化结构,其实是按输入x的高4位二进制位来对应值的:数组的四个索引,分别对应x的第7位(对应0x80)、第6位(0x40)、第5位(0x20)、第4位(0x10)的取值(要么0要么1)。而每个索引组合对应的数组元素,高4位正好是这四个索引组成的4位二进制数的十六进制值,低4位固定是0。举几个例子:
- 索引
[0][0][0][0]对应二进制0000,元素是0x00 - 索引
[1][0][1][0]对应二进制1010,元素是0xA0 - 索引
[1][1][1][1]对应二进制1111,元素是0xF0
再拆解函数的索引逻辑
函数里的_[!!(x&0x80)][!!(x&0x40)][!!(x&0x20)][!!(x&0x10)]这串,其实是在做“位转索引”的操作:
x & 0x80:把x的第7位(最高位)单独拎出来,如果这个位是1,结果就是非0值,否则是0!!这个运算符很有意思,它会把任何非0值转成1,0还是0——目的就是把位运算的结果,转换成数组需要的0/1索引- 四个索引依次对应
x的高4位(从bit7到bit4)的状态,最终取出的数组元素,是一个高4位和x的高4位完全相同、低4位为0的字节
最后看返回值到底是什么
函数最后返回的是数组元素 | (x&15):
x&15就是x&0x0F,作用是取出x的低4位- 按位或
|的特性是:只要有一个位是1结果就是1。这里数组元素的低4位都是0,所以按位或之后,低4位直接保留x原来的低4位,高4位则保留数组元素的高4位(也就是x原来的高4位)
结论:这是个“障眼法”函数
说白了,这个看起来复杂的混淆函数,本质上是个恒等函数——它的返回值就是你输入的x本身!比如:
- 输入
0x3A,数组取出0x30,0x30 | 0x0A = 0x3A,和输入一模一样 - 输入
0xB7,数组取出0xB0,0xB0 | 0x07 = 0xB7,还是原来的输入
内容的提问来源于stack exchange,提问作者qcc101
相关产品推荐
相关产品推荐

