吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 332|回复: 2
收起左侧

[新手问题] 伪代码逻辑求助

[复制链接]
hkzxc1991 发表于 2024-10-22 11:01
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
int __fastcall main(int argc, const char **argv, const char **envp)
{
  char *v4; // rsi
  char src[8]; // [rsp+10h] [rbp-260h] BYREF
  __int64 v6; // [rsp+18h] [rbp-258h]
  _QWORD v7[2]; // [rsp+20h] [rbp-250h]
  char salt[2]; // [rsp+30h] [rbp-240h] BYREF
  char v9; // [rsp+32h] [rbp-23Eh]
  char v10[8]; // [rsp+40h] [rbp-230h] BYREF
  __int64 v11; // [rsp+48h] [rbp-228h]
  char s[8]; // [rsp+50h] [rbp-220h] BYREF
  __int64 v13; // [rsp+58h] [rbp-218h]
  char v14[256]; // [rsp+60h] [rbp-210h] BYREF
  char dest[8]; // [rsp+160h] [rbp-110h] BYREF
  __int64 v16; // [rsp+168h] [rbp-108h]
  __int64 v17; // [rsp+170h] [rbp-100h]
  __int64 v18; // [rsp+178h] [rbp-F8h]
  _BYTE v19[128]; // [rsp+180h] [rbp-F0h] BYREF
  _DWORD v20[18]; // [rsp+200h] [rbp-70h] BYREF
  char *v21; // [rsp+248h] [rbp-28h]
  int v22; // [rsp+250h] [rbp-20h]
  int v23; // [rsp+254h] [rbp-1Ch]
  __int64 v24; // [rsp+258h] [rbp-18h]
  int v25; // [rsp+260h] [rbp-10h]
  int v26; // [rsp+264h] [rbp-Ch]
  int v27; // [rsp+268h] [rbp-8h]
  int i; // [rsp+26Ch] [rbp-4h]
 
  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[0] = 0LL;
  v7[1] = 0LL;
  *(_QWORD *)src = 0LL;
  v6 = 0LL;
  v21 = 0LL;
 
    v21 = (char *)argv[1];
    v23 = strlen(argv[1]);
 
    strcpy(dest, &v21[v23 - 9]);
    salt[0] = bn_get_salt((unsigned int)(char)v16);
    salt[1] = bn_get_salt((unsigned int)dest[7]);
    v9 = 0;
    v4 = crypt(dest, salt);
    strcpy(s, v4);
    v22 = (char)v16 % 5;
    *((_BYTE *)v7 + v27) = v16;
    v20[v27++] = 0;
    *((_BYTE *)v7 + v27) = bgs((unsigned int)dest[7]);
    v20[v27++] = 1;
    for ( i = 8; 9 - v22 <= i; --i )
    {
    *((_BYTE *)v7 + v27) = bgs((unsigned int)dest[i]);
    v20[v27++] = 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[v27++] = i;
      }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

感谢大佬,我这分析试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-3-30 20:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表