【文章标题】: 专业扫雷之算法分析
【文章作者】: 网游难民
【作者主页】: www.chinapyg.com
【软件名称】: 专业扫雷
【软件大小】: 616K
【下载地址】: 本地~
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++
【使用工具】: PEID OD
【操作平台】: XP SP2
【软件介绍】: 喜欢玩扫雷的朋友们有福拉~~很不错的软件~
【作者声明】: 今天找了个扫雷游戏,感觉挺不错的,可是就不时弹出注册框,好郁闷~~拿来做掉~~
--------------------------------------------------------------------------------
【详细过程】
偶就不多说拉,直接进入正题:
偶比较懒,用的OD插件ApiBreak断下,下面开始分析:
00404FE1 |> \6A 50 PUSH 50 ; /Count = 50 (80.); 案例 1 --> 分支 00404FD6
00404FE3 |. 68 C8ED4100 PUSH OFFSET 专业扫雷.reg_ime ; |Buffer = OFFSET 专业扫雷.reg_ime
00404FE8 |. 6A 65 PUSH 65 ; |ControlID = 65 (101.)
00404FEA |. 53 PUSH EBX ; |hWnd
00404FEB |. E8 07600100 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00404FF0 |. 6A 0A PUSH 0A ; /Count = A (10.)
00404FF2 |. 68 18EE4100 PUSH OFFSET 专业扫雷.reg_broj ; |Buffer = OFFSET 专业扫雷.reg_broj
00404FF7 |. 6A 66 PUSH 66 ; |ControlID = 66 (102.)
00404FF9 |. 53 PUSH EBX ; |hWnd
00404FFA |. E8 F85F0100 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
00404FFF |. 68 18EE4100 PUSH OFFSET 专业扫雷.reg_broj ; /得到注册码
00405004 |. 68 C8ED4100 PUSH OFFSET 专业扫雷.reg_ime ; |取得注册名
00405009 |. E8 49060000 CALL 专业扫雷.provjeri_registraciju ; \关键CALL,跟进~
0040500E |. 83C4 08 ADD ESP,8
00405011 |. A2 22EE4100 MOV BYTE PTR DS:[registriran],AL
00405016 |. 84C0 TEST AL,AL
00405018 74 11 JE SHORT 专业扫雷.0040502B ; 关键跳转~~
0040501A |. C605 74C04100>MOV BYTE PTR DS:[nag_aktivan],0
00405021 |. 6A 00 PUSH 0 ; /Result = 0
00405023 |. 53 PUSH EBX ; |hWnd
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
跟进上面的算法~~:
00405657 >/$ 55 PUSH EBP
00405658 |. 8BEC MOV EBP,ESP
0040565A |. 83C4 E4 ADD ESP,-1C
0040565D |. 53 PUSH EBX
0040565E |. 56 PUSH ESI
0040565F |. 57 PUSH EDI
00405660 |. 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C] ; 注册码
00405663 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] ; 注册名
00405666 |. 33C0 XOR EAX,EAX
00405668 |> 0FBE1403 /MOVSX EDX,BYTE PTR DS:[EBX+EAX]
0040566C |. 83C2 D0 |ADD EDX,-30
0040566F |. 895485 E4 |MOV DWORD PTR SS:[EBP+EAX*4-1C],EDX
00405673 |. 837C85 E4 00 |CMP DWORD PTR SS:[EBP+EAX*4-1C],0
00405678 |. 7C 07 |JL SHORT 专业扫雷.00405681
0040567A |. 837C85 E4 09 |CMP DWORD PTR SS:[EBP+EAX*4-1C],9
0040567F |. 7E 23 |JLE SHORT 专业扫雷.004056A4
00405681 |> 68 2DC44100 |PUSH 专业扫雷.0041C42D ; /src = "-------"
00405686 |. 51 |PUSH ECX ; |dest
00405687 |. E8 F4F00000 |CALL 专业扫雷.strcpy ; \strcpy
0040568C |. 83C4 08 |ADD ESP,8
0040568F |. 68 35C44100 |PUSH 专业扫雷.0041C435 ; /src = "-------"
00405694 |. 53 |PUSH EBX ; |dest
00405695 |. E8 E6F00000 |CALL 专业扫雷.strcpy ; \strcpy
0040569A |. 83C4 08 |ADD ESP,8
0040569D |. 33C0 |XOR EAX,EAX
0040569F |. E9 A5000000 |JMP 专业扫雷.00405749
004056A4 |> 40 |INC EAX
004056A5 |. 83F8 07 |CMP EAX,7
004056A8 |.^ 7C BE \JL SHORT 专业扫雷.00405668 ; 循环,去注册码的前7位~
004056AA |. 6945 F4 E8030>IMUL EAX,DWORD PTR SS:[EBP-C],3E8 ; 注册码第三位*3E8
004056B1 |. 6B55 EC 64 IMUL EDX,DWORD PTR SS:[EBP-14],64 ; 注册码第七位*64
004056B5 |. 03C2 ADD EAX,EDX ; 上面两个数的和,记为A
004056B7 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 注册码第七位放入EDX中~~
004056BA |. 03D2 ADD EDX,EDX ; EDX+EDX~
004056BC |. 8D1492 LEA EDX,DWORD PTR DS:[EDX+EDX*4] ; 上面的值*5,记为B~
004056BF |. 03C2 ADD EAX,EDX ; A+B的和,记为C~
004056C1 |. 0345 E4 ADD EAX,DWORD PTR SS:[EBP-1C] ; C加上注册码第一位~~,记为D~
004056C4 |. 6BF0 0D IMUL ESI,EAX,0D ; 我们记录的数值D*D,结果放在ESI中,记为E~
004056C7 |. 8BC6 MOV EAX,ESI ; E放在EAX中~~
004056C9 |. BE C5000000 MOV ESI,0C5 ; C5放在ESI中~
004056CE |. 99 CDQ
004056CF |. F7FE IDIV ESI ; E除以C5~~
004056D1 |. 8BF2 MOV ESI,EDX ; 余数放在ESI中,记为a
004056D3 |. 33FF XOR EDI,EDI
004056D5 |. 33C0 XOR EAX,EAX
004056D7 |> 803C01 00 /CMP BYTE PTR DS:[ECX+EAX],0
004056DB |. 74 0C |JE SHORT 专业扫雷.004056E9
004056DD |. 0FBE1401 |MOVSX EDX,BYTE PTR DS:[ECX+EAX]
004056E1 |. 03FA |ADD EDI,EDX
004056E3 |. 40 |INC EAX
004056E4 |. 83F8 50 |CMP EAX,50
004056E7 |.^ 7C EE \JL SHORT 专业扫雷.004056D7 ; 循环,求用户名的ASCII码累加和(282),记为F~
004056E9 |> 8BC6 MOV EAX,ESI ; a放在EAX中~~
004056EB |. 51 PUSH ECX ; 用户名入栈
004056EC |. B9 0A000000 MOV ECX,0A ; 0A放在ECX中~~
004056F1 |. 99 CDQ
004056F2 |. F7F9 IDIV ECX ; 余数a除0A~~,记为G~
004056F4 |. 59 POP ECX ; 用户名出栈
004056F5 |. 03C7 ADD EAX,EDI ; G+F,记为H~~
004056F7 |. BF 64000000 MOV EDI,64 ; 64放在EDI中~~
004056FC |. 99 CDQ ; 扩展指令
004056FD |. F7FF IDIV EDI ; H除64,余数记为b~
004056FF |. 8BFA MOV EDI,EDX ; 余数b放在EDI中
00405701 |. 8BC6 MOV EAX,ESI ; 余数a放在EAX中~
00405703 |. BE 0A000000 MOV ESI,0A ; 0A放在ESI中~~
00405708 |. 99 CDQ ; 扩展指令~
00405709 |. F7FE IDIV ESI ; 余数a除以0A~~余数记为c~
0040570B |. 8BC7 MOV EAX,EDI ; 余数b放在EAX中~
0040570D |. 03C0 ADD EAX,EAX ; 余数b*2
0040570F |. 8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4] ; 上面的值*5,记为I~
00405712 |. 03D0 ADD EDX,EAX ; 余数c加上I,记为J~
00405714 |. 8BF2 MOV ESI,EDX ; J放在ESI中~~
00405716 |. 6B45 F0 64 IMUL EAX,DWORD PTR SS:[EBP-10],64 ; 注册码第四位*64放在EAX中~~,记为K
0040571A |. 8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18] ; 注册码第二位放在EDX中~~
0040571D |. 03D2 ADD EDX,EDX ; 注册码第二位*2
0040571F |. 8D1492 LEA EDX,DWORD PTR DS:[EDX+EDX*4] ; 上面的数*5,记为L~~
00405722 |. 03C2 ADD EAX,EDX ; K加L,记为M~
00405724 |. 0345 F8 ADD EAX,DWORD PTR SS:[EBP-8] ; M加上注册码第六位,记为N~~
00405727 |. 3BC6 CMP EAX,ESI ; J和N中的值比较,不相等就跳向错误提示~
00405729 74 1E JE SHORT 专业扫雷.00405749 ; 关键跳转~~
0040572B |. 68 3DC44100 PUSH 专业扫雷.0041C43D ; /src = "-------"
00405730 |. 51 PUSH ECX ; |dest
00405731 |. E8 4AF00000 CALL 专业扫雷.strcpy ; \strcpy
--------------------------------------------------------------------------------
【经验总结】
好长的算法,听偶细细道来~~
注册码第三位*3E8;注册码第七位*64;两个数的和,记为A;注册码第七位*2*5,记为B~;A+B的和,记为C~;C加上注册码
第一位~~,记为D~;我们记录的数值D*D,记为E~;E除以C5~~;余数放在ESI中,记为a;用户名的ASCII码累加和,记为F~
;余数a除0A~~,记为G~;G+F,记为H~~;H除64,余数记为b~;余数a除以0A~~余数记为c~;余数b*2*5记为I;余数c加上I,
记为J~;注册码第四位*64放在EAX中~~,记为K;注册码第二位*2*5,记为L~~;K加L,记为M~;M加上注册码第六位,记为
N~~;J和N中的值比较,不相等就gameover!
--------------------------------------------------------------------------------
【版权声明】: 菜鸟初学算法, 失误之处敬请诸位大侠赐教,转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课