代码列在"实际逆向工程"包含错误,还是我误解了循环结构?

时间:2017-02-01 09:48:15

标签: assembly x86 reverse-engineering

我最近开始学习装配以进行逆向工程。我正在阅读Practical Reverse Engineering,并在那里看到了这个汇编代码:

loop_start:    
  mov eax, [edi+4]
  mov eax, [eax+ebx*4]
  test eax, eax
  ... //They also did the dots here
  jz short loc_7F627F
loc_7F627F:
  inc ebx
  cmp ebx, [edi]
  jl short loop_start

然后他们告诉我们这个信息应该给我们一个想法,把它反编译成这个(我正在做他们所做的所有点):

typedef struct _Foo
{
  DWORD size;
  DWORD array[...];} FOO, *PFOO;

  PFOO bar= ...;

  for(i= ...; i < bar->size; i++)
  {
    if(bar->array[i] != 0){
    ...
  }
}

但是jz short loc_7F627F只有在eax的内容为零时才会跳转,...不应该在jz之后而不是在jz之前?否则,这将意味着我测试eax的内容,是否为零,然后做一些未知的东西,如果它为零则稍后跳转(假设...中包含的其他指令没有影响{ {1}} flag),它似乎与他们编写的C代码不匹配。

1 个答案:

答案 0 :(得分:5)

这部分:

loc_7F627F:
inc ebx
cmp ebx, [edi]
jl short loop_start

转换为:

for(i= ?; i < bar->size; i++){
    //do something
    }
}

这部分

mov eax, [edi+4]
mov eax, [eax+ebx*4]
test eax, eax
... //They also did the dots here
jz short loc_7F627F

(不)转换为:

if(bar->array[i] != 0){
  ...
}

你是对的。
...只应在array[i] <> 0时执行,因此汇编语句中的...应位于jz skip_to_next_loop_iteration之后,而不是之前。

通常loc_7F627F之后也应该无条件跳转到...;但是在这种情况下,第一个...之后的代码可以直接进入for循环。