"实际逆向工程"中的代码列表是否包含错误,或者我是否误解了循环结构?

Seb*_*lla 4 x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

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

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

  PFOO bar= ...;

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

但随着jz short loc_7F627F只会跳,如果EAX的含量为零不应该的...是之后jz,而不是之前jz?否则这将意味着我测试内容eax,是否为零,然后做一些未知的东西,然后跳转,如果它是零(假设没有其他指令包含在...影响ZF标志),这似乎不匹配C - 他们写的代码.

Joh*_*ica 5

这部分:

loc_7F627F:
inc ebx
cmp ebx, [edi]
jl short loop_start
Run Code Online (Sandbox Code Playgroud)

翻译为:

for(i= ?; i < bar->size; i++){
    //do something
    }
}
Run Code Online (Sandbox Code Playgroud)

这部分

mov eax, [edi+4]
mov eax, [eax+ebx*4]
test eax, eax
... //They also did the dots here
jz short loc_7F627F
Run Code Online (Sandbox Code Playgroud)

(不)转换为:

if(bar->array[i] != 0){
  ...
}
Run Code Online (Sandbox Code Playgroud)

你是对的.
...是否应该只执行array[i] <> 0,并因此...在装配的说法应该是之后jz skip_to_next_loop_iteration,而不是之前.

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