首页
社区
课程
招聘
[求助]用IDA 逆向的一段代码 貌似很简单 看不懂……
发表于: 2010-2-24 10:40 7058

[求助]用IDA 逆向的一段代码 貌似很简单 看不懂……

2010-2-24 10:40
7058
__int16 __stdcall InitCmpData(int a1)
{
  int v1; // eax@1
  __int16 result; // ax@2
  int v3; // edx@3
  signed int v4; // ebx@3
  int v5; // edi@3
  int v6; // esi@3
  signed int v7; // edx@5
  signed int v8; // edx@7
  signed int v9; // eax@8

  v1 = a1;
  if ( a1 )
  {
    v5 = a1 + 204040;
    *(_BYTE *)(a1 + 204020) = 0;
    *(_BYTE *)(a1 + 204021) = 0;
    *(_WORD *)(a1 + 204022) = 0;
    *(_WORD *)(a1 + 204024) = 0;
    *(_WORD *)(a1 + 204026) = 0;
    *(_DWORD *)(a1 + 204028) = 0;
    *(_DWORD *)(a1 + 204032) = 0;
    *(_DWORD *)(a1 + 204036) = a1;
    v6 = a1 + 204040;
    v3 = a1 + 12000;
    v4 = 8;
    do
    {
      *(_DWORD *)v6 = v3;
      v6 += 4;
      v3 += 24002;
      --v4;
    }
    while ( v4 );
    v7 = 0;
    do
    {
      *(_WORD *)(*(_DWORD *)(v1 + 204036) + v7) = 0;
      v7 += 2;
    }
    while ( v7 < 12000 );
    v8 = 8;
    do
    {
      v9 = 0;
      do
      {
        *(_WORD *)(v9 + *(_DWORD *)v5) = 0;
        v9 += 2;
      }
      while ( v9 < 24000 );
      v5 += 4;
      --v8;
    }
    while ( v8 );
    result = 0;
  }
  else
  {
    result = -1;
  }
  return result;
}
望指点指点……

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
看到这个F5 我欣慰多了.
原来以前看到的F5都是人家手工整理好的...
2010-2-24 10:46
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看了老半天,发现这个函数的功能已经在函数名字上表现出来了……Initialization
2010-2-24 11:36
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是不是初始化了一个数组啊 那传入的是个什么东西啊?
2010-2-24 12:12
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
5
看不明白,真郁闷
2010-2-24 12:19
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
地址
2010-2-24 14:56
0
雪    币: 13039
活跃值: (4037)
能力值: ( LV15,RANK:1673 )
在线值:
发帖
回帖
粉丝
7
昨天偶才在自己的机器F5出来东东...的确没有别人贴出来的好看...
之前因为没有Patch那个插件...按了N+1次传说中的F5也没有反应...
2010-2-24 17:16
0
雪    币: 186
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还是要手动整理才好看. 比如, 传进来的参数应该是 一个 指针, 204020, 204040 这段地方比较关键.

*(_WORD *)(*(_DWORD *)(v1 + 204036) + v7) = 0;

这样的语句太变态了, 看起来应该是 数据结构中的 结构指针 这样的嵌套, 如果不整理一下, 阅读太费劲.
2010-3-2 00:45
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是……唉太BT^^
2010-3-2 10:03
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
哪位给个F5后的代码阅读教程?
2010-3-3 23:35
0
雪    币: 292
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
ida直接f5还不如直接看汇编。至少你要将变量名优化一下。
“*(_WORD *)(*(_DWORD *)(v1 + 204036) + v7) = 0”这样的语句只要你c++学好,应该能读懂的。v1,v7这里都是指针。变量前面的类似“(_DWORD *)”的是强制类型转换。最前面“*”表示解引用。本人的理解是这样。
2010-3-3 23:59
1
雪    币: 353
活跃值: (57)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
别用F5了,比汇编还难懂
给你重构一个看看对不对。
short __stdcall InitCmpData(BYTE *buf)
{
        if(!buf)
        {
                return -1;
        }

        memset(buf+204020,0,16);
        *(DWORD *)(buf + 204036) = (DWORD)buf;//reference to self?
        DWORD *p1 = (DWORD *)(buf + 204040);
        DWORD v3 = (DWORD)(buf + 12000);
        for(int i=8;i--;v3+=12001)
        {
                *p1++ = v3;
        }

        //DWORD *p2 = (WORD *)*(DWORD *)(buf + 204036);//p2 == buf
        //for(int i=0;i<12000;)
        //{
        //        p2[i++] = 0;
        //}
        memset(buf,0,12000*2);

        //WORD *p3;
        //p1 = (DWORD *)(buf + 204040);
        //for(int i=8;i--;)
        //{
        //        p3 = (WORD *)*p1++;
        //        for(int j=0;j<12000;j--)
        //        {
        //                *p3++ = 0;
        //        }
        //}
        WORD *p3 = (WORD *)(buf + 12000);
        for(int i=8;i--;)
        {
                memset(p3,0,12000*sizeof(*p3));
                p3 += 12001;
        }

        return 0;
}
2010-3-4 12:39
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
3Q…… 啊 原来传入的是byte流啊
2010-3-5 18:19
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看12楼的终于能明白是什么意思了
2010-3-5 20:49
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
F5只是心理安慰啊,还不如看原来的……
2010-3-8 08:55
0
游客
登录 | 注册 方可回帖
返回
//