hkzxc1991 发表于 2024-10-22 11:01

伪代码逻辑求助

int __fastcall main(int argc, const char **argv, const char **envp)
{
char *v4; // rsi
char src; // BYREF
__int64 v6; //
_QWORD v7; //
char salt; // BYREF
char v9; //
char v10; // BYREF
__int64 v11; //
char s; // BYREF
__int64 v13; //
char v14; // BYREF
char dest; // BYREF
__int64 v16; //
__int64 v17; //
__int64 v18; //
_BYTE v19; // BYREF
_DWORD v20; // BYREF
char *v21; //
int v22; //
int v23; //
__int64 v24; //
int v25; //
int v26; //
int v27; //
int i; //

v25 = 0;
v24 = 0LL;
memset(v20, 0, 0x40uLL);
memset(v19, 0, sizeof(v19));
*(_QWORD *)dest = 0LL;
v16 = 0LL;
v17 = 0LL;
v18 = 0LL;
memset(v14, 0, sizeof(v14));
i = 0;
v27 = 0;
v23 = 0;
v22 = 0;
v26 = 0;
*(_QWORD *)s = 0LL;
v13 = 0LL;
*(_QWORD *)v10 = 0LL;
v11 = 0LL;
*(_WORD *)salt = 0;
v9 = 0;
v7 = 0LL;
v7 = 0LL;
*(_QWORD *)src = 0LL;
v6 = 0LL;
v21 = 0LL;

    v21 = (char *)argv;
    v23 = strlen(argv);

    strcpy(dest, &v21);
    salt = bn_get_salt((unsigned int)(char)v16);
    salt = bn_get_salt((unsigned int)dest);
    v9 = 0;
    v4 = crypt(dest, salt);
    strcpy(s, v4);
    v22 = (char)v16 % 5;
    *((_BYTE *)v7 + v27) = v16;
    v20 = 0;
    *((_BYTE *)v7 + v27) = bgs((unsigned int)dest);
    v20 = 1;
    for ( i = 8; 9 - v22 <= i; --i )
    {
    *((_BYTE *)v7 + v27) = bgs((unsigned int)dest);
    v20 = i;
    }
}
上面是用ida反编译看到的伪代码,这里有个疑问v16和v22都初始值为0,v22 = (char)v16 % 5;得到的也是0,那么 下面这个循环永远也不会进,这有啥意义呢?是反编译生成的伪代码有问题么?
for ( i = 8; 9 - v22 <= i; --i )
      {
      *((_BYTE *)v7 + v27) = bn_get_sepcial((unsigned int)dest);
      v20 = i;
      }

wonder2018 发表于 2024-11-13 18:41

反编译的代码里面有很多内存拷贝,建议分析一下拷贝来源(argv)的真实长度。
注意到dest,v16,v17,v18使用的内存地址是连续的,可能会在往dest中拷贝数据时被修改。
这是ida反汇编代码中比较常见的问题。可能由于原始代码进行了一些复杂的指针和变量类型转换,导致ida反汇编的时候以为他们是不同的变量。

hkzxc1991 发表于 2024-11-14 08:10

wonder2018 发表于 2024-11-13 18:41
反编译的代码里面有很多内存拷贝,建议分析一下拷贝来源(argv)的真实长度。
注意到dest,v16,v17,v18 ...

感谢大佬,我这分析试试
页: [1]
查看完整版本: 伪代码逻辑求助