首页
社区
课程
招聘
[求助]哪位帮我看下这段代码具体都做了些什么,谢谢
发表于: 2008-11-18 12:19 3346

[求助]哪位帮我看下这段代码具体都做了些什么,谢谢

2008-11-18 12:19
3346
::00456000::  8B5424 0C                MOV EDX,DWORD PTR [ESP+C]               \:BYCALL
::00456004::  8B4C24 04                MOV ECX,DWORD PTR [ESP+4]               
::00456008::  85D2                     TEST EDX,EDX                           
::0045600A::  74 47                    JE SHORT 00456053                       \:JMPDOWN
::0045600C::  33C0                     XOR EAX,EAX                             
::0045600E::  8A4424 08                MOV AL,BYTE PTR [ESP+8]                 
::00456012::  57                       PUSH EDI                                
::00456013::  8BF9                     MOV EDI,ECX                             
::00456015::  83FA 04                  CMP EDX,4                              
::00456018::  72 2D                    JB SHORT 00456047                       \:JMPDOWN
::0045601A::  F7D9                     NEG ECX
::0045601C::  83E1 03                  AND ECX,3                              
::0045601F::  74 08                    JE SHORT 00456029                       \:JMPDOWN
::00456021::  2BD1                     SUB EDX,ECX                             
::00456023::  8807                     MOV BYTE PTR [EDI],AL                   \:BYJMP JmpBy:00456027,
::00456025::  47                       INC EDI                                 
::00456026::  49                       DEC ECX                                 
::00456027::  75 FA                    JNZ SHORT 00456023                      \:JMPUP
::00456029::  8BC8                     MOV ECX,EAX                             \:BYJMP JmpBy:0045601F,
::0045602B::  C1E0 08                  SHL EAX,8                              
::0045602E::  03C1                     ADD EAX,ECX                             
::00456030::  8BC8                     MOV ECX,EAX                             
::00456032::  C1E0 10                  SHL EAX,10                              
::00456035::  03C1                     ADD EAX,ECX                             
::00456037::  8BCA                     MOV ECX,EDX                             
::00456039::  83E2 03                  AND EDX,3                              
::0045603C::  C1E9 02                  SHR ECX,2                              
::0045603F::  74 06                    JE SHORT 00456047                       \:JMPDOWN
::00456041::  F3                       REP STOS DWORD PTR ES:[EDI]            
::00456042::  AB                       STOS DWORD PTR ES:[EDI]                 
::00456043::  85D2                     TEST EDX,EDX                           
::00456045::  74 06                    JE SHORT 0045604D                       \:JMPDOWN
::00456047::  8807                     MOV BYTE PTR [EDI],AL                   \:BYJMP JmpBy:00456018,0045603F,0045604B,
::00456049::  47                       INC EDI                                 
::0045604A::  4A                       DEC EDX                                 
::0045604B::  75 FA                    JNZ SHORT 00456047                      \:JMPUP
::0045604D::  8B4424 08                MOV EAX,DWORD PTR [ESP+8]               \:BYJMP JmpBy:00456045,
::00456051::  5F                       POP EDI                                 
::00456052::  C3                       RETN                                    
::00456053::  8B4424 04                MOV EAX,DWORD PTR [ESP+4]               \:BYJMP JmpBy:0045600A,
::00456057::  C3                       RETN

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
int v0; // edx@1
  int v1; // eax@2
  void *v2; // edi@2
  int v3; // ecx@3
  unsigned int v4; // ecx@6
  void *result; // eax@9
  unsigned int v6; // ecx@6
  int v7; // edi@7
  unsigned int  s; // [sp+Ch] [bp+0h]@1
  unsigned __int8 v9; // [sp+8h] [bp-4h]@2
  void *v10; // [sp+4h] [bp-8h]@2

  v0 =  s;
  if (  s )
  {
    v1 = v9;
    v2 = v10;
    if (  s < 4 )
      goto LABEL_13;
    v3 = -(signed int)v10 & 3;
    if ( v3 )
    {
      v0 =  s - v3;
      do
      {
        *(_BYTE *)v2 = v1;
        v2 = (char *)v2 + 1;
        --v3;
      }
      while ( v3 );
    }
    v1 *= 263425;
    v6 = v0;
    v0 &= 3u;
    v4 = v6 >> 2;
    if ( !v4 || (memset(v2, v1, 4 * v4), v7 = (int)((char *)v2 + 4 * v4), *(_DWORD *)v7 = v1, v2 = (void *)(v7 + 4), v0) )
    {
LABEL_13:
      do
      {
        *(_BYTE *)v2 = v1;
        v2 = (char *)v2 + 1;
        --v0;
      }
      while ( v0 );
    }
    result = v10;
  }
  else
  {
    result = v10;
  }
  return result;

邪恶的hexrays!
。。。。。。。。。。。。。。。
2008-11-18 13:25
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
这段代码是你分析出来的吗?这么复杂

LZ:
你贴的这段代码,大致上做这么个工作:

char * set_c(char *d, char c, int count)
{
         if (count == 0)
                    return d;

          while (count --)
                      *d++ = c;

          return c;
}

里面的具体做动确实复杂:
::0045601A::  F7D9                     NEG ECX
::0045601C::  83E1 03                  AND ECX,3                               
::0045601F::  74 08                    JE SHORT 00456029                       \:JMPDOWN
::00456021::  2BD1                     SUB EDX,ECX                             
::00456023::  8807                     MOV BYTE PTR [EDI],AL                   \:BYJMP JmpBy:00456027,
::00456025::  47                       INC EDI        

::00456026::  49                       DEC ECX         
::00456027::  75 FA                    JNZ SHORT 00456023                      \:JMPUP

以上这段代码目的是:将目标地写字符向上补足4字节边界

::00456029::  8BC8                     MOV ECX,EAX                             \:BYJMP JmpBy:0045601F,
::0045602B::  C1E0 08                  SHL EAX,8                              
::0045602E::  03C1                     ADD EAX,ECX                             
::00456030::  8BC8                     MOV ECX,EAX                             
::00456032::  C1E0 10                  SHL EAX,10                              
::00456035::  03C1                     ADD EAX,ECX                             
::00456037::  8BCA                     MOV ECX,EDX                             
::00456039::  83E2 03                  AND EDX,3                              
::0045603C::  C1E9 02                  SHR ECX,2                              
::0045603F::  74 06                    JE SHORT 00456047                       \:JMPDOWN
::00456041::  F3                       REP STOS DWORD PTR ES:[EDI]            
::00456042::  AB                       STOS DWORD PTR ES:[EDI]                 
::00456043::  85D2                     TEST EDX,EDX                           
::00456045::  74 06                    JE SHORT 0045604D                       \:JMPDOWN

这段代码是加述复制,以 dword 方式写
2008-11-18 23:46
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
char set_c(char *d, char c, int count)
{
        int count = arg3;
        char *d = arg1;
        char c = arg2;

        if (count == 0)
                return d;

        if (count < 4) {
                *d++ = c;
        } else {

                int i = d|3 ? (4-d|3) : 0;
                for (; i; i--)	                    
                        *d++ = c;   

                char cc[4] = { c, c, c, c };

                for (i = count/4; i; i--)
                        *((int *)d)++ = *((int *)cc);
        }

        return c;
}
2008-11-19 00:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
F5最强悍
2008-11-19 16:54
0
游客
登录 | 注册 方可回帖
返回