Reverse Engineering challenge #2

    最近思考了一下,为何我逆向很吃劲儿...学习

    我以为这是逆向工程自己就决定了的,它的问题牵扯知识范围广阔,并且没有一个特别丰富的学习路线+资料,当你做为菜鸟入门的时候很容易由于知识盲区的过多而陷入困境,同时,逆向的工做语言几乎是ASM,而这也是咱们大多数人的弱项,致使咱们抽象反汇编代码时能力严重不足,以上缘由让咱们面临一个陡峭的学习曲线,也正是咱们沮丧的缘由,可是,几乎全部的逆向教程都强调了“耐心”+“坚持”。耐心的坚持,不单单逆向须要,生活也须要,乃人生之本。this

    #2---What does this code do ? (PS:Optimizing GCC 4.8.2 -M32)3d

0:          mov    eax,DWORD PTR [esp+0x4]
   4:          bswap  eax
   6:          mov    edx,eax
   8:          and    eax,0xf0f0f0f
   d:          and    edx,0xf0f0f0f0
  13:          shr    edx,0x4
  16:          shl    eax,0x4
  19:          or     eax,edx
  1b:          mov    edx,eax
  1d:          and    eax,0x33333333
  22:          and    edx,0xcccccccc
  28:          shr    edx,0x2
  2b:          shl    eax,0x2
  2e:          or     eax,edx
  30:          mov    edx,eax
  32:          and    eax,0x55555555
  37:          and    edx,0xaaaaaaaa
  3d:          add    eax,eax
  3f:          shr    edx,1
  41:          or     eax,edx
  43:          ret
  1. bswap eax指令将eax中的字节次序变反
  2. and eax,0x0F0F0F0F取出字节中的低4位;and edx,0xF0F0F0F0取出字节中的高4位;shr edx,4;shl eax,4;or eax,edx是让低4位和高4位调转位置存储,即低4位变成高4位,高4位变成低4位
  3. 同理,and eax,0x33333333....or eax,edx,则是让半字节中的高2位和低2位调转位置存储;and eax,0x55555555...or eax,edx,也是让1/4字节中的高1位和低1位调转位置存储
  4. 最后可推出,eax二进制位次序变反
相关文章
相关标签/搜索