首页
社区
课程
招聘
[原创]菜鸟也学密码学--CRC32
发表于: 2006-11-22 22:53 7261

[原创]菜鸟也学密码学--CRC32

2006-11-22 22:53
7261

【文章标题】: 菜鸟也学密码学--CRC32
【文章作者】: 网游难民
【作者主页】: bbs.chinapyg.com
【下载地址】: 自己搜索下载
【作者声明】: 菜鸟初次接触密码学,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
004042A8 55 push ebp
004042A9 8BEC mov ebp,esp
004042AB 6A 00 push 0
004042AD 6A 00 push 0
004042AF 53 push ebx
004042B0 56 push esi
004042B1 33C0 xor eax,eax
004042B3 55 push ebp
004042B4 68 D5434000 push crc32cra.004043D5
004042B9 64:FF30 push dword ptr fs:[eax]
004042BC 64:8920 mov dword ptr fs:[eax],es>
004042BF 8D45 FC lea eax,dword ptr ss:[ebp>
004042C2 E8 21EBFFFF call crc32cra.00402DE8
004042C7 A1 28654000 mov eax,dword ptr ds:[406>
004042CC 50 push eax
004042CD E8 12FAFFFF call <jmp.&user32.GetWind>
004042D2 8BF0 mov esi,eax
004042D4 8BDE mov ebx,esi
004042D6 85DB test ebx,ebx
004042D8 7E 10 jle short crc32cra.004042>
004042DA 8D45 FC lea eax,dword ptr ss:[ebp>
004042DD BA EC434000 mov edx,crc32cra.004043EC
004042E2 E8 F1EBFFFF call crc32cra.00402ED8
004042E7 4B dec ebx
004042E8 ^ 75 F0 jnz short crc32cra.004042>
004042EA 6A 32 push 32
004042EC 8B45 FC mov eax,dword ptr ss:[ebp>
004042EF E8 ACECFFFF call crc32cra.00402FA0
004042F4 50 push eax
004042F5 A1 28654000 mov eax,dword ptr ds:[406>
004042FA 50 push eax
004042FB E8 DCF9FFFF call <jmp.&user32.GetWind>; 取得注册名位数
00404300 83FE 05 cmp esi,5
00404303 0F8C B1000000 jl crc32cra.004043BA ; 小于5就Game Over
00404309 8D45 FC lea eax,dword ptr ss:[ebp>
0040430C 8B4D FC mov ecx,dword ptr ss:[ebp>; 注册名
0040430F BA F8434000 mov edx,crc32cra.004043F8 ; ASCII "DiKeN"
00404314 E8 03ECFFFF call crc32cra.00402F1C ; DiKeN+注册名,记为字符串A
00404319 8B45 FC mov eax,dword ptr ss:[ebp>; 字符串A放入EAX中~~
0040431C E8 AFEBFFFF call crc32cra.00402ED0 ; 字符串A的总长度
00404321 8BD0 mov edx,eax
00404323 8D45 FC lea eax,dword ptr ss:[ebp>
00404326 E8 C5FAFFFF call crc32cra.00403DF0 ; 算法CALL,跟进~~
0040432B 8BF0 mov esi,eax ; 上面计算出的结果-字符串C,放入ESI中~
0040432D 8D45 F8 lea eax,dword ptr ss:[ebp>
00404330 E8 B3EAFFFF call crc32cra.00402DE8
00404335 A1 2C654000 mov eax,dword ptr ds:[406>
0040433A 50 push eax
0040433B E8 A4F9FFFF call <jmp.&user32.GetWind>; 取得注册码的长度
00404340 8BD8 mov ebx,eax
00404342 85DB test ebx,ebx
00404344 7E 10 jle short crc32cra.004043>; 检测是否填写注册码
00404346 8D45 F8 lea eax,dword ptr ss:[ebp>
00404349 BA EC434000 mov edx,crc32cra.004043EC
0040434E E8 85EBFFFF call crc32cra.00402ED8
00404353 4B dec ebx
00404354 ^ 75 F0 jnz short crc32cra.004043>
00404356 6A 20 push 20
00404358 8B45 F8 mov eax,dword ptr ss:[ebp>
0040435B E8 40ECFFFF call crc32cra.00402FA0
00404360 50 push eax
00404361 A1 2C654000 mov eax,dword ptr ds:[406>
00404366 50 push eax
00404367 E8 70F9FFFF call <jmp.&user32.GetWind>; 取得注册码位数
0040436C 8D45 F8 lea eax,dword ptr ss:[ebp>
0040436F 8B4D F8 mov ecx,dword ptr ss:[ebp>; 注册码放在ECX中~
00404372 BA 08444000 mov edx,crc32cra.00404408
00404377 E8 A0EBFFFF call crc32cra.00402F1C
0040437C 8B45 F8 mov eax,dword ptr ss:[ebp>; 注册码放在EAX中~
0040437F E8 A0FEFFFF call crc32cra.00404224 ; 注册码的十六进制
00404384 33F0 xor esi,eax ; 注册码十六进制XOR字符串C
00404386 85F6 test esi,esi
00404388 74 19 je short crc32cra.004043A>; ESI等于0就跳,即说注册码的十六进制与字符串a相等就注册成功
0040438A 6A 00 push 0
0040438C 68 0C444000 push crc32cra.0040440C
00404391 68 14444000 push crc32cra.00404414
00404396 A1 04654000 mov eax,dword ptr ds:[406>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
00403DF0 51 push ecx
00403DF1 53 push ebx
00403DF2 56 push esi
00403DF3 57 push edi
00403DF4 BF 1A3E4000 mov edi,crc32cra.00403E1A
00403DF9 8B30 mov esi,dword ptr ds:[eax>; 字符串A放在ESI中~~
00403DFB 83C8 FF or eax,FFFFFFFF ; EAX置FFFFFFFF
00403DFE 31C9 xor ecx,ecx
00403E00 3206 xor al,byte ptr ds:[esi] ; 循环开始~~
00403E02 50 push eax
00403E03 25 FF000000 and eax,0FF
00403E08 8B1C87 mov ebx,dword ptr ds:[edi>
00403E0B 58 pop eax
00403E0C C1E8 08 shr eax,8
00403E0F 31D8 xor eax,ebx
00403E11 46 inc esi
00403E12 4A dec edx
00403E13 ^ 75 EB jnz short crc32cra.00403E>; 关键循环~~
00403E15 E9 00040000 jmp crc32cra.0040421A ; 跳到下面~~~
00403E1A 0000 add byte ptr ds:[eax],al
下面介绍下上面的循环:
先把EAX置FFFFFFFF,AL中的两个FF与字符串A的第一位-D的ASCII码(44)XOR运算(结果为BB),运算后EAX中的值记为a1(FFFFFFBB),取得AL(BB)中对应的CRC32密码表中的数(5CB36A04),记为b1,
a1右移(二进制)8位后(00FFFFFF)和b1(5CB36A04)进行XOR运算,结果记为c1(5C4C95FB)。下面进入第二轮循环。
取c1的后两位(FB),与字符串A的第二位XOR运算(结果为92),运算后EAX中的值记为a2(5C4C9592),取得AL(92)中对应的CRC32密码表中的数(1E01F268),记为b2,
a2右移(二进制)8位后(005C4C95)和b2进行XOR运算,结果记为c2,然后进入第三轮循环,
。。。。。。。。。。。省略。。。。。。。。。。
一直循环到字符串A全部运算一遍,结果记为字符串B,然后到00403E15处跳到下面~~~
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
跳到这里:
0040421A 83F0 FF xor eax,FFFFFFFF ; 跳到这里,字符串B XOR FFFFFFFF,结果记为字符串C
0040421D 5F pop edi ; crc32cra.00403E1A
0040421E 5E pop esi
0040421F 5B pop ebx
00404220 59 pop ecx
00404221 C3 retn

--------------------------------------------------------------------------------
【经验总结】
大家用密码学计算器算下,字符串C是不是DiKeN+注册名的CRC32的计算结果????
即:DiKeN+注册名的CRC32的计算结果的十进制就是注册码:)

能认真看完这篇文章的朋友大概了解了CRC32是怎么计算来的了吧:)

--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 443
活跃值: (200)
能力值: ( LV9,RANK:1140 )
在线值:
发帖
回帖
粉丝
2
沙发~~~~
2006-11-22 23:03
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
3
欧也!!!终于看到简单点的加密算法了。学习学习
2006-11-23 16:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
难得糊涂,现在看的都头疼~
2006-11-23 16:41
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
果真的牛 X
2006-11-23 16:54
0
雪    币: 309
活跃值: (15)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
最初由 binbinbin 发布
欧也!!!终于看到简单点的加密算法了。学习学习



以为简单的没兄弟喜欢,原来也有兄弟喜欢看的~~
偶还有几篇,改天发上来啊~~
2006-11-23 19:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了一下,真的牛!
2006-11-23 22:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看不懂但知道是好东西
2006-11-24 09:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
还是简单的好,学习一下
2006-11-24 13:01
0
游客
登录 | 注册 方可回帖
返回
//