首页
社区
课程
招聘
[旧帖] 哪个大牛帮忙解释一下下面的算法。 0.00雪花
发表于: 2013-8-21 06:07 4071

[旧帖] 哪个大牛帮忙解释一下下面的算法。 0.00雪花

2013-8-21 06:07
4071
这是从国外搞来的算法,小菜一直不明白这算法的一行一行意思,所以请大家帮忙写一下注释,并且解释一下为什么是这么算的,这是从 OD 抠出来的代码:

00456015    8BD0          MOV EDX,EAX
00456017    85D2          TEST EDX,EDX
00456019    7E 1B         JLE SHORT cnp.00456036
0045601B    B8 01000000   MOV EAX,1
00456020    8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]       (*01*)
00456023    0FB64C01 FF   MOVZX ECX,BYTE PTR DS:[EAX+ECX-1]  (*02*)
00456028    0FAFC8        IMUL ECX,EAX                       (*03*)
0045602B    03F1          ADD ESI,ECX                        (*04*)
0045602D    8D0CC0        LEA ECX,[EAX*8+EAX]                (*05*)
00456030    03F1          ADD ESI,ECX                        (*06*)
00456032    40            INC EAX
00456033    4A            DEC EDX
00456034    75 EA         JNZ SHORT cnp.00456020             (*07*)
00456036    8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
00456039    E8 1E12FBFF   CALL cnp.0040725C
0045603E    3BF0          CMP ESI,EAX
00456040    75 04         JNE SHORT cnp.00456046
00456042    B3 01         MOV BL,1
00456044    EB 02         JMP SHORT cnp.00456048

打星号的就是算法的7个运算部分,请大牛解答一下,特别是中括号里的寄存器 减数字的这个是怎么运算的?比如:[EAX+ECX-1],

在这里,比如我输入的用户名是: cxj98,

运算开始都是取用户名第一个字母,第一个字母取出来后,是怎么变成数字的?是字母 ASCII 码转换的,还是用户名位数转换的,还是其它什么转换成的16进制,然后取出来后,又是怎么开始计算的,算出来后,又是怎么样?最后好像还重复第二个字母的运算,算来算去,算到最后,怎么组合成最终的注册码的,请大牛花点时间耐心帮小菜分析一下,并写出详细运算过程,小菜感激不尽中。

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 58
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
从(*01*)到(*07*)这段循环体代码可以表示如下:
// len = strlen(username);
for (i = 1; i <= len; i++)
{
    reg += username[i-1] * i + 9 * i;  // C语言中数组下标从0开始
}
// reg为根据用户输入计算出来的注册码
2013-8-21 07:49
0
雪    币: 159
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呃……看见就头疼。
2013-11-15 14:56
0
游客
登录 | 注册 方可回帖
返回
//