【问题标题】:Return value of obfuscation function混淆函数的返回值
【发布时间】:2018-01-20 15:24:44
【问题描述】:

我正在寻找这个函数的返回值:

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] 是什么意思。

【问题讨论】:

  • _ 是 4-D 阵列的标识符。
  • 好的!但是,我不知道如何继续。
  • 看第一个索引计算。如果设置了参数 x 的第 7 位,x&0x80 将为非 0。 ! 会将其减少为布尔值 01。另一个! 将反转它。因此表达式简化为01,它们是范围内的有效索引值。其他指数计算也是如此。
  • @LudovicoBessi.:检查答案

标签: c deobfuscation


【解决方案1】:

来自standard

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

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

那么这里还有什么要做的——让我们一步一步来。如果_ 是数组,那么[] 里面的就是它的索引。

那么! 是什么?来自standard

如果其操作数的值比较不等于0,则逻辑否定运算符! 的结果是0,如果其操作数的值比较等于0,则为1。结果的类型为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 变量的值进行或运算。

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

15 (0x0F) 是 0000 1111 并将它们与 x 的任何值相结合将导致最后 4 位 (LSB) x

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2020-12-29
    • 2013-09-25
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2013-07-11
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多