在汇编中解密二进制文件

时间:2014-07-30 08:40:17

标签: c assembly

我正在处理一个赋值的一部分,它要求我确定哪些参数传递给函数以跳过某个函数。这是有问题的汇编代码。

这是函数的开始,它将一个参数移动到eax并执行算术:

  0x080499ca <+0>:  push   %ebp
  0x080499cb <+1>:  mov    %esp,%ebp
  0x080499cd <+3>:  sub    $0x8,%esp
  0x080499d0 <+6>:  mov    0x8(%ebp),%eax
  0x080499d3 <+9>:  sub    $0x37,%eax // subtract 55
  0x080499d6 <+12>: cmp    $0x13,%eax // compare against 19 
  0x080499d9 <+15>: ja     0x8049a4a <transform+128>

开始时,movzbl函数将值0x804(并将其扩展为零)移动到寄存器中。二进制值为:001000000001001101001000111000

“xor”将此值与常量1进行比较。测试采用eax的最低8位,即寄存器,使用此新值:

0x08049a4a <+128>:  movzbl 0x804d238,%eax
0x08049a51 <+135>:  xor    $0x1,%eax
0x08049a54 <+138>:  test   %al,%al
0x08049a56 <+140>:  je     0x8049a5d <transform+147>

如果设置了ZFLAG,那么它会跳转(这就是我想要的)。我不知道为什么每次都使用相同的值,根据我传入WHOLE函数的参数,标志会有所不同。它似乎应该每次都提供相同的结果。为什么有时标志正在设置,有时它没有被设置?

另外,我可以在参数中添加什么值以确保它跳转?

1 个答案:

答案 0 :(得分:0)

因此...

0x08049a4a <+128>:  movzbl 0x804d238,%eax
0x08049a51 <+135>:  xor    $0x1,%eax
0x08049a54 <+138>:  test   %al,%al
0x08049a56 <+140>:  je     0x8049a5d <transform+147>

... xor $0x01翻转加载到%eax的值的第0位; test %al, %al ands %al与它自己(丢弃结果,但保持对标志的影响);因此如果je为零,则会%al。那就是......如果((value ^ 1) & 0xFF) == 0,将会跳转。