混淆函数的返回值

时间:2018-01-20 15:24:44

标签: c deobfuscation

我试图找到此函数的返回值:

char __slp_f1tb1t(char x) {


const static unsigned char _[2][2][2][2] = {


{ { { 0x00, 0x10 }, { 0x20, 0x30 } },


{ { 0x40, 0x50 }, { 0x60, 0x70 } } },


{ { { 0x80, 0x90 }, { 0xA0, 0xB0 } }, 


{ { 0xC0, 0xD0 }, { 0xE0, 0xF0 } } }


};

return _[!!(x&0x80)][!!(x&0x40)][!!(x&0x20)][!!(x&0x10)] | (x&15); 

}

我该怎么办?我想我不明白char _ [2] [2] [2] [2]的含义是什么。

1 个答案:

答案 0 :(得分:2)

来自standard

  

标识符是一系列非数字字符(包括   下划线_,小写和大写拉丁字母等   字符)和数字,指定一个或多个实体   在6.2.1中描述。小写和大写字母是不同的。   标识符的最大长度没有特定限制。

所以是的,它是一个有效的标识符名称。它是4d阵列。

那么在这里做了什么 - 让我们一步一步走。如果_是数组,则[]内的那些是它的索引。

那么!是什么?来自standard

  

逻辑否定运算符!的结果是0,如果其操作数的值不等于01,如果其操作数的值比较等于0。结果的类型为int。表达式!E相当于(0==E)

因此它导致索引的值为0,1。嗯,这个多维数组中的所有数组的大小都是2。所以没关系 - 我们可以访问01的所有元素。

x是一个字符 - sizeof char1 - 1个字节。

x [0 0 0 0 1 0 1 0]

现在你执行x&0x80这只是And 0x80 - 1 0 0 0 0 0 0 0的结果。

所以基本上检查各自的数字并用char变量的值进行OR运算。

为什么char变量的值不是x&15

150x0F)为0000 1111,使用x的任何值对其进行处理将导致最后4位(LSB)x