能力值:
( LV9,RANK:610 )
2 楼
有难度。。。
能力值:
( LV9,RANK:170 )
3 楼
nLen = GetNameLen(szUserName) ;
for(i = nLen; i; --i)
{
nLen += szUserName[i - 1] * i ;
}
release版会将while, for,全都优化成do while的形式,所以翻译成while for都无所谓的。
if这些是将反操作的!
我觉得要结合上下文来看,一小段看不出啥来,很难译的!
能力值:
( LV2,RANK:10 )
4 楼
nLen=GetNameLen(szUserName);
for(int i=nLen;i>0;i--)
{
nLen=szUserName[i-1]*i+nLen;
}
能力值:
( LV2,RANK:10 )
5 楼
我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393 |> 8A140B /mov dl,byte ptr ds:[ebx+ecx] ; 用户名最后一位
能力值:
( LV13,RANK:420 )
6 楼
[QUOTE=olxdf;803900]我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393 |> 8A140B /mov dl,byte ptr ds:[ebx+ecx] ...[/QUOTE]
直接内嵌汇编
能力值:
( LV9,RANK:170 )
7 楼
[QUOTE=olxdf;803900]我觉得楼上2位的代码不正确,如下一句,在循环中edx只是低8位被用户名的一个字节置换了,高位并没有变,所以执行imul edx,ecx时,edx并不仅仅是用户名的一个字节
00401393 |> 8A140B /mov dl,byte ptr ds:[ebx+ecx] ...[/QUOTE]
xor edx,edx
如果我没有记错的话,这个是将edx清零吧,高位也是0吧!
能力值:
( LV2,RANK:10 )
8 楼
诶,没人能够帮助我,再等下,没有就结贴了
能力值:
(RANK:330 )
9 楼
int len = strlen(name);
int result = len;
for(int i = 0; i < len; i++)
{
result += name[len-i-1] * (len - i);
}
这个应该是delphi写的,用pascal语法描述:
var
i,len,Result: Integer;
begin
len := length(name);
result := len;
for i := 0 to pred(nlen) do
begin
inc(result,name[len-i-1] * (len - i));
end;
end;
能力值:
( LV5,RANK:60 )
10 楼
大概的意思就是2L和9L翻译的,作用就是这样
能力值:
( LV2,RANK:10 )
11 楼
00401393 |> 8A140B /mov dl,byte ptr ds:[ebx+ecx] ; 用户名最后一位
00401396 |. 0FAFD1 |imul edx,ecx
00401399 |. 01D0 |add eax,edx
0040139B |. 49 |dec ecx
0040139C |.^ 75 F5 \jnz short Crackme.00401393
我的理解是edx与ecx相乘后,高24位不一定为0,循环中将低8位置换成用户名的一个字符,而高24位并不为0,所以感觉imul edx,ecx这句不应该单纯的翻译成name[len-i-1] * (len - i);不知道是不是我理解错了,希望大家指正。
能力值:
(RANK:330 )
12 楼
建议LZ问问题之前先将自己杯子里的水倒空,楼上已经有人非常明白无误的回答了你这个问题了
能力值:
( LV3,RANK:20 )
13 楼
楼主的想法有道理,但还是可以表达的吧。如下如何?
int nLen = GetNameLen(szUserName) ;
union{
int iEDX;
char iDL;
};
iEDX=0;
for(int i = nLen; i; i--)
{
iDL=szUserName[i-1];
iEDX = iEDX*i;
nLen+=iEDX;
}
能力值:
( LV15,RANK:280 )
14 楼
int len = strlen(user); //len相当于eax
int i = len; //i相当于ecx用于控制循环次数
int d =0; //d相当于edx,保存运算的中间结果
while(i>0)
{
d = d&0x00; //此2句,相当于是对edx的低8位,dl赋值
d = d|user[i];
d = d*i; //imul edx,ecx
len +=d; //计算结果累加到len(eax)中
i--;
}
能力值:
( LV5,RANK:60 )
15 楼
这个给个比对的方法。你可以用VC6调试模式,之后反汇编对比着看。