【文章标题】: 专业扫雷之算法分析
【文章作者】: 网游难民
【作者主页】: 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!
  
--------------------------------------------------------------------------------
【版权声明】: 菜鸟初学算法, 失误之处敬请诸位大侠赐教,转载请注明作者并保持文章的完整, 谢谢!