2017-07-31 83 views
0

我想扭转一个可执行文件(用于学习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(); 
} 
+0

对我来说,目前还不清楚你问什么?你在哪里得到了来自asm代码的*伪代码(这不包括在问题中),你是什么意思*帮助我理解*?了解什么水平?你想匹配一些算法还是需要逐行描述代码或什么? – grek40

+0

嗨我正在使用IDA通过程序集追踪程序,当我达到这个功能时,我按下了生成此pseduocode的选项卡。对于(l = 1; l

+0

只需索引某个数组,例如foo [l] [k] == foo [l] [v10]' – Jester

回答

1

看来重要组成部分,是了解

*(&byte_12A3400[l] + k) 

这相当于

byte_12A3400[l + k] 
+0

非常感谢 –