飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 21034|回复: 73

[原创] 某文件夹软件的破解+算法分析+keyGen源码(VB版)

  [复制链接]
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2012-8-29 23:12:29 | 显示全部楼层 |阅读模式
    本帖最后由 GGLHY 于 2012-8-30 21:18 编辑

    ****文件夹软件的破解 + 算法分析 + KeyGen源码(VB版)

             为尊重软件作者版权,保护国软,特以“****文件夹软件”替代软件原名,下同!如有火眼金睛的XDJM知道这软件,还请不要摆出它的大名。虽说这正式版的软件本身非常难得,但对名字保密一事还敬请见谅。(感谢下坛里的K大大)

    OK,手握倚天剑,祭起屠龙刀。OD载入。
    运行软件后,有NAG出现,提示要求注册,并给出了机器码。于是输入注册信息如下:

    1. 软件注册名:GGLHY祝大家天天快乐!
    2. 产品序列号:12345-67890-abcde-fghij-klmno
    复制代码
    (注册框5个部分,且每个部分最多只能输入5个字符!这一点会在后面算法部分得到印证。)


    点注册,有出错的弹窗。通过F12的方法,我们可以看到:
    1. 005B852E    E8 B9F4F6FF     CALL other.005279EC                ; JMP 到 user32.MessageBoxW
    复制代码
    很显然,程序目前是停在一个叫other.dll的领空。


    我们用回溯的方法,可以看到如下内容:
    1. (省略部分代码...)
    2. 005B84DD    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
    3. 005B84E0    E8 1B90FCFF     CALL other.00581500                ; 关键CALL
    4. 005B84E5    84C0            TEST AL,AL                         ; 经典的标志位!
    5. 005B84E7    74 34           JE SHORT other.005B851D            ; 跳不跳是个烦恼的事吗?
    6. 005B84E9    68 40000400     PUSH 40040
    7. 005B84EE    68 74855B00     PUSH other.005B8574
    8. 005B84F3    68 A4855B00     PUSH other.005B85A4
    9. 005B84F8    6A 00           PUSH 0
    10. 005B84FA    E8 EDF4F6FF     CALL other.005279EC                ; JMP 到 user32.MessageBoxW
    11. 005B84FF    68 18865B00     PUSH other.005B8618                ; ASCII "****文件夹MESSAGE"
    12. 005B8504    E8 4BF5F6FF     CALL other.00527A54                ; JMP 到 user32.RegisterWindowMessageA
    13. 005B8509    6A 00           PUSH 0
    14. 005B850B    68 39120000     PUSH 1239
    15. 005B8510    50              PUSH EAX
    16. 005B8511    68 FFFF0000     PUSH 0FFFF
    17. 005B8516    E8 89F5F6FF     CALL other.00527AA4                ; JMP 到 user32.SendNotifyMessageA
    18. 005B851B    EB 16           JMP SHORT other.005B8533
    19. 005B851D    68 10000400     PUSH 40010
    20. 005B8522    68 74855B00     PUSH other.005B8574
    21. 005B8527    68 30865B00     PUSH other.005B8630
    22. 005B852C    6A 00           PUSH 0
    23. 005B852E    E8 B9F4F6FF     CALL other.005279EC                ; 出错啦!(往上找这该死的从哪来)
    24. 005B8533    33C0            XOR EAX,EAX
    复制代码

    很显然,005B84E0处的 CALL other.00581500 是我们应该开门进去瞧一瞧的地方。于是在这一段的段首下个断点,重新注册:
    1. (省略部分代码...)
    2. 005B834E    E8 099AFFFF     CALL other.005B1D5C
    3. 005B8353    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ; 输入的注册码第一部分“12345”
    4. (省略部分代码...)
    5. 005B8363    E8 68CEF6FF     CALL other.005251D0
    6. 005B8368    0F84 94000000   JE other.005B8402                  ; 注册码第一部分为空则跳向错误提示
    7. 005B836E    8D55 E4         LEA EDX,DWORD PTR SS:[EBP-1C]
    8. 005B8371    8B83 98030000   MOV EAX,DWORD PTR DS:[EBX+398]
    9. 005B8377    E8 E099FFFF     CALL other.005B1D5C
    10. 005B837C    8B45 E4         MOV EAX,DWORD PTR SS:[EBP-1C]      ; 输入的注册码第二部分“67890”
    11. (省略部分代码...)
    12. 005B838C    E8 3FCEF6FF     CALL other.005251D0
    13. 005B8391    74 6F           JE SHORT other.005B8402            ; 注册码第二部分为空则跳向错误提示
    14. 005B8393    8D55 DC         LEA EDX,DWORD PTR SS:[EBP-24]
    15. 005B8396    8B83 9C030000   MOV EAX,DWORD PTR DS:[EBX+39C]
    16. 005B839C    E8 BB99FFFF     CALL other.005B1D5C
    17. 005B83A1    8B45 DC         MOV EAX,DWORD PTR SS:[EBP-24]      ; 输入的注册码第三部分“abcde”
    18. (省略部分代码...)
    19. 005B83B1    E8 1ACEF6FF     CALL other.005251D0
    20. 005B83B6    74 4A           JE SHORT other.005B8402            ; 注册码第三部分为空则跳向错误提示
    21. (省略部分代码...)
    22. 005B83CC    E8 030EF7FF     CALL other.005291D4
    23. 005B83D1    8B45 D8         MOV EAX,DWORD PTR SS:[EBP-28]      ; 输入的注册码第四部分“fghij”
    24. 005B83D4    33D2            XOR EDX,EDX
    25. 005B83D6    E8 F5CDF6FF     CALL other.005251D0                ; 注册码第四部分为空则跳向错误提示
    26. 005B83DB    74 25           JE SHORT other.005B8402
    27. 005B83DD    8D55 CC         LEA EDX,DWORD PTR SS:[EBP-34]
    28. 005B83E0    8B83 A4030000   MOV EAX,DWORD PTR DS:[EBX+3A4]
    29. 005B83E6    E8 7199FFFF     CALL other.005B1D5C
    30. 005B83EB    8B45 CC         MOV EAX,DWORD PTR SS:[EBP-34]      ; 输入的注册码第五部分“klmno”
    31. 005B83EE    8D55 D0         LEA EDX,DWORD PTR SS:[EBP-30]
    32. 005B83F1    E8 DE0DF7FF     CALL other.005291D4
    33. 005B83F6    8B45 D0         MOV EAX,DWORD PTR SS:[EBP-30]
    34. 005B83F9    33D2            XOR EDX,EDX
    35. 005B83FB    E8 D0CDF6FF     CALL other.005251D0
    36. 005B8400    75 1B           JNZ SHORT other.005B841D           ; 注册码第五部分不为空则跳!
    37. 005B8402    68 40000400     PUSH 40040
    38. 005B8407    68 74855B00     PUSH other.005B8574
    39. 005B840C    68 84855B00     PUSH other.005B8584
    40. 005B8411    6A 00           PUSH 0
    41. 005B8413    E8 D4F5F6FF     CALL other.005279EC                ; JMP 到 user32.MessageBoxW
    42. 005B8418    E9 16010000     JMP other.005B8533
    43. 005B841D    8D55 C0         LEA EDX,DWORD PTR SS:[EBP-40]
    44. 005B8420    8B83 94030000   MOV EAX,DWORD PTR DS:[EBX+394]
    45. 005B8426    E8 3199FFFF     CALL other.005B1D5C
    46. 005B842B    8B45 C0         MOV EAX,DWORD PTR SS:[EBP-40]      ; 输入的注册码第一部分““12345”
    47. (省略部分代码...)
    48. 005B8442    E8 1599FFFF     CALL other.005B1D5C
    49. 005B8447    8B45 B8         MOV EAX,DWORD PTR SS:[EBP-48]      ; 输入的注册码第二部分“67890”
    50. (省略部分代码...)
    51. 005B8463    8B45 B0         MOV EAX,DWORD PTR SS:[EBP-50]      ; 输入的注册码第三部分“abcde”
    52. (省略部分代码...)
    53. 005B847F    8B45 A8         MOV EAX,DWORD PTR SS:[EBP-58]      ; 输入的注册码第四部分“fghij”
    54. (省略部分代码...)
    55. 005B849B    8B45 A0         MOV EAX,DWORD PTR SS:[EBP-60]      ; 输入的注册码第五部分“klmno”
    56. 005B849E    8D55 A4         LEA EDX,DWORD PTR SS:[EBP-5C]
    57. 005B84A1    E8 2E0DF7FF     CALL other.005291D4
    58. 005B84A6    FF75 A4         PUSH DWORD PTR SS:[EBP-5C]
    59. 005B84A9    8D45 C8         LEA EAX,DWORD PTR SS:[EBP-38]
    60. 005B84AC    BA 05000000     MOV EDX,5
    61. 005B84B1    E8 D2CCF6FF     CALL other.00525188
    62. 005B84B6    8B55 C8         MOV EDX,DWORD PTR SS:[EBP-38]      ; 5部分联接起来 (UNICODE "1234567890abcdefghijklmno")
    63. (省略部分代码...)
    64. 005B84D5    E8 06C5F6FF     CALL other.005249E0
    65. 005B84DA    8B45 9C         MOV EAX,DWORD PTR SS:[EBP-64]
    66. 005B84DD    8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]       ; 5部分联接起来的注册码  "1234567890abcdefghijklmno"
    67. 005B84E0    E8 1B90FCFF     CALL other.00581500                ; 关键CALL
    68. 005B84E5    84C0            TEST AL,AL                         ; 经典的标志位!
    69. 005B84E7    74 34           JE SHORT other.005B851D
    复制代码


    恩,同志们,现在到了考验我们的时候了~~~005B84E0处的CALL other.00581500
    我们F7进入:
    1. 00581519    55              PUSH EBP
    2. 0058151A    68 90165800     PUSH other.00581690
    3. 0058151F    64:FF30         PUSH DWORD PTR FS:[EAX]
    4. 00581522    64:8920         MOV DWORD PTR FS:[EAX],ESP
    5. 00581525    C645 FF 00      MOV BYTE PTR SS:[EBP-1],0          ; 绝佳的爆破点之一,改0为1。哈哈~~~
    6. 00581529    8D45 F0         LEA EAX,DWORD PTR SS:[EBP-10]
    7. 0058152C    E8 53FCFFFF     CALL other.00581184
    8. 00581531    8D55 EC         LEA EDX,DWORD PTR SS:[EBP-14]
    9. 00581534    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]      ; 机器码出现 (ASCII "Y3M75HN3QPJBYBD")
    10. 00581537    E8 C0FCFFFF     CALL other.005811FC                ; 算法核心CALL,KG的实现就指望着它了
    11. 0058153C    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]      ; 真码啊~~~,爱死你了!
    12. 0058153F    8BD3            MOV EDX,EBX                        ; 输入的假码 "1234567890abcdefghijklmno"
    13. 00581541    E8 1636FAFF     CALL other.00524B5C
    14. 00581546    0F85 29010000   JNZ other.00581675                 ; 跳?还是不跳? 这是个问题吗?
    15. 0058154C    B2 01           MOV DL,1                           ; 不跳则开始写注册信息咯
    16. 0058154E    A1 90145400     MOV EAX,DWORD PTR DS:[541490]
    17. (省略部分代码...)
    18. 005815A5    8D55 E4         LEA EDX,DWORD PTR SS:[EBP-1C]
    19. 005815A8    B8 AC165800     MOV EAX,other.005816AC             ; ASCII "user"
    20. 005815AD    E8 3AF4FFFF     CALL other.005809EC
    21. 005815B2    8B55 E4         MOV EDX,DWORD PTR SS:[EBP-1C]
    22. 005815B5    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    23. 005815B8    59              POP ECX
    24. 005815B9    E8 0E06FCFF     CALL other.00541BCC
    25. 005815BE    8D55 E0         LEA EDX,DWORD PTR SS:[EBP-20]
    26. 005815C1    8BC3            MOV EAX,EBX
    27. 005815C3    E8 24F4FFFF     CALL other.005809EC
    28. 005815C8    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
    29. 005815CB    50              PUSH EAX
    30. 005815CC    8D55 DC         LEA EDX,DWORD PTR SS:[EBP-24]
    31. 005815CF    B8 BC165800     MOV EAX,other.005816BC             ; ASCII "cpsn"
    32. 005815D4    E8 13F4FFFF     CALL other.005809EC
    33. 005815D9    8B55 DC         MOV EDX,DWORD PTR SS:[EBP-24]
    34. 005815DC    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    35. 005815DF    59              POP ECX
    36. 005815E0    E8 E705FCFF     CALL other.00541BCC
    37. 005815E5    C645 FF 01      MOV BYTE PTR SS:[EBP-1],1          ; <<==     众里寻1千百度!
    38. 005815E9    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    39. 005815EC    E8 0F00FCFF     CALL other.00541600
    40. 005815F1    B1 01           MOV CL,1
    41. 005815F3    BA CC165800     MOV EDX,other.005816CC             ; ASCII "lfte"
    42. 005815F8    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    43. 005815FB    E8 9800FCFF     CALL other.00541698
    44. 00581600    84C0            TEST AL,AL
    45. 00581602    74 20           JE SHORT other.00581624
    46. 00581604    8B4D F0         MOV ECX,DWORD PTR SS:[EBP-10]
    47. 00581607    BA DC165800     MOV EDX,other.005816DC             ; ASCII "edoccam"
    48. 0058160C    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    49. 0058160F    E8 B805FCFF     CALL other.00541BCC
    50. 00581614    8B4D F4         MOV ECX,DWORD PTR SS:[EBP-C]
    51. 00581617    BA EC165800     MOV EDX,other.005816EC             ; ASCII "yekger"
    52. 0058161C    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    53. 0058161F    E8 A805FCFF     CALL other.00541BCC
    54. 00581624    33C0            XOR EAX,EAX
    55. (省略部分代码...)
    56. 00581690  ^ E9 272AFAFF     JMP other.005240BC
    57. 00581695  ^ EB EB           JMP SHORT other.00581682
    58. 00581697    8A45 FF         MOV AL,BYTE PTR SS:[EBP-1]         ; 你若为0,便无晴天~~
    59. 0058169A    5F              POP EDI
    60. 0058169B    5E              POP ESI
    61. 0058169C    5B              POP EBX
    62. 0058169D    8BE5            MOV ESP,EBP
    63. 0058169F    5D              POP EBP
    64. 005816A0    C3              RETN
    复制代码

    看起来,前面005B84E5处这里标志位AL的值是由00581697 处的PTR SS:[EBP-1]的值决定的。如果单纯的爆破的话,至少有以下的几种方法:
    1. 方法1(掐头).00581525 处   MOV BYTE PTR SS:[EBP-1],0          ; 将0改为1
    2. 方法2(拦腰).00581546 处   JNZ other.00581675                 ;把JNZ来nop
    3. 方法3(截尾).00581697 处   MOV AL,BYTE PTR SS:[EBP-1]         ; 改为MOV AL,1

    复制代码

    显然,第一种方法改动的效率高,而且更保险。
    但是,如果你单纯只改这个DLL文件的话,呵呵,我不会告诉你主程序中会有这么一段:


    1. 004AF17C    3B4D F0         CMP ECX,DWORD PTR SS:[EBP-10]
    2. 004AF17F    7E 05           JLE SHORT ****文件夹软件.004AF186
    3. 004AF181    B9 01000000     MOV ECX,1
    4. (省略部分代码...)
    5. 004AF1A0    BF 18000000     MOV EDI,18
    6. (省略部分代码...)
    7. 004AF1AF    83FB 19         CMP EBX,19
    8. 004AF1B2  ^ 75 C8           JNZ SHORT ****文件夹软件.004AF17C
    9. 004AF1B4    BB 19000000     MOV EBX,19
    10. 004AF1B9    8D75 8C         LEA ESI,DWORD PTR SS:[EBP-74]
    复制代码
    我也不会告诉你还有这样的东东:
    1. 004B3114    E8 A71BF5FF     CALL ****文件夹软件.00404CC0
    2. 004B3119    6A 00           PUSH 0
    3. 004B311B    E8 7495FEFF     CALL ****文件夹软件.0049C694        ; JMP到other.Other_JCSYQ(有兴趣就进去看看)
    4. 004B3120    8D95 ECFBFFFF   LEA EDX,DWORD PTR SS:[EBP-414]
    5. 004B3126    E8 A96FF5FF     CALL ****文件夹软件.0040A0D4
    6. 004B312B    8B95 ECFBFFFF   MOV EDX,DWORD PTR SS:[EBP-414]      ; 存在着注册名吗?
    7. 004B3131    B8 A4B04B00     MOV EAX,****文件夹软件.004BB0A4
    8. 004B3136    E8 D518F5FF     CALL ****文件夹软件.00404A10        ; !!!!
    9. 004B313B    833D A4B04B00 0>CMP DWORD PTR DS:[4BB0A4],0
    10. 004B3142    0F9505 8DB04B00 SETNE BYTE PTR DS:[4BB08D]          ; 哈哈,全局变量!
    11. 004B3149    E8 8E9EFEFF     CALL ****文件夹软件.0049CFDC
    12. 004B314E    A2 8CB04B00     MOV BYTE PTR DS:[4BB08C],AL
    复制代码
    恩,现在明白了吧。

    好,我们接着来看那个算法核心CALL里有些啥宝贝:
    1. 00581205    33C9            XOR ECX,ECX
    2. 00581207    894D 88         MOV DWORD PTR SS:[EBP-78],ECX
    3. 0058120A    894D F4         MOV DWORD PTR SS:[EBP-C],ECX
    4. 0058120D    8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
    5. 00581210    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX        ; 机器码 (ASCII "Y3M75HN3QPJBYBD")
    6. 00581213    33C0            XOR EAX,EAX
    7. 00581215    55              PUSH EBP
    8. 00581216    68 CB125800     PUSH other.005812CB
    9. 0058121B    64:FF30         PUSH DWORD PTR FS:[EAX]
    10. 0058121E    64:8920         MOV DWORD PTR FS:[EAX],ESP
    11. 00581221    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    12. 00581224    E8 3735FAFF     CALL other.00524760
    13. 00581229    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]        ;  (ASCII "Y3M75HN3QPJBYBD")
    14. 0058122C    E8 E737FAFF     CALL other.00524A18
    15. 00581231    8945 F0         MOV DWORD PTR SS:[EBP-10],EAX       ; 机器码的长度 本例F=15
    16. 00581234    837D F0 00      CMP DWORD PTR SS:[EBP-10],0         ; 机器码长度为空吗?
    17. 00581238    74 73           JE SHORT other.005812AD
    18. 0058123A    B9 01000000     MOV ECX,1                           ; 计数器ECX初始化为1
    19. 0058123F    33DB            XOR EBX,EBX
    20. 00581241    8D75 8C         LEA ESI,DWORD PTR SS:[EBP-74]
    21. 00581244    3B4D F0         CMP ECX,DWORD PTR SS:[EBP-10]       ; 计数器ECX : 机器码的长度
    22. 00581247    7E 05           JLE SHORT other.0058124E            ; 不大于则跳
    23. 00581249    B9 01000000     MOV ECX,1
    24. 0058124E    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]        ; 机器码 (ASCII "Y3M75HN3QPJBYBD")
    25. 00581251    0FB67C08 FF     MOVZX EDI,BYTE PTR DS:[EAX+ECX-1]   ; 依次取机器码的每一位ASC
    26. 00581256    8BC7            MOV EAX,EDI
    27. 00581258    99              CDQ
    28. 00581259    F7F9            IDIV ECX                            ; /计数器(ECX)
    29. 0058125B    8BC2            MOV EAX,EDX                         ; 保存余数
    30. 0058125D    8BD3            MOV EDX,EBX                         ; 计数器EBX(初始=0),每循环 + 1
    31. 0058125F    0FAFD7          IMUL EDX,EDI                        ; 依次取的机器码每一位ASC  *  计数器EBX
    32. 00581262    03C2            ADD EAX,EDX                         ; 余数 + 乘积
    33. 00581264    2BC3            SUB EAX,EBX                         ; (余数 + 乘积)的和 - 计数器EBX
    34. 00581266    03C1            ADD EAX,ECX                         ; 差值 + 计数器ECX
    35. 00581268    BF 18000000     MOV EDI,18
    36. 0058126D    99              CDQ
    37. 0058126E    F7FF            IDIV EDI                            ; (差值 + 计数器ECX) /18H
    38. 00581270    8916            MOV DWORD PTR DS:[ESI],EDX          ; 余数保存起来~~~
    39. 00581272    41              INC ECX
    40. 00581273    43              INC EBX
    41. 00581274    83C6 04         ADD ESI,4
    42. 00581277    83FB 19         CMP EBX,19                          ; 计数器EBX:19H(注册码长度现在清楚了吧)
    43. 0058127A  ^ 75 C8           JNZ SHORT other.00581244
    44. 0058127C    BB 19000000     MOV EBX,19                          ; 25位!!!!
    45. 00581281    8D75 8C         LEA ESI,DWORD PTR SS:[EBP-74]
    46. 00581284    8D45 88         LEA EAX,DWORD PTR SS:[EBP-78]
    47. 00581287    8A16            MOV DL,BYTE PTR DS:[ESI]            ; 上面循环所保存的每一位余数
    48. 00581289    80C2 41         ADD DL,41                           ; 每一位余数asc + 41H
    49. 0058128C    E8 AF36FAFF     CALL other.00524940
    50. 00581291    8B55 88         MOV EDX,DWORD PTR SS:[EBP-78]       ; 转化为对应的字符
    51. 00581294    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
    52. 00581297    E8 8437FAFF     CALL other.00524A20
    53. 0058129C    83C6 04         ADD ESI,4
    54. 0058129F    4B              DEC EBX                             ; 计数器!
    55. 005812A0  ^ 75 E2           JNZ SHORT other.00581284
    56. 005812A2    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
    57. 005812A5    8B55 F4         MOV EDX,DWORD PTR SS:[EBP-C]        ; 转化对应的字符后相连而成的真码~~~~
    58. 005812A8    E8 0735FAFF     CALL other.005247B4
    59. 005812AD    33C0            XOR EAX,EAX
    60. 005812AF    5A              POP EDX
    61. 005812B0    59              POP ECX
    62. 005812B1    59              POP ECX
    63. 005812B2    64:8910         MOV DWORD PTR FS:[EAX],EDX
    64. 005812B5    68 D2125800     PUSH other.005812D2
    65. 005812BA    8D45 88         LEA EAX,DWORD PTR SS:[EBP-78]
    66. 005812BD    E8 9E34FAFF     CALL other.00524760
    67. 005812C2    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
    68. 005812C5    E8 9634FAFF     CALL other.00524760
    69. 005812CA    C3              RETN
    70. 005812CB  ^ E9 EC2DFAFF     JMP other.005240BC
    71. 005812D0  ^ EB E8           JMP SHORT other.005812BA
    72. 005812D2    5F              POP EDI
    复制代码


    恩,我们先来看看这个核心CALL里的几个关键信息:
    第一处:
    1. 00581244    3B4D F0         CMP ECX,DWORD PTR SS:[EBP-10]       ; 计数器ECX  :机器码的长度
    2. 00581247    7E 05           JLE SHORT other.0058124E            ; 不大于则跳
    3. 00581249    B9 01000000     MOV ECX,1
    4. 显然,如果机器码取完后,则计数器ECX则又从1开始。
    复制代码
    第二处:

    1. 00581277    83FB 19         CMP EBX,19                          ; 计数器EBX   :19H=25

    2. 0058127C    BB 19000000     MOV EBX,19                          ; 25位!!!!
    3. 这说明机器码会循环取值运算直到25位为止
    复制代码
    第三处:
    1. 00581289    80C2 41         ADD DL,41                           ; 每一位余数asc + 41H
    2. 0058128C    E8 AF36FAFF     CALL other.00524940
    3. 00581291    8B55 88         MOV EDX,DWORD PTR SS:[EBP-78]       ; 转化为对应的字符
    4. 这里就是将每一循环运算的余数 + 41H ,然后输出对应的字符并保存起来。
    复制代码


    好了,结合上面这3个关键信息,上面循环中的算法实现过程呢,我们可以这样来理解:

    1. a.计数器ECX其实就是所取机器码中的某位字符在机器码中的位置值。显然ECX是从1到len(机器码)。
    2. b.计数器EBX是循环取机器码直到25位为止。即EBX是从0 到 24。
    3.      机器码长度 < 25位时,则机器码复制并相连直到满足25位长度为止,设为JQMS。
    4. 本例机器码为"Y3M75HN3QPJBYBD",长度=15位,则JQMS应该为"Y3M75HN3QPJBYBDY3M75HN3QP";
    5.      计数器ECX则为1 到 15,循环计算;
    6.      计数器EBX依次从0到24,共25位。正好=len(JQMS)的值。
    7. 现在,以实例来表示这个算法的实现过程:
    8.      当取JQMS的第一位"Y"的时候其(16进制)ASC为59,10进制=89,ECX = 1 ,EBX =0 ,41H=65,18H =24
    复制代码
    则运算过程为:

    1.         ASC   ECX     ASC  EBX      EBX    ECX
    2. ((( 89 mod 1  ) + ( 89 *  0 )  -  0   +  1   )) mod 24 + 65  = 66  
    3. (            0         +       0      -  0   +  1      )mod 24 + 65  = 66
    4.    66的16进制为42,对应的字符为“B”
    5. 同理,当取JQMS的第16位"Y"时,ECX=1,EBX=15,则:
    6.       ASC   ECX          ASC  EBX      EBX    ECX
    7.   (( 89 mod 1  ) + ( 89 * 15 )  - 15   +  1   )mod 24 + 65  = 66  
    8.   (          0     +     1335  - 15   +  1   )mod 24 + 65  = 66
    9. 显然,结果又是对应的字符正好为“B”。
    10.   
    复制代码

    算法过程应该很清楚了吧。下面小结一下:

    1. 1.注册码与软件注册名无关
    2. 2.取机器码的1~25位(不足则复制机器码并连接直到满足25位为止),设为JQMS
    3. 3.机器码位置值(ECX)设为I(1 to 机器码长度),设JQMS的位置值Q(= 1 to 25),J为Q MOD I 的余数(若余数=0时则J=I)
    4. 4.依次取JQMS的每一位ASC mod 机器码位置值 的余数  +  取JQMS的每一位ASC * (Q-1) -(Q-1) + J
    5.    其和 mod 24
    6.    余数再 + 65  
    7. 得到对应的字符。直至运算完毕。
    复制代码



    好了,搞清楚了算法实现过程就可以顺便KeyGen了。附上写的很烂的代码(处女作,哈哈)如下:
    游客,如果您要查看本帖隐藏内容请回复


    软件的附加码其实就是注册码的变形存在注册表中的。即注册码的每一位ASC xor 23 的结果转化为对应的字符而已。这里就不再罗嗦了。


    最近流行无图无真 相,只好贴2张。哈哈

    ok.GIF

    about.GIF




    本文如有错误还望大牛们指正!

    谢谢观看~~~













    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

     楼主| 发表于 2012-8-30 10:49:34 | 显示全部楼层
    kiss-you 发表于 2012-8-30 06:26
    这个软件多年来算法都没变过,过去内存注册机遍地都是

    ,向K大学习。。。。


    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2015-7-20 08:10
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-8-30 06:26:50 | 显示全部楼层
    这个软件多年来算法都没变过,过去内存注册机遍地都是

    点评

    ,向K大学习。。。。  详情 回复 发表于 2012-8-30 10:49
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-6-2 15:44
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2012-8-30 14:38:40 | 显示全部楼层
    前排学习~~
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-5-31 13:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2012-8-30 15:28:15 | 显示全部楼层
    软件作者不靠卖软件,玩的是娱乐,或做其他的事
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    昨天 18:16
  • 签到天数: 1694 天

    [LV.Master]伴坛终老

    发表于 2012-8-30 15:55:11 | 显示全部楼层
    谢谢分享。学习啦
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 20:24
  • 签到天数: 1981 天

    [LV.Master]伴坛终老

    发表于 2012-8-30 20:13:13 | 显示全部楼层
    支持原创分析,学习算法
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    6 天前
  • 签到天数: 1612 天

    [LV.Master]伴坛终老

    发表于 2012-8-30 23:06:39 | 显示全部楼层
    网络验证的,不合法还会清空原来的注册信息变成未注册版

    点评

    是有网验,可在防火墙中禁止即可。 但这不是本文的目的。我主要是看它的算法分析而已  详情 回复 发表于 2012-8-31 10:09
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 20:25
  • 签到天数: 1812 天

    [LV.Master]伴坛终老

    发表于 2012-8-30 23:12:24 | 显示全部楼层
    谢谢分享。好好学习啦
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

     楼主| 发表于 2012-8-31 10:09:42 | 显示全部楼层
    本帖最后由 GGLHY 于 2012-8-31 10:17 编辑
    wxq 发表于 2012-8-30 23:06
    网络验证的,不合法还会清空原来的注册信息变成未注册版


    是有网验,可在防火墙中禁止即可。
    但这不是本文的目的。我主要是看它的算法来进行分析而已

    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表