首页
社区
课程
招聘
[旧帖] 请问有谁知道这段代码的含义? 0.00雪花
发表于: 2007-2-2 12:19 3645

[旧帖] 请问有谁知道这段代码的含义? 0.00雪花

2007-2-2 12:19
3645
请问有谁知道call 00401630代码的含义,它是如何计算出长度的?

代码如下:

004010BD    8D85 48FFFFF>lea eax,dword ptr ss:[ebp-B8]    ; 用户名(ASCII "pediy")
004010C3    50           push eax
004010C4    E8 67050000  call 00401630                ; 计算用户名的长度
004010C9    59           pop ecx                          ; 返回用户名长度 eax=5       
004010CA    8945 D8      mov dword ptr ss:[ebp-28],eax   

CALL 00401630:

00401630    8B4424 04    mov eax,dword ptr ss:[esp+4]
00401634    A8 03        test al,3
00401636    75 2D        jnz short 00401665
00401638    8B10         mov edx,dword ptr ds:[eax]
0040163A    83C0 04      add eax,4
0040163D    8BCA         mov ecx,edx
0040163F    81EA 0101010>sub edx,1010101                  ; ASCII "[ "
00401645    81E2 8080808>and edx,80808080
0040164B  ^ 74 EB        je short 00401638
0040164D    F7D1         not ecx
0040164F    23D1         and edx,ecx
00401651  ^ 74 E5        je short 00401638
00401653    84D2         test dl,dl
00401655    75 28        jnz short 0040167F
00401657    84F6         test dh,dh
00401659    75 25        jnz short 00401680
0040165B    F7C2 0000FF0>test edx,0FF0000
00401661    75 1E        jnz short 00401681
00401663    EB 1D        jmp short 00401682
00401665    83C0 04      add eax,4
00401668    F640 FC FF   test byte ptr ds:[eax-4],0FF
0040166C    74 11        je short 0040167F
0040166E    F640 FD FF   test byte ptr ds:[eax-3],0FF
00401672    74 0C        je short 00401680
00401674    F640 FE FF   test byte ptr ds:[eax-2],0FF
00401678    74 07        je short 00401681
0040167A    48           dec eax
0040167B    24 FC        and al,0FC
0040167D  ^ EB B9        jmp short 00401638
0040167F    48           dec eax
00401680    48           dec eax
00401681    48           dec eax
00401682    8B4C24 04    mov ecx,dword ptr ss:[esp+4]
00401686    48           dec eax
00401687    2BC1         sub eax,ecx
00401689    C3           retn

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
int mystrlen(char *addr)
{
        char *addrbak = addr;

        if (0 != ((int)addr % 4))
        {
                if (0 == *(addr)) return 0;
                if (0 == *(addr+1)) return 1;
                if (0 == *(addr+2)) return 2;
        }
        addr = (char *)(((int)(addr+3))/4*4);  //向上 4字节对齐

        //下面是技巧提速代码
        for(; ;)
        {
                int dword1, dword2;
                dword2 = dword1 = *(int *)addr;
                addr += 4;
                dword1 -= 0x01010101;
                dword1 &= 0x80808080;
                if (0 == dword1 )  continue;
                dword2 = ~dword2;
                dword1 &= dword2;
                if (0 == dword1 ) continue;

                if (0 != ((dword1 << 24) >> 24)) return addr-addrbak - 4;
                if (0 != ((dword1 << 16) >> 24)) return addr-addrbak - 3;
                if (0 != ((dword1 << 8) >> 24)) return addr-addrbak - 2;
                return addr-addrbak - 1;
        }

}
2007-2-3 14:35
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
dword1 -= 0x01010101;
   dword1 &= 0x80808080;
   if (0 == dword1 )  continue;
   dword2 = ~dword2;
   dword1 &= dword2;
   if (0 == dword1 ) continue;

这段代码可能不太好理解. 其实工作原理如下.

考虑一个字节.
char a = ??;
a -= 1;

这个时候, 如果a的最高位为1 (a & 0x80 != 0),
有2中情况会导致:
1:   a最高位本来就为1.
2:   a为0, 那么减了1以后,为0xff导致.
如果a的最高位不为1, a原来肯定是一个非0值.
可以continue(第一个continue)

我们的出口条件是2, 对于1这种情况需要过滤掉.
怎么过滤呢, 很简单. 只要看在没减1之前, 最高位
是不是为1即可.
减1后的值的最高位和原来没减1之前的最高位进行下and
操作, 如果原来最高位就为1, 那么就会是一个0值。
可以continue(第二个continue)

于是, 我们推出了. 这个时候要找到是4个字节里面
哪个字节因为是0导致了最高位被置位了.  这个技巧
便是从最低字节查找. 原因是有一种特殊情况存在.
=========
因为置1导致了高一个字节的最高位也被置1.
01 00
-
01 01
=
ff ff
=========
所以只要找第一个为置1的.

    if (0 != ((dword1 << 24) >> 24)) return addr-addrbak - 4;
    if (0 != ((dword1 << 16) >> 24)) return addr-addrbak - 3;
    if (0 != ((dword1 << 8) >> 24)) return addr-addrbak - 2;
2007-2-3 14:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢jjnet热情解答!
2007-2-3 16:38
0
雪    币: 9
活跃值: (127)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
5
够深傲的.......
2007-2-5 08:13
0
游客
登录 | 注册 方可回帖
返回
//