首页
社区
课程
招聘
[求助]逆向学习日记2011.04.29
发表于: 2011-4-29 18:37 7662

[求助]逆向学习日记2011.04.29

2011-4-29 18:37
7662
mov edi, edi
push ebp
mov ebp, esp
xor eax, eax
cmp [ebp+arg_4], eax
jnz short loc_1001019
mov eax, 0C000000Dh
jmp short loc_100103F
mov edx, [ebp+arg_0]
push esi
mov esi, [ebp+arg_8]
mov cl, [esi]
test cl, cl
jz short loc_100102F
mov [edx], cl
inc edx 
inc esi
dec [ebp+arg_4]
jnz short loc_1001020
cmp [ebp+arg_4], 0 
pop esi
jnz short loc_100103C
dec edx
mov eax, 80000005h
mov byte ptr [edx], 0
pop ebp
retn 0Ch


上面的汇编代码.我反C成下面这样.是否正确

如不正确,希望前辈们.能指导下


NTSTATUS WINAPI FirstFunction(PCHAR Destination,ULONG Size,PCHAR Source)
{
  NTSTATUS NTstatus=STATUS_SUCCESS;
  if (Size!=0)
  {
    while(*Source!=0)
    {
      *Destination=*Source;
      Destination++;
      Source++;
      Size--;
      if (Size==0)
      {
        Destination--;
        return 0x80000005;
      }
    }
    *Destination=0;
  }
  else
  {
    return 0xC000000D;
  }
  return NTstatus;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
for( ; *(int*)Param3!= NULL ; )
{
    *(int*)Param1= *Param3;
    Param1++;
    Param3++;
    Param2--;
}
PS:我的理解,不完全对,希望能帮上你
2011-4-29 20:07
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
3
char *strncpy(
      char *strDest,                       ;arg_0
      size_t count                            ;arg_4
      const char *strSource,           ;arg_8

);
复制 count 个 strSource->strDest、遇零提前结束..
2011-4-29 20:14
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你是说  这是一个字符串比较函数 ??
2011-4-29 20:54
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
5
cpy  不是字符串比较的意思哦.......字符串复制可以表现成这样
具体当然要看你的整体..
2011-4-29 21:16
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
噢.我没太注意你滴函数名...我滴意思是:你想说明滴是这个函数大概是一个字符串处理相关滴...

参1和参3滴循环方式.您能给指教一下嘛?
2011-4-30 08:06
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
RTL 有那么多字符串处理函数...难道不好?

这驱动要自己写???

很不解
2011-4-30 09:24
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
NTSTATUS fun(char *d, int c, char *s)
{
        NTSTATUS status = 0;

        if (c == 0) {
                return 0xc000000d;
        }

        while (*s && c) {        
                *d++ = *s++;
                c--;
        }

        if (c == 0) {
                d--;
                status = 0x80000005;
        }
        
        *d = '\0';

        return status;
}
2011-4-30 09:26
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
一个函数 2次判断 C==0 是不是不太合理呢? 0xc000000d是缓冲区溢出。

而0x80000005是参数无效。。同样一个C==0 却有两种结果。是不是不太符合逻辑呢?
2011-4-30 09:38
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10


1. 我只是将 assembly  转为 C,至于它是逻辑思想,你要问作者

2. 两次判断 c == 0, 它的情境不一样,作用当然也不一样了。
2011-4-30 09:51
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
符合逻辑的反编译才是成功的嘛...

相信作者不会这样表达吧?
2011-4-30 10:00
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
我真服你了

1. 你不但 assembly 看不明白,你也 c 也看不明白

代码明明摆在那里,你看不懂吗? c 代码表达的两次判断是意思完全不一样,你看不懂?

2. 0xC000000D 是无效参数错误,0x80000005 是缓冲区溢出错误。

拜托,看看文档才下结论。

// MessageId: STATUS_INVALID_PARAMETER
//
// MessageText:
//
// An invalid parameter was passed to a service or function.
//
#define STATUS_INVALID_PARAMETER         ((NTSTATUS)0xC000000DL)    // winnt

// MessageId: STATUS_BUFFER_OVERFLOW
//
// MessageText:
//
// {Buffer Overflow}
// The data was too large to fit into the specified buffer.
//
#define STATUS_BUFFER_OVERFLOW           ((NTSTATUS)0x80000005L)

这个贴我不再回了。
2011-4-30 10:22
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
看明白啦.2次确实意义不同...

您别激动.我并没有怀疑您能力的意思...这不是因为水平不够...所以来请教嘛...希望能多学习些

如果因为我的表达和一些用词让您感到反感.那我向你道歉...

同时感谢你的帮助.
2011-4-30 10:37
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
劫杀路过大牛
2011-4-30 17:55
0
游客
登录 | 注册 方可回帖
返回
//