本来想在这个帖子里回个帖http://bbs.pediy.com/showthread.php?t=144053,奈何还是临时会员 5555
00406284-0040628B 地址分别对应的16进制数位 00406284 6E 61 6D 65 6C 65 73 73 对应的ASCII码为“ nameless”
esi=406284 既esi所处的地址为406284存贮的字符就为第一个字母n
eax=8;edx=0;ecx=0
算法部分:
004011FE |> /0FBE06 /movsx eax,byte ptr ds:[esi] //将esi地址数据传值给eax,即eax=6E
00401201 |. |8BD8 |mov ebx,eax //ebx=eax=6E
00401203 |. |2BF2 |sub esi,edx //esi=esi-edx=406284-0
00401205 |. |C1E0 04 |shl eax,0x4 //eax=eax*2的4次方,eax=6E0
00401208 |. |C1EB 05 |shr ebx,0x5 //ebx=3
0040120B |. |33C3 |xor eax,ebx // 异或命令,先将eax、ebx写成二进制,然后对应数位上进行比较,相同为0、不同为1 然后得出eax,eax=6E3
0040120D |. |83C0 26 |add eax,0x26 //eax=6E3+26=709
00401210 |. |33C1 |xor eax,ecx //ecx=0,所以eax=709
00401212 |. |03C8 |add ecx,eax //ecx=ecx+eax=709
00401214 |. |46 |inc esi //esi+1 ,esi=406285
00401215 |. |803E 00 |cmp byte ptr ds:[esi],0x0 //将esi地址内存贮的数据与0做计较
00401218 |.^\75 E4 \jnz Xcrackme2.004011FE //不等则跳至4011FE处循环计算
最后将字符串“nameless”循环完毕得出ecx与eax的值。
以上是我对其理解,我的OD很神奇很强大 直接跳过那个反调试的调用。其实我想说的是 那个SHL命令是怎么个具体操作的 是不是将一个数转换成2进制后 不够16位将高位补0 然后再左移。我跟算法时是用的破解计算器,换成2进制自己对比手工左移后移 移不出来 5555
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)