首页
社区
课程
招聘
请教IDA 伪C代码
发表于: 2011-11-6 19:15 5907

请教IDA 伪C代码

2011-11-6 19:15
5907
转出来伪C代码中有一些 符号的标识不懂,请大大们帮忙解说一下!
代码如下:

int __cdecl sub_10003130(char *a1, char *a2)
{
  char *v2; // eax@1
  char v3; // cl@2
  char *v4; // eax@3
  char v5; // cl@4
  char buf[2]; // [sp+8h] [bp-90h]@1
  __int16 v8; // [sp+Ah] [bp-8Eh]@1
  char v9[64]; // [sp+Ch] [bp-8Ch]@2
  char v10[72]; // [sp+4Ch] [bp-4Ch]@4
  int v11; // [sp+94h] [bp-4h]@1

  v11 = dword_10021340;
  memset(buf, 0, 0x84u);
  v2 = a1;
  strcpy(buf, "?);
  v8 = 8193;
  do
  {
    v3 = *v2;
    v2[v9 - a1] = *v2;
    ++v2;
  }
  while ( v3 );
  v4 = a2;
  do
  {
    v5 = *v4;
    v4[v10 - a2] = *v4;
    ++v4;
  }
  while ( v5 );
  return sub_10002BA0(buf, *(unsigned __int16 *)buf, 0);
}

比如说上面的++v2; 和 ++v4; 是什么意思?

int __cdecl sub_10002BA0(const char *buf, int len, int flags)
{
  int result; // eax@2
  int v4; // [sp+0h] [bp-10h]@1
  char v5; // [sp+4h] [bp-Ch]@1
  char v6; // [sp+5h] [bp-Bh]@1
  char v7; // [sp+6h] [bp-Ah]@1
  char v8; // [sp+7h] [bp-9h]@1
  char v9; // [sp+8h] [bp-8h]@1
  char v10; // [sp+9h] [bp-7h]@1
  char v11; // [sp+Ah] [bp-6h]@1
  char v12; // [sp+Bh] [bp-5h]@1
  int v13; // [sp+Ch] [bp-4h]@1

  v13 = dword_10021340;
  v5 = 77;
  v6 = 97;
  v7 = 103;
  v8 = 105;
  v9 = 99;
  v10 = 115;
  v11 = 67;
  v12 = 79;
  v4 = 0;
  if ( dword_1002A684 )
  {
    if ( len - 4 > 0 )
      sub_10011AF0((int)(buf + 4), (int)(buf + 4), (int *)(len - 4), (int)&unk_1002A740, (int)&v5, &v4, 1);
    result = send(s, buf, len, flags);
  }
  else
  {
    result = 0;
  }
  return result;
}

这里的(int)&v5
&是什么意思?
附值?

[QUOTE]
int *__cdecl sub_10011AF0(int a1, int a2, int *a3, int a4, int a5, int *a6, int a7)
{
  int *result; // eax@1
  int v8; // esi@1
  int v9; // ebx@3
  int v10; // edx@5
  int v11; // ecx@5
  int v12; // edx@5
  int v13; // ecx@5
  unsigned int v14; // ecx@5
  unsigned int v15; // ecx@5
  char v16; // al@6
  char v17; // zf@6
  int v18; // ebx@9
  int v19; // edx@11
  int v20; // ecx@11
  int v21; // edx@11
  int v22; // ecx@11
  unsigned int v23; // ecx@11
  unsigned int v24; // ecx@11
  char v25; // al@12
  char v26; // cl@12
  char v27; // zf@12
  int v28; // [sp+10h] [bp-8h]@5
  int v29; // [sp+14h] [bp-4h]@5

  v8 = *a6;
  result = a3;
  if ( a7 )
  {
    if ( a3 )
    {
      v9 = a1;
      do
      {
        if ( !v8 )
        {
          v10 = 0;
          *(_WORD *)((char *)&v10 + 1) = *(_BYTE *)(a5 + 1);
          v11 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | v10 | *(_BYTE *)a5;
          v12 = 0;
          *(_WORD *)((char *)&v12 + 1) = *(_BYTE *)(a5 + 5);
          v28 = v11;
          v13 = v12 | *(_BYTE *)(a5 + 4);
          BYTE3(v12) = 0;
          *(_WORD *)((char *)&v12 + 1) = *(_BYTE *)(a5 + 7);
          LOBYTE(v12) = *(_BYTE *)(a5 + 6);
          v29 = v13 | (v12 << 16);
          sub_10011630(&v28, a4);
          v14 = v28;
          *(_BYTE *)a5 = v28;
          *(_BYTE *)(a5 + 1) = BYTE1(v14);
          *(_BYTE *)(a5 + 2) = v14 >> 16;
          *(_BYTE *)(a5 + 3) = v14 >> 24;
          v15 = v29;
          *(_BYTE *)(a5 + 4) = v29;
          *(_BYTE *)(a5 + 5) = BYTE1(v15);
          *(_BYTE *)(a5 + 6) = v15 >> 16;
          *(_BYTE *)(a5 + 7) = v15 >> 24;
        }
        v16 = *(_BYTE *)(v8 + a5) ^ *(_BYTE *)v9;
        *(_BYTE *)a2 = v16;
        ++v9;
        *(_BYTE *)(v8 + a5) = v16;
        v8 = (v8 + 1) & 7;
        v17 = a3 == (int *)1;
        ++a2;
        a3 = (int *)((char *)a3 - 1);
      }
      while ( !v17 );
      result = a6;
      *a6 = v8;
      return result;
    }
LABEL_14:
    *a6 = v8;
    return result;
  }
  if ( !a3 )
    goto LABEL_14;
  v18 = a1;
  do
  {
    if ( !v8 )
    {
      v19 = 0;
      *(_WORD *)((char *)&v19 + 1) = *(_BYTE *)(a5 + 1);
      v20 = (*(_BYTE *)(a5 + 3) << 24) | (*(_BYTE *)(a5 + 2) << 16) | v19 | *(_BYTE *)a5;
      v21 = 0;
      *(_WORD *)((char *)&v21 + 1) = *(_BYTE *)(a5 + 5);
      v28 = v20;
      v22 = v21 | *(_BYTE *)(a5 + 4);
      BYTE3(v21) = 0;
      *(_WORD *)((char *)&v21 + 1) = *(_BYTE *)(a5 + 7);
      LOBYTE(v21) = *(_BYTE *)(a5 + 6);
      v29 = v22 | (v21 << 16);
      sub_10011630(&v28, a4);
      v23 = v28;
      *(_BYTE *)a5 = v28;
      *(_BYTE *)(a5 + 1) = BYTE1(v23);
      *(_BYTE *)(a5 + 2) = v23 >> 16;
      *(_BYTE *)(a5 + 3) = v23 >> 24;
      v24 = v29;
      *(_BYTE *)(a5 + 4) = v29;
      *(_BYTE *)(a5 + 5) = BYTE1(v24);
      *(_BYTE *)(a5 + 6) = v24 >> 16;
      *(_BYTE *)(a5 + 7) = v24 >> 24;
    }
    v25 = *(_BYTE *)v18;
    v26 = *(_BYTE *)(v8 + a5);
    *(_BYTE *)(v8 + a5) = *(_BYTE *)v18++;
    *(_BYTE *)a2 = v26 ^ v25;
    v8 = (v8 + 1) & 7;
    v27 = a3 == (int *)1;
    ++a2;
    a3 = (int *)((char *)a3 - 1);
  }
  while ( !v27 );
  result = a6;
  *a6 = v8;
  return result;
}


*a6 = v8;的*号 也是附值?还是?

这三个函数是一个登陆过程中的加密和发送函数。。。
如果可以请大大们帮忙写出来让我们学习一下

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
C++  里面的吧
i++,++i
&取地址
*可以理解成地址的值
2011-11-6 20:48
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主还是最起码的先把 C语言指针 给看懂吧。
2011-11-6 22:05
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
比如说上面的++v2; 和 ++v4; 是什么意思?
自加运算 执行后 v2/v4 值会加 1

这里的(int)&v5[QUOTE]的&是什么意思?
取地址运算符

*a6 = v8;的*号 也是附值?还是?
和&运算符相对, 一般情况下 在=左边 为存内容, 在右边取内容

建议先好好学学c吧
2011-11-7 17:36
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
小小心意呀...
虽然看懂了一点,可是还是没有办法转成DELPHI的...
2011-11-8 01:06
0
游客
登录 | 注册 方可回帖
返回
//