Сборка для понимания псевдокода

Я пытаюсь перевернуть исполняемый файл (для изучения RE), однако я застрял на кусочке псевдокода, в котором есть некоторые вещи, которые я не понимаю. Пожалуйста, помогите мне понять это, чтобы я мог улучшить. Теперь я понимаю, что существует массив с номером от 32 до 2014-й записи, а с 2014-й до 4095-й записи есть коды символов, возвращаемые fget. После этого есть небольшой фрагмент кода, который я не могу понять, блок помечен **.

Код:

int sub_12A11A0()
{
  __int16 v1; // [sp+4h] [bp-24h]@13
  int v2; // [sp+8h] [bp-20h]@11
  int v3; // [sp+Ch] [bp-1Ch]@8
  signed int v4; // [sp+10h] [bp-18h]@13
  signed int l; // [sp+14h] [bp-14h]@16
  int v6; // [sp+18h] [bp-10h]@6
  int v7; // [sp+18h] [bp-10h]@13
  int v8; // [sp+18h] [bp-10h]@32
  signed int v9; // [sp+1Ch] [bp-Ch]@8
  signed int v10; // [sp+20h] [bp-8h]@8
  signed int i; // [sp+24h] [bp-4h]@1
  signed int j; // [sp+24h] [bp-4h]@4
  int k; // [sp+24h] [bp-4h]@13
  signed int m; // [sp+24h] [bp-4h]@27

  for ( i = 0; i < 2015; ++i )
    byte_12A3400[i] = 32;     
  for ( j = 2015; j < 4096; ++j )
  {
    v6 = fgetc(dword_12A33EC);
    if ( v6 == -1 )
      break;
    byte_12A3400[j] = v6;
    ++dword_12A3088;
  }
  v9 = j;
  v10 = 2015;
  v3 = 0;
  while ( v10 < v9 )
  {
    if ( v9 - v10 < 33 )
      v2 = v9 - v10;
    else
      v2 = 33;
    v1 = 0;
    v4 = 1;
    ****v7 = (unsigned __int8)byte_12A3400[v10];
    for ( k = v10 - 1; k >= v3; --k )
    {
      if ( (unsigned __int8)byte_12A3400[k] == v7 )
      {
        for ( l = 1; l < v2 && (unsigned __int8)*(&byte_12A3400[l] + k) == (unsigned __int8)*(&byte_12A3400[l] + v10); ++l )
          ;
        if ( l > v4 )
        {
          v1 = k;
          v4 = l;
        }
      }
    }****
    if ( v4 > 1 )
      sub_12A1120(v1 & 0x7FF, v4 - 2);
    else
      sub_12A10D0(v7);
    v10 += v4;
    v3 += v4;
    if ( v10 >= 4063 )
    {
      for ( m = 0; m < 2048; ++m )
        byte_12A3400[m] = byte_12A3C00[m];
      v9 -= 2048;
      v10 -= 2048;
      v3 -= 2048;
      while ( v9 < 4096 )
      {
        v8 = fgetc(dword_12A33EC);
        if ( v8 == -1 )
          break;
        byte_12A3400[v9++] = v8;
        ++dword_12A3088;
      }
    }
  }
  return sub_12A1090();
}

1 ответ

Решение

Кажется, важная часть, чтобы понять

*(&byte_12A3400[l] + k)

Это эквивалентно

byte_12A3400[l + k]
Другие вопросы по тегам