首页
社区
课程
招聘
[求助]初学者,请高人对strlen函数的反汇编解释一下
发表于: 2008-8-31 22:53 6266

[求助]初学者,请高人对strlen函数的反汇编解释一下

2008-8-31 22:53
6266
以下是对strlen函数的反汇编,实在是看不明白.望记人解释一下,谢了.
0040150E  |.  51            push    ecx
0040150F  |.  E8 2C0A0000   call    CrackMeN.00401F40          :strlen()
...
00401F40  /$  8B4C24 04     mov     ecx, dword ptr [esp+4]           ;用户名的地址
00401F44  |.  F7C1 03000000 test    ecx, 3                           ;  
00401F4A  |.  74 14         je      short CrackMeN.00401F60
00401F4C  |>  8A01          /mov     al, byte ptr [ecx]
00401F4E  |.  41            |inc     ecx
00401F4F  |.  84C0          |test    al, al
00401F51  |.  74 40         |je      short CrackMeN.00401F93
00401F53  |.  F7C1 03000000 |test    ecx, 3
00401F59  |.^ 75 F1         \jnz     short CrackMeN.00401F4C
00401F5B  |.  05 00000000   add     eax, 0
00401F60  |>  8B01          /mov     eax, dword ptr [ecx]            ;  
00401F62  |.  BA FFFEFE7E   |mov     edx, 7EFEFEFF
00401F67  |.  03D0          |add     edx, eax
00401F69  |.  83F0 FF       |xor     eax, FFFFFFFF
00401F6C  |.  33C2          |xor     eax, edx
00401F6E  |.  83C1 04       |add     ecx, 4
00401F71  |.  A9 00010181   |test    eax, 81010100
00401F76  |.^ 74 E8         |je      short CrackMeN.00401F60
00401F78  |.  8B41 FC       |mov     eax, dword ptr [ecx-4]
00401F7B  |.  84C0          |test    al, al
00401F7D  |.  74 32         |je      short CrackMeN.00401FB1
00401F7F  |.  84E4          |test    ah, ah
00401F81  |.  74 24         |je      short CrackMeN.00401FA7
00401F83  |.  A9 0000FF00   |test    eax, 0FF0000
00401F88  |.  74 13         |je      short CrackMeN.00401F9D
00401F8A  |.  A9 000000FF   |test    eax, FF000000
00401F8F  |.  74 02         |je      short CrackMeN.00401F93
00401F91  |.^ EB CD         \jmp     short CrackMeN.00401F60
00401F93  |>  8D41 FF       lea     eax, dword ptr [ecx-1]
00401F96  |.  8B4C24 04     mov     ecx, dword ptr [esp+4]
00401F9A  |.  2BC1          sub     eax, ecx
00401F9C  |.  C3            retn

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
从头开始找第一个0x00
找到后,就用该字符指针减去首字符指针,得到长度。
2008-8-31 23:12
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
你可以参考一下这个:
http://bbs.0ginr.com/viewthread.php?tid=1163&highlight=strlen
2008-8-31 23:14
0
雪    币: 220
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上兄弟解答,谢谢,太感谢了,唉.
2008-8-31 23:28
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
5
0ginr那个LZ太恶搞了
2008-9-1 00:24
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
6
一次判断4个字节是否为0的算法,我最初看到那个东西的解释是在WINDOWS高效排错作者的BLOG里看到的

其实楼主自己将所有东西展开,一个一个字节思考,就明白了
2008-9-1 01:04
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7


天知道MS的那些人想什么。
2008-9-1 11:29
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
原理大家都知
写出来的东西不是人看的
2008-9-1 11:43
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我想问一下7EFEFEFFh 81010100h这组数字是固定的么?有什么规律?还有没有别的数字?
2008-9-1 13:53
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
10
http://blogs.msdn.com/lixiong/articles/687575.aspx

看回复,一直到末尾也有讨论的
2008-9-1 14:28
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我以前在《高效程序的奥秘》(Hacker's Delight)这本书上也见过一个类似的
放出来给大家看看

  其思路是把每个0字节转换成0x80,把每个非0字节转换成0x00,然后根据大端小端的不同,利用前导0或后导0数目指令计算
  
  nlz是求前导0,x86上应该是求后导0 (可以用bsf指令)

int zbytel (unsigned x) {
   unsigned y;
   int n;
                              ;// Original byte: 00 80 other
   y = (x & 0x7F7F7F7F) + 0x7F7F7F7F7F;       // 7F 7F 1xxxxxxx
   y = ~(y | x | 0x7F7F7F7F);                 // 80 00 00000000
   n = nlz(y) >> 3;                           // n = 0 ... 4, 4 if x
   return n;                                  // has no 0-byte
}
2008-9-1 16:37
0
雪    币: 29214
活跃值: (7724)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
12
学习楼上滴。
2008-9-2 00:43
0
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
13
膜拜一下,逆NT内核的时候,对CPUID中PAE的支持位就用到了这个bsr,当时没明白什么意思,现在懂了。
2008-9-2 00:47
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
14
汗,bsf这么好用,64位CPU可以改用这个汇编指令了。。。哪还用得着这么复杂的算法。。。
2008-9-2 01:52
0
游客
登录 | 注册 方可回帖
返回
//