GGLHY 发表于 2011-1-14 00:58:04

PowerCMD 2.1版注册解码实录

本帖最后由 GGLHY 于 2011-1-14 01:30 编辑

先声明下,文章有点长。如果大家略过对注册码格式检测这部分(二)的话,那么你的眼睛会少受点罪了!呵呵


                                 PowerCMD 2.1版注册解码实录

查壳:Microsoft Visual Studio .NET 2005 -- 2008 -> Microsoft Corporation
经过OD跟踪,得出注册码形如XXXXX-XXXXX-XXXXX-XXXXX(可参见对注册码格式检测部分),分别设4部分为S1、S2、S3、S4
                        S1 -S2 -S3 -S4

直接来到这里吧:

005E0D1C|.8D55 B8       lea   edx,       ; |
005E0D1F|.52            push    edx                ; |Arg1
005E0D20|.E8 5B9B0100   call    005FA880         ; \PowerCmd.005FA880 算法call,F7
005E0D25|.83C4 08       add   esp, 8
005E0D28|.0FB6C0      movzx   eax, al
005E0D2B|.83F8 01       cmp   eax, 1             ;标志位哦!
005E0D2E|.75 2D         jnz   short 005E0D5D   ;一失足就成千古恨啊...



                                       一、算法
////////////////////////////////////////////////////////////////////////////////////////////
算法call,F7:
005FA880/$55            push    ebp               ;本地调用来自 005E0D20(注册), 006007A5(重启验证)
005FA881|.8BEC          mov   ebp, esp
005FA883|.6A FF         push    -1
005FA885|.68 4DA56100   push    0061A54D
005FA88A|.64:A1 0000000>mov   eax, fs:
005FA890|.50            push    eax
005FA891|.81EC BC000000 sub   esp, 0BC
005FA897|.A1 58316D00   mov   eax,
005FA89C|.33C5          xor   eax, ebp
005FA89E|.8945 E4       mov   , eax
005FA8A1|.56            push    esi
005FA8A2|.50            push    eax
005FA8A3|.8D45 F4       lea   eax,
005FA8A6|.64:A3 0000000>mov   fs:, eax
005FA8AC|.C645 F3 00    mov   byte ptr , >
005FA8B0|.8B4D 0C       mov   ecx,
005FA8B3|.E8 28A2E1FF   call    00414AE0
005FA8B8|.83F8 17       cmp   eax, 17            ;注册码长度为23位吗?不是就错!
005FA8BB|.0F85 DA050000 jnz   005FAE9B
005FA8C1|.6A 00         push    0
005FA8C3|.6A 2D         push    2D               ;注意这个2D(“-”),想想看说明了什么?
005FA8C5|.8B4D 0C       mov   ecx,
005FA8C8|.E8 133EE3FF   call    0042E6E0         ;对注册码格式的检测及得到假码中第一个“-”前部分的长度
005FA8CD|.8945 E8       mov   , eax      ;
005FA8D0|.6A 01         push    1
005FA8D2|.6A 2D         push    2D               ;这里有一个2D(“-”)
005FA8D4|.8B4D 0C       mov   ecx,
005FA8D7|.E8 043EE3FF   call    0042E6E0         ;对注册码格式的检测及得到假码中最后一个“-”前部分的长度
005FA8DC|.8945 EC       mov   , eax      ;
005FA8DF|.8B45 E8       mov   eax,       ;
005FA8E2|.83C0 01       add   eax, 1
005FA8E5|.3945 EC       cmp   , eax      ;假码中第一个“-”前(含)部分的长度:最后一个“-”前部分的长度
005FA8E8|.0F8E AD050000 jle   005FAE9B
005FA8EE|.837D E8 00    cmp   dword ptr >,0;假码中第一个“-”前部分的长度
005FA8F2|.0F8E A3050000 jle   005FAE9B
005FA8F8|.8B4D EC       mov   ecx,       ;假码最后一个“-”前部分的长度
005FA8FB|.2B4D E8       sub   ecx,       ;得到注册码中第一个“-”(含)和最后一个“-”之间部分
005FA8FE|.83E9 01       sub   ecx, 1             ;呵呵,这里有个-1(去掉第一个“-”)
005FA901|.51            push    ecx                ; /Arg3注册码中第一个“-”(含)和最后一个“-”之间部分的长度
005FA902|.8B55 E8       mov   edx,       ; |注册码中第一个“-”前的长度
005FA905|.83C2 01       add   edx, 1             ; |
005FA908|.52            push    edx                ; |Arg2注册码中第一个“-”(含)前的长度
005FA909|.8D45 C8       lea   eax,       ; |
005FA90C|.50            push    eax                ; |Arg1
005FA90D|.8B4D 0C       mov   ecx,        ; |
005FA910|.E8 5B5AE3FF   call    00430370         ; \PowerCmd.00430370
005FA915|.C745 FC 00000>mov   dword ptr ,>
005FA91C|.6A 00         push    0
005FA91E|.6A 2D         push    2D               ;还有一个2D(“-”)
005FA920|.8D4D C8       lea   ecx,
005FA923|.E8 B83DE3FF   call    0042E6E0            ;对注册码格式的检测及假码中第一个“-”和第二个“-”之间部分长度
005FA928|.8945 C4       mov   , eax
005FA92B|.8B4D E8       mov   ecx,        ;假码中第一个“-”前部分的长度
005FA92E|.8B55 C4       mov   edx,
005FA931|.8D440A 01   lea   eax,     ;假码中第二个“-”前部分的长度
005FA935|.8945 C4       mov   , eax
005FA938|.837D E8 05    cmp   dword ptr > 5; 注册码第一个“-”前的部分的长度与5比较
005FA93C|.0F85 4A050000 jnz   005FAE8C             ;不相等就直接跳过让不为零的环节了!
005FA942|.8B4D E8       mov   ecx,       ;假码中第一个“-”前部分的长度
005FA945|.83C1 06       add   ecx, 6               ;呵呵,猜猜这里为什么是 + 6
005FA948|.394D C4       cmp   , ecx      ;长度比较
005FA94B|.0F85 3B050000 jnz   005FAE8C            ;即第二个“-”之前的长度应该为第一个“-”前的长度+6
005FA951|.8B55 C4       mov   edx,          ;即第二个“-”之前的长度
005FA954|.83C2 06       add   edx, 6
005FA957|.3955 EC       cmp   , edx         ;(再+6 后的长度):假码最后一个“-”之前的长度
005FA95A|.0F85 2C050000 jnz   005FAE8C             ;不等就跳
005FA960|.8B45 E8       mov   eax,          ;假码中第一个“-”前部分长度
005FA963|.50            push    eax                ; /Arg3
005FA964|.6A 00         push    0                  ; |Arg2 = 00000000
005FA966|.8D8D 70FFFFFF lea   ecx,       ; |
005FA96C|.51            push    ecx                ; |Arg1
005FA96D|.8B4D 0C       mov   ecx,        ; |
005FA970|.E8 FB59E3FF   call    00430370         ; \PowerCmd.00430370对注册码格式的检测2
005FA975|.C645 FC 01    mov   byte ptr , >
005FA979|.8B55 C4       mov   edx,
005FA97C|.2B55 E8       sub   edx,
005FA97F|.83EA 01       sub   edx, 1
005FA982|.52            push    edx                ; /Arg3
005FA983|.8B45 E8       mov   eax,       ; |
005FA986|.83C0 01       add   eax, 1             ; |
005FA989|.50            push    eax                ; |Arg2
005FA98A|.8D4D 8C       lea   ecx,       ; |
005FA98D|.51            push    ecx                ; |Arg1
005FA98E|.8B4D 0C       mov   ecx,        ; |
005FA991|.E8 DA59E3FF   call    00430370         ; \PowerCmd.00430370
005FA996|.C645 FC 02    mov   byte ptr , >
005FA99A|.8B55 EC       mov   edx,
005FA99D|.2B55 C4       sub   edx,
005FA9A0|.83EA 01       sub   edx, 1
005FA9A3|.52            push    edx                ; /Arg3
005FA9A4|.8B45 C4       mov   eax,       ; |
005FA9A7|.83C0 01       add   eax, 1             ; |
005FA9AA|.50            push    eax                ; |Arg2
005FA9AB|.8D8D 54FFFFFF lea   ecx,       ; |
005FA9B1|.51            push    ecx                ; |Arg1
005FA9B2|.8B4D 0C       mov   ecx,        ; |
005FA9B5|.E8 B659E3FF   call    00430370         ; \PowerCmd.00430370
005FA9BA|.C645 FC 03    mov   byte ptr , >
005FA9BE|.8B4D 0C       mov   ecx,
005FA9C1|.E8 1AA1E1FF   call    00414AE0
005FA9C6|.2B45 EC       sub   eax,
005FA9C9|.83E8 01       sub   eax, 1
005FA9CC|.50            push    eax
005FA9CD|.8D55 A8       lea   edx,
005FA9D0|.52            push    edx
005FA9D1|.8B4D 0C       mov   ecx,
005FA9D4|.E8 875AE3FF   call    00430460
005FA9D9|.C645 FC 04    mov   byte ptr , >
005FA9DD|.8D8D 70FFFFFF lea   ecx,
005FA9E3|.E8 F8A0E1FF   call    00414AE0         ;得到S1的长度
005FA9E8|.83F8 05       cmp   eax, 5             ;判断这里应该是注册码每段由5位组成!!!
005FA9EB|.0F85 65040000 jnz   005FAE56
005FA9F1|.8D4D 8C       lea   ecx,
005FA9F4|.E8 E7A0E1FF   call    00414AE0         ;得到S2的长度
005FA9F9|.83F8 05       cmp   eax, 5
005FA9FC|.0F85 54040000 jnz   005FAE56
005FAA02|.8D8D 54FFFFFF lea   ecx,
005FAA08|.E8 D3A0E1FF   call    00414AE0         ;得到S3的长度
005FAA0D|.83F8 05       cmp   eax, 5
005FAA10|.0F85 40040000 jnz   005FAE56
005FAA16|.8D4D A8       lea   ecx,
005FAA19|.E8 C2A0E1FF   call    00414AE0         ;得到S4的长度
005FAA1E|.83F8 05       cmp   eax, 5
005FAA21|.0F85 2F040000 jnz   005FAE56
005FAA27|.8D8D 70FFFFFF lea   ecx,
005FAA2D|.E8 2E3FE3FF   call    0042E960
005FAA32|.8D4D 8C       lea   ecx,
005FAA35|.E8 263FE3FF   call    0042E960
005FAA3A|.8D8D 54FFFFFF lea   ecx,
005FAA40|.E8 1B3FE3FF   call    0042E960
005FAA45|.8D4D A8       lea   ecx,
005FAA48|.E8 133FE3FF   call    0042E960
005FAA4D|.6A 00         push    0                  ; /Arg1 = 00000000
005FAA4F|.8D8D 70FFFFFF lea   ecx,       ; |
005FAA55|.E8 36DDE0FF   call    00408790         ; \PowerCmd.00408790
005FAA5A|.0FB730      movzx   esi, word ptr [eax>;取第一段S1的第一位ASC
005FAA5D|.6A 00         push    0                  ; /Arg1 = 00000000
005FAA5F|.8D4D 8C       lea   ecx,       ; |
005FAA62|.E8 29DDE0FF   call    00408790         ; \PowerCmd.00408790
005FAA67|.0FB700      movzx   eax, word ptr [eax>;取第二段S2的第1位ASC
005FAA6A|.03F0          add   esi, eax         ;二者相加,设为Q1
005FAA6C|.89B5 50FFFFFF mov   , esi
005FAA72|.6A 01         push    1                  ; /Arg1 = 00000001
005FAA74|.8D8D 70FFFFFF lea   ecx,       ; |
005FAA7A|.E8 11DDE0FF   call    00408790         ; \PowerCmd.00408790
005FAA7F|.0FB730      movzx   esi, word ptr [eax>;取第一段S1的第2位ASC
005FAA82|.6A 01         push    1                  ; /Arg1 = 00000001
005FAA84|.8D4D 8C       lea   ecx,       ; |
005FAA87|.E8 04DDE0FF   call    00408790         ; \PowerCmd.00408790
005FAA8C|.0FB708      movzx   ecx, word ptr [eax>;取第二段S1的第二位ASC
005FAA8F|.03F1          add   esi, ecx         ;二者相加,设为Q2
005FAA91|.89B5 44FFFFFF mov   , esi
005FAA97|.6A 02         push    2                  ; /Arg1 = 00000002
005FAA99|.8D8D 70FFFFFF lea   ecx,       ; |
005FAA9F|.E8 ECDCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAA4|.0FB730      movzx   esi, word ptr [eax>;取第一段S1的第3位ASC
005FAAA7|.6A 02         push    2                  ; /Arg1 = 00000002
005FAAA9|.8D4D 8C       lea   ecx,       ; |
005FAAAC|.E8 DFDCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAB1|.0FB710      movzx   edx, word ptr [eax>;取第二段S2的第3位ASC
005FAAB4|.03F2          add   esi, edx         ;二者相加,设为Q3
005FAAB6|.89B5 3CFFFFFF mov   , esi
005FAABC|.6A 03         push    3                  ; /Arg1 = 00000003
005FAABE|.8D8D 70FFFFFF lea   ecx,       ; |
005FAAC4|.E8 C7DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAC9|.0FB730      movzx   esi, word ptr [eax>;取第一段S1的第4位ASC
005FAACC|.6A 03         push    3                  ; /Arg1 = 00000003
005FAACE|.8D4D 8C       lea   ecx,       ; |
005FAAD1|.E8 BADCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAD6|.0FB700      movzx   eax, word ptr [eax>;取第二段S2的第4位ASC
005FAAD9|.03F0          add   esi, eax         ;二者相加,设为Q4
005FAADB|.89B5 38FFFFFF mov   , esi
005FAAE1|.6A 04         push    4                  ; /Arg1 = 00000004
005FAAE3|.8D8D 70FFFFFF lea   ecx,       ; |
005FAAE9|.E8 A2DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAEE|.0FB730      movzx   esi, word ptr [eax>;取第一段S1的第5位ASC
005FAAF1|.6A 04         push    4                  ; /Arg1 = 00000004
005FAAF3|.8D4D 8C       lea   ecx,       ; |
005FAAF6|.E8 95DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAAFB|.0FB708      movzx   ecx, word ptr [eax>;取第二段S2的第5位ASC
005FAAFE|.03F1          add   esi, ecx         ;二者相加,设为Q5
005FAB00|.89B5 48FFFFFF mov   , esi      ;Q5
005FAB06|.8B95 50FFFFFF mov   edx,       ;Q1
005FAB0C|.0395 44FFFFFF add   edx,       ;Q1 + Q2
005FAB12|.0395 3CFFFFFF add   edx,       ;和 + Q3
005FAB18|.0395 38FFFFFF add   edx,       ;(和 + Q3的)和 + Q4
005FAB1E|.0395 48FFFFFF add   edx,       ;[(和 + Q3的)和 + Q4]的和 + Q5 ,设为N1
005FAB24|.8995 40FFFFFF mov   , edx      ;N1
005FAB2A|.6A 00         push    0                  ; /Arg1 = 00000000
005FAB2C|.8D8D 54FFFFFF lea   ecx,       ; |
005FAB32|.E8 59DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB37|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第1位ASC
005FAB3A|.6A 00         push    0                  ; /Arg1 = 00000000
005FAB3C|.8D4D A8       lea   ecx,       ; |
005FAB3F|.E8 4CDCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB44|.0FB700      movzx   eax, word ptr [eax>;取第4段S4的第1位ASC
005FAB47|.03F0          add   esi, eax         ;二者相加,设为P1
005FAB49|.89B5 50FFFFFF mov   , esi
005FAB4F|.6A 01         push    1                  ; /Arg1 = 00000001
005FAB51|.8D8D 54FFFFFF lea   ecx,       ; |
005FAB57|.E8 34DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB5C|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第2位ASC
005FAB5F|.6A 01         push    1                  ; /Arg1 = 00000001
005FAB61|.8D4D A8       lea   ecx,       ; |
005FAB64|.E8 27DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB69|.0FB708      movzx   ecx, word ptr [eax>;取第4段S4的第2位ASC
005FAB6C|.03F1          add   esi, ecx         ;二者相加,设为P2
005FAB6E|.89B5 44FFFFFF mov   , esi
005FAB74|.6A 02         push    2                  ; /Arg1 = 00000002
005FAB76|.8D8D 54FFFFFF lea   ecx,       ; |
005FAB7C|.E8 0FDCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB81|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第3位ASC
005FAB84|.6A 02         push    2                  ; /Arg1 = 00000002
005FAB86|.8D4D A8       lea   ecx,       ; |
005FAB89|.E8 02DCE0FF   call    00408790         ; \PowerCmd.00408790
005FAB8E|.0FB710      movzx   edx, word ptr [eax>;取第4段S4的第3位ASC
005FAB91|.03F2          add   esi, edx         ;二者相加,设为P3
005FAB93|.89B5 3CFFFFFF mov   , esi
005FAB99|.6A 03         push    3                  ; /Arg1 = 00000003
005FAB9B|.8D8D 54FFFFFF lea   ecx,       ; |
005FABA1|.E8 EADBE0FF   call    00408790         ; \PowerCmd.00408790
005FABA6|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第4位ASC
005FABA9|.6A 03         push    3                  ; /Arg1 = 00000003
005FABAB|.8D4D A8       lea   ecx,       ; |
005FABAE|.E8 DDDBE0FF   call    00408790         ; \PowerCmd.00408790
005FABB3|.0FB700      movzx   eax, word ptr [eax>;取第4段S4的第4位ASC
005FABB6|.03F0          add   esi, eax         ;二者相加,设为P4
005FABB8|.89B5 38FFFFFF mov   , esi
005FABBE|.6A 04         push    4                  ; /Arg1 = 00000004
005FABC0|.8D8D 54FFFFFF lea   ecx,       ; |
005FABC6|.E8 C5DBE0FF   call    00408790         ; \PowerCmd.00408790
005FABCB|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第5位ASC
005FABCE|.6A 04         push    4                  ; /Arg1 = 00000004
005FABD0|.8D4D A8       lea   ecx,       ; |
005FABD3|.E8 B8DBE0FF   call    00408790         ; \PowerCmd.00408790
005FABD8|.0FB708      movzx   ecx, word ptr [eax>;取第4段S4的第5位ASC
005FABDB|.03F1          add   esi, ecx         ;二者相加,设为P5
005FABDD|.89B5 48FFFFFF mov   , esi      ;P5
005FABE3|.8B95 50FFFFFF mov   edx,       ;P1
005FABE9|.0395 44FFFFFF add   edx,       ;P1+P2
005FABEF|.0395 3CFFFFFF add   edx,       ;(和 + P3)
005FABF5|.0395 38FFFFFF add   edx,       ;(和 + P3)的和+ P4
005FABFB|.0395 48FFFFFF add   edx,       ;[(和 + P3)的和+ P4 ]的和 + P5
005FAC01|.8995 4CFFFFFF mov   , edx      ;结果设为T1
005FAC07|.8B85 40FFFFFF mov   eax,       ;N1
005FAC0D|.3B85 4CFFFFFF cmp   eax,       ;N1:T1
005FAC13|.75 04         jnz   short 005FAC19   ;不等就跳!即要注册成功,则N1必须T1
005FAC15|.C645 F3 01    mov   byte ptr , 1;///注意这里的地址
005FAC19|>6A 00         push    0                  ; /Arg1 = 00000000
005FAC1B|.8D8D 70FFFFFF lea   ecx,       ; |
005FAC21|.E8 6ADBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC26|.0FB708      movzx   ecx, word ptr [eax>;取第1段S1的第1位ASC
005FAC29|.83F9 50       cmp   ecx, 50            ;与50(P)比较
005FAC2C|.75 15         jnz   short 005FAC43
005FAC2E|.6A 01         push    1                  ; /Arg1 = 00000001
005FAC30|.8D8D 70FFFFFF lea   ecx,       ; |
005FAC36|.E8 55DBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC3B|.0FB710      movzx   edx, word ptr [eax>
005FAC3E|.83FA 43       cmp   edx, 43            ;与43(C)比较
005FAC41|.74 04         je      short 005FAC47
005FAC43|>C645 F3 00    mov   byte ptr , >;不等,这个地址会被置0
005FAC47|>6A 00         push    0                  ; /Arg1 = 00000000
005FAC49|.8D8D 54FFFFFF lea   ecx,       ; |
005FAC4F|.E8 3CDBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC54|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第1位ASC
005FAC57|.6A 00         push    0                  ; /Arg1 = 00000000
005FAC59|.8D8D 70FFFFFF lea   ecx,       ; |
005FAC5F|.E8 2CDBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC64|.0FB700      movzx   eax, word ptr [eax>;取第1段S1的第1位ASC
005FAC67|.03F0          add   esi, eax         ;二者相加,设为Z1
005FAC69|.89B5 50FFFFFF mov   , esi
005FAC6F|.6A 01         push    1                  ; /Arg1 = 00000001
005FAC71|.8D8D 54FFFFFF lea   ecx,       ; |
005FAC77|.E8 14DBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC7C|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第2位ASC
005FAC7F|.6A 01         push    1                  ; /Arg1 = 00000001
005FAC81|.8D8D 70FFFFFF lea   ecx,       ; |
005FAC87|.E8 04DBE0FF   call    00408790         ; \PowerCmd.00408790
005FAC8C|.0FB708      movzx   ecx, word ptr [eax>;取第1段S1的第2位ASC
005FAC8F|.03F1          add   esi, ecx         ;二者相加,设为Z2
005FAC91|.89B5 44FFFFFF mov   , esi
005FAC97|.6A 02         push    2                  ; /Arg1 = 00000002
005FAC99|.8D8D 54FFFFFF lea   ecx,       ; |
005FAC9F|.E8 ECDAE0FF   call    00408790         ; \PowerCmd.00408790
005FACA4|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第3位ASC
005FACA7|.6A 02         push    2                  ; /Arg1 = 00000002
005FACA9|.8D8D 70FFFFFF lea   ecx,       ; |
005FACAF|.E8 DCDAE0FF   call    00408790         ; \PowerCmd.00408790
005FACB4|.0FB710      movzx   edx, word ptr [eax>;取第1段S1的第3位ASC
005FACB7|.03F2          add   esi, edx         ;二者相加,设为Z3
005FACB9|.89B5 3CFFFFFF mov   , esi
005FACBF|.6A 03         push    3                  ; /Arg1 = 00000003
005FACC1|.8D8D 54FFFFFF lea   ecx,       ; |
005FACC7|.E8 C4DAE0FF   call    00408790         ; \PowerCmd.00408790
005FACCC|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第4位ASC
005FACCF|.6A 03         push    3                  ; /Arg1 = 00000003
005FACD1|.8D8D 70FFFFFF lea   ecx,       ; |
005FACD7|.E8 B4DAE0FF   call    00408790         ; \PowerCmd.00408790
005FACDC|.0FB700      movzx   eax, word ptr [eax>;取第1段S1的第4位ASC
005FACDF|.03F0          add   esi, eax         ;二者相加,设为Z4
005FACE1|.89B5 38FFFFFF mov   , esi
005FACE7|.6A 04         push    4                  ; /Arg1 = 00000004
005FACE9|.8D8D 54FFFFFF lea   ecx,       ; |
005FACEF|.E8 9CDAE0FF   call    00408790         ; \PowerCmd.00408790
005FACF4|.0FB730      movzx   esi, word ptr [eax>;取第3段S3的第5位ASC
005FACF7|.6A 04         push    4                  ; /Arg1 = 00000004
005FACF9|.8D8D 70FFFFFF lea   ecx,       ; |
005FACFF|.E8 8CDAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD04|.0FB708      movzx   ecx, word ptr [eax>;取第1段S1的第5位ASC
005FAD07|.03F1          add   esi, ecx         ;二者相加,设为Z5
005FAD09|.89B5 48FFFFFF mov   , esi      ;Z5
005FAD0F|.8B95 50FFFFFF mov   edx,       ;同上一样,累加!
005FAD15|.0395 44FFFFFF add   edx,
005FAD1B|.0395 3CFFFFFF add   edx,
005FAD21|.0395 38FFFFFF add   edx,
005FAD27|.0395 48FFFFFF add   edx,       ;累加的结果设为R1
005FAD2D|.8995 40FFFFFF mov   , edx
005FAD33|.6A 00         push    0                  ; /Arg1 = 00000000
005FAD35|.8D4D 8C       lea   ecx,       ; |
005FAD38|.E8 53DAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD3D|.0FB730      movzx   esi, word ptr [eax>;取第2段S2的第1位ASC
005FAD40|.6A 00         push    0                  ; /Arg1 = 00000000
005FAD42|.8D4D A8       lea   ecx,       ; |
005FAD45|.E8 46DAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD4A|.0FB700      movzx   eax, word ptr [eax>;取第4段S4的第1位ASC
005FAD4D|.03F0          add   esi, eax         ;二者相加,设为V1
005FAD4F|.89B5 50FFFFFF mov   , esi
005FAD55|.6A 01         push    1                  ; /Arg1 = 00000001
005FAD57|.8D4D 8C       lea   ecx,       ; |
005FAD5A|.E8 31DAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD5F|.0FB730      movzx   esi, word ptr [eax>;取第2段S2的第2位ASC
005FAD62|.6A 01         push    1                  ; /Arg1 = 00000001
005FAD64|.8D4D A8       lea   ecx,       ; |
005FAD67|.E8 24DAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD6C|.0FB708      movzx   ecx, word ptr [eax>;取第4段S4的第2位ASC
005FAD6F|.03F1          add   esi, ecx         ;二者相加,设为V2
005FAD71|.89B5 44FFFFFF mov   , esi
005FAD77|.6A 02         push    2                  ; /Arg1 = 00000002
005FAD79|.8D4D 8C       lea   ecx,       ; |
005FAD7C|.E8 0FDAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD81|.0FB730      movzx   esi, word ptr [eax>;取第2段S2的第3位ASC
005FAD84|.6A 02         push    2                  ; /Arg1 = 00000002
005FAD86|.8D4D A8       lea   ecx,       ; |
005FAD89|.E8 02DAE0FF   call    00408790         ; \PowerCmd.00408790
005FAD8E|.0FB710      movzx   edx, word ptr [eax>;取第4段S4的第3位ASC
005FAD91|.03F2          add   esi, edx         ;二者相加,设为V3
005FAD93|.89B5 3CFFFFFF mov   , esi
005FAD99|.6A 03         push    3                  ; /Arg1 = 00000003
005FAD9B|.8D4D 8C       lea   ecx,       ; |
005FAD9E|.E8 EDD9E0FF   call    00408790         ; \PowerCmd.00408790
005FADA3|.0FB730      movzx   esi, word ptr [eax>;取第2段S2的第4位ASC
005FADA6|.6A 03         push    3                  ; /Arg1 = 00000003
005FADA8|.8D4D A8       lea   ecx,       ; |
005FADAB|.E8 E0D9E0FF   call    00408790         ; \PowerCmd.00408790
005FADB0|.0FB700      movzx   eax, word ptr [eax>;取第4段S4的第4位ASC
005FADB3|.03F0          add   esi, eax         ;二者相加,设为V4
005FADB5|.89B5 38FFFFFF mov   , esi
005FADBB|.6A 04         push    4                  ; /Arg1 = 00000004
005FADBD|.8D4D 8C       lea   ecx,       ; |
005FADC0|.E8 CBD9E0FF   call    00408790         ; \PowerCmd.00408790
005FADC5|.0FB730      movzx   esi, word ptr [eax>;取第2段S2的第5位ASC
005FADC8|.6A 04         push    4                  ; /Arg1 = 00000004
005FADCA|.8D4D A8       lea   ecx,       ; |
005FADCD|.E8 BED9E0FF   call    00408790         ; \PowerCmd.00408790
005FADD2|.0FB708      movzx   ecx, word ptr [eax>;取第4段S4的第5位ASC
005FADD5|.03F1          add   esi, ecx         ;二者相加,设为V5
005FADD7|.89B5 48FFFFFF mov   , esi      ;V5
005FADDD|.8B95 50FFFFFF mov   edx,
005FADE3|.0395 44FFFFFF add   edx,
005FADE9|.0395 3CFFFFFF add   edx,
005FADEF|.0395 38FFFFFF add   edx,
005FADF5|.0395 48FFFFFF add   edx,
005FADFB|.8995 4CFFFFFF mov   , edx      ;同上一样,累加!得到的结果设为W1
005FAE01|.8B85 40FFFFFF mov   eax,
005FAE07|.3B85 4CFFFFFF cmp   eax,       ;R1:W1
005FAE0D|.7D 04         jge   short 005FAE13   ;不小于就跳
005FAE0F|.C645 F3 00    mov   byte ptr , 0;还是这个地址!!!
005FAE13|>6A 02         push    2                  ; /Arg1 = 00000002
005FAE15|.8D8D 70FFFFFF lea   ecx,       ; |
005FAE1B|.E8 70D9E0FF   call    00408790         ; \PowerCmd.00408790
005FAE20|.0FB708      movzx   ecx, word ptr [eax>;S1的第3位
005FAE23|.83F9 4D       cmp   ecx, 4D            ;与4D(M)比较
005FAE26|.75 2A         jnz   short 005FAE52   ;不等就跳
005FAE28|.6A 03         push    3                  ; /Arg1 = 00000003
005FAE2A|.8D8D 70FFFFFF lea   ecx,       ; |
005FAE30|.E8 5BD9E0FF   call    00408790         ; \PowerCmd.00408790
005FAE35|.0FB710      movzx   edx, word ptr [eax>
005FAE38|.83FA 44       cmp   edx, 44            '与44(D)比较
005FAE3B|.75 15         jnz   short 005FAE52
005FAE3D|.6A 04         push    4                  ; /Arg1 = 00000004
005FAE3F|.8D8D 70FFFFFF lea   ecx,       ; |
005FAE45|.E8 46D9E0FF   call    00408790         ; \PowerCmd.00408790
005FAE4A|.0FB700      movzx   eax, word ptr [eax>
005FAE4D|.83F8 41       cmp   eax, 41             ;与41(A)比较
005FAE50|.74 04         je      short 005FAE56
005FAE52|>C645 F3 00    mov   byte ptr , 0;跳到这里来,呵呵!还记得这个地址吗?也可以在这里爆破
005FAE56|>C645 FC 03    mov   byte ptr , 3
005FAE5A|.8D4D A8       lea   ecx,
005FAE5D|.E8 DE7CE0FF   call    00402B40
005FAE62|.C645 FC 02    mov   byte ptr , >
005FAE66|.8D8D 54FFFFFF lea   ecx,
005FAE6C|.E8 CF7CE0FF   call    00402B40
005FAE71|.C645 FC 01    mov   byte ptr , >
005FAE75|.8D4D 8C       lea   ecx,
005FAE78|.E8 C37CE0FF   call    00402B40
005FAE7D|.C645 FC 00    mov   byte ptr , >;?
005FAE81|.8D8D 70FFFFFF lea   ecx,
005FAE87|.E8 B47CE0FF   call    00402B40
005FAE8C|>C745 FC FFFFF>mov   dword ptr ,>
005FAE93|.8D4D C8       lea   ecx,
005FAE96|.E8 A57CE0FF   call    00402B40
005FAE9B|>8A4D F3       mov   cl,       ;又是它,很好的爆破点哦
005FAE9E|.880D 14A17000 mov   , cl       ;传说中的全局变量?
005FAEA4|.8A45 F3       mov   al,       ;还是它!
005FAEA7|.8B4D F4       mov   ecx,
005FAEAA|.64:890D 00000>mov   fs:, ecx
005FAEB1|.59            pop   ecx
005FAEB2|.5E            pop   esi
005FAEB3|.8B4D E4       mov   ecx,
005FAEB6|.33CD          xor   ecx, ebp
005FAEB8|.E8 FF27E2FF   call    0041D6BC
005FAEBD|.8BE5          mov   esp, ebp
005FAEBF|.5D            pop   ebp
005FAEC0\.C3            retn
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

=============================================================================================================
关于:
005FC8A0/$55            push    ebp
005FC8A1|.8BEC          mov   ebp, esp
005FC8A3|.51            push    ecx
005FC8A4|.C745 FC 00000>mov   dword ptr , 0
005FC8AB|.0FB605 14A170>movzx   eax, byte ptr    ;///在哪里?在哪里见过你?你的样子我觉得好熟悉
005FC8B2|.85C0          test    eax, eax
005FC8B4|.74 2A         je      short 005FC8E0             ;跳向未注册用户
005FC8B6|.B9 D8A07000   mov   ecx, 0070A0D8
005FC8BB|.E8 80CCE0FF   call    00409540
005FC8C0|.50            push    eax
005FC8C1|.68 B0126900   push    006912B0
005FC8C6|.8B4D 08       mov   ecx,
005FC8C9|.51            push    ecx
005FC8CA|.E8 D14AE3FF   call    004313A0
005FC8CF|.83C4 0C       add   esp, 0C
005FC8D2|.8B55 FC       mov   edx,
005FC8D5|.83CA 01       or      edx, 1
005FC8D8|.8955 FC       mov   , edx
005FC8DB|.8B45 08       mov   eax,
005FC8DE|.EB 19         jmp   short 005FC8F9
005FC8E0|>68 D4126900   push    006912D4                   ; /未注册用户
005FC8E5|.8B4D 08       mov   ecx,                ; |
005FC8E8|.E8 D354E0FF   call    00401DC0                   ; \PowerCmd.00401DC0
005FC8ED|.8B45 FC       mov   eax,
   省略部分代码
===================================================================================================================





//////////////////////////////////////////////////    总结: ///////////////////////////////////////////////

(一)爆破点:
我们看看这里:
(注册部分)
005FAE9B|>8A4D F3       mov   cl,       ;让我欢喜让我忧的
005FAE9E|.880D 14A17000 mov   , cl       ;传说中的全局变量?
再看这里:
(about部分)
005FC8AB|.0FB605 14A170>movzx   eax, byte ptr    ;还记得这个地址吗?
005FC8B2|.85C0          test    eax, eax
005FC8B4|.74 2A         je      short 005FC8E0             ;跳向未注册用户

所以说,如果要爆破的话,关键就在,呵呵!
至于在哪里爆破,相信大家都已经很清楚了!

------------------------------------------------------------------------------------------------

(二)算法总结:
1.与用户名无关(貌似和serial也无关)
2.由3位“-”将20位注册码平分为4部分
即注册码形如XXXXX-XXXXX-XXXXX-XXXXX,分别设4部分为S1、S2、S3、S4;
3.注册成功须满足:
S1固定为:pcdma(不区分大小写,程序自动转换为大写);
S1各位ASC累加值和 + S2各位ASC累加值和   =   S3各位ASC累加值和 + S4各位ASC累加值和

S1各位ASC累加值和 + S3各位ASC累加值和   >=S2各位ASC累加值和 + S4各位ASC累加值和


////////////////////////////////////////////////////////////////////////////////////////////////


因此,完全可以构造N组注册码;比如 pcmda-45678-qdneb-34567
                              pcmda-88888-qdneb-77777
                              pcmda-99999-qdneb-88888

呵呵,聪明的你一定看出来这组注册码的规律了!


注册信息保存在HKEY_CURRENT_USER\Software\PowerCmd
"Serial"=dword:4d2eeee5                                  ///这个好像删除都可以
"Name"="我爱我的祖国!"
"Key"="pcmda-99999-qdneb-88888"

运行后会在PowerCmd.ini里项下看见注册信息。







                                          二: 关于注册码的格式和检测:

这里值得一提的是对注册码的格式推测和判断
1.关于连字符“-”
005FA8C3|.6A 2D         push    2D               ;2D(“-”)
005FA8D2|.6A 2D         push    2D               ; 这里有一个2D(“-”)
005FA91E|.6A 2D         push    2D               ;还有一个2D(“-”)
推测注册码应该有连字符“-”;而且共push了3次,可能意味着有3个“-”当然开始只是猜测而已。

2.非连字符部分
005FA8B8|.83F8 17       cmp   eax, 17            ;推测注册码长度应该是23位
如果有3个“-”的情况成立的话,那么注册码非连字符部分应该有23-3=20位。正好被平均分成4部分。
好,我们接着往下看

3.是否被均分为4部分?
先看这里:
005FA8AC|.C645 F3 00    MOV BYTE PTR SS:,0;注意看这里,很关键的0
005FA8B0|.8B4D 0C       MOV ECX,DWORD PTR SS:
005FA8B3|.E8 28A2E1FF   CALL PowerCmd.00414AE0
005FA8B8|.83F8 17       CMP EAX,17               ;注册码的长度是23位吗?
005FA8BB|.0F85 DA050000 JNZ PowerCmd.005FAE9B      ;不是的话,那么看看跳往 哪里了?
接着看这里:
005FA938|.837D E8 05    cmp   dword ptr >;第一个“-”之前的注册码长度:5
005FA93C|.0F85 4A050000 jnz   005FAE8C
005FA942|.8B4D E8       mov   ecx,
005FA945|.83C1 06       add   ecx, 6             ;注意这里的6
005FA948|.394D C4       cmp   , ecx      ;长度比较
005FA94B|.0F85 3B050000 jnz   005FAE8C
005FA951|.8B55 C4       mov   edx,
005FA954|.83C2 06       add   edx, 6            ;还有这里的6
005FA957|.3955 EC       cmp   , edx
005FA95A|.0F85 2C050000 jnz   005FAE8C
再看这里:
05FA9E3|.E8 F8A0E1FF   call    00414AE0         ;得到S1的长度
005FA9E8|.83F8 05       cmp   eax, 5            ;判断这里应该是注册码每段由5位组成
005FA9EB|.0F85 65040000 jnz   005FAE56         
005FA9F1|.8D4D 8C       lea   ecx,
005FA9F4|.E8 E7A0E1FF   call    00414AE0          ;得到S2的长度
005FA9F9|.83F8 05       cmp   eax, 5            ;同上
005FA9FC|.0F85 54040000 jnz   005FAE56
005FAA02|.8D8D 54FFFFFF lea   ecx,
005FAA08|.E8 D3A0E1FF   call    00414AE0         ;得到S3的长度
005FAA0D|.83F8 05       cmp   eax, 5             ;同上
005FAA10|.0F85 40040000 jnz   005FAE56
005FAA16|.8D4D A8       lea   ecx,
005FAA19|.E8 C2A0E1FF   call    00414AE0         ;得到S4的长度
005FAA1E|.83F8 05       cmp   eax, 5             ;同上
005FAA21|.0F85 2F040000 jnz   005FAE56
还有:               
005FA8C1|.6A 00         PUSH 0
005FA8C3|.6A 2D         PUSH 2D                            ;这里的“-”
005FA8C5|.8B4D 0C       MOV ECX,DWORD PTR SS:
005FA8C8|.E8 133EE3FF   CALL PowerCmd.0042E6E0
005FA8CD|.8945 E8       MOV DWORD PTR SS:,EAX
005FA8D0|.6A 01         PUSH 1
005FA8D2|.6A 2D         PUSH 2D                            ;还有个“-”
005FA8D4|.8B4D 0C       MOV ECX,DWORD PTR SS:
005FA8D7|.E8 043EE3FF   CALL PowerCmd.0042E6E0
005FA8DC|.8945 EC       MOV DWORD PTR SS:,EAX
005FA8DF|.8B45 E8       MOV EAX,DWORD PTR SS:
005FA8E2|.83C0 01       ADD EAX,1
005FA8E5|.3945 EC       CMP DWORD PTR SS:,EAX
005FA8E8|.0F8E AD050000 JLE PowerCmd.005FAE9B            ;这里有一个
005FA8EE|.837D E8 00    CMP DWORD PTR SS:,0
005FA8F2|.0F8E A3050000 JLE PowerCmd.005FAE9B            ;这还有一个,
跳向:
005FAE9B|> \8A4D F3       MOV CL,BYTE PTR SS:         ;直接跳到这里来了,而这里的这里已经被005FA8AC处的MOV BYTE PTR SS:,0 为0,结果就不必说了
005FAE9E|.880D 14A17000 MOV BYTE PTR DS:,CL      ;全局变量
005FAEA4|.8A45 F3       MOV AL,BYTE PTR SS:         ;AL也被赋值为0了

因此,从上面的内容来看,除了注册码长度为23位外,注册码还必须含有3个“-”,余下的20位被3个“-”平均分成4等分。
其实,验证一下就知道我们的推测对不对,呵呵!
改变下注册码形式:
分别用1个“-”、2个“-”、3个“-”输出3组注册码
1234567890a-cdefghijklm
1234567-90abcdefgh-jklm
12345-7890a-cdefg-ijklm输入进去,
结果表明我们的推测是成立的。

注册码格式检测1:
0042E6E0/$0FB74424 04   MOVZX EAX,WORD PTR SS:   ;"-"
0042E6E5|.807C24 08 00CMP BYTE PTR SS:,0         ;!
0042E6EA|.6A 01         PUSH 1
0042E6EC|.8D5424 0C   LEA EDX,DWORD PTR SS:
0042E6F0|.894424 0C   MOV DWORD PTR SS:,EAX      ;“-”(2D)
0042E6F4|.74 0A         JE SHORT PowerCmd.0042E700
0042E6F6|.6A FF         PUSH -1
0042E6F8|.52            PUSH EDX
0042E6F9|.E8 42F8FFFF   CALL PowerCmd.0042DF40            ;注册码检测1-2    得到注册码(已比较)/【未比较】的部分的长度,也决定着下面条件跳转是否成立
0042E6FE|.EB 08         JMP SHORT PowerCmd.0042E708
0042E700|>6A 00         PUSH 0                            ; |Arg2 = 00000000
0042E702|.52            PUSH EDX                        ; |Arg1
0042E703|.E8 08F7FDFF   CALL PowerCmd.0040DE10            ; 注册码格式检测1-1 这个CALL里,EAX的值决定着下面的跳转
0042E708|>83F8 FF       CMP EAX,-1                        ;
0042E70B|.75 02         JNZ SHORT PowerCmd.0042E70F
0042E70D|.0BC0          OR EAX,EAX
0042E70F\>C2 0800       RETN 8

注册码检测1-1:
0040DE10/$55            PUSH EBP
0040DE11|.8BEC          MOV EBP,ESP
0040DE13|.83EC 10       SUB ESP,10
0040DE16|.894D F0       MOV DWORD PTR SS:,ECX
0040DE19|.837D 10 00    CMP DWORD PTR SS:,0
0040DE1D|.75 13         JNZ SHORT PowerCmd.0040DE32
0040DE1F|.8B45 F0       MOV EAX,DWORD PTR SS:
0040DE22|.8B4D 0C       MOV ECX,DWORD PTR SS:
0040DE25|.3B48 14       CMP ECX,DWORD PTR DS:
0040DE28|.77 08         JA SHORT PowerCmd.0040DE32
0040DE2A|.8B45 0C       MOV EAX,DWORD PTR SS:
0040DE2D|.E9 B1000000   JMP PowerCmd.0040DEE3
0040DE32|>8B55 F0       MOV EDX,DWORD PTR SS:
0040DE35|.8B45 0C       MOV EAX,DWORD PTR SS:
0040DE38|.3B42 14       CMP EAX,DWORD PTR DS:   ;假码长度、假码中第一个“-”和最后一个“-”之间部分的长度【不同CALL调用时有所不同】
0040DE3B|.0F83 9F000000 JNB PowerCmd.0040DEE0
0040DE41|.8B4D F0       MOV ECX,DWORD PTR SS:
0040DE44|.8B51 14       MOV EDX,DWORD PTR DS:   ;同上
0040DE47|.2B55 0C       SUB EDX,DWORD PTR SS:
0040DE4A|.8955 FC       MOV DWORD PTR SS:,EDX      ;同上
0040DE4D|.8B45 10       MOV EAX,DWORD PTR SS:
0040DE50|.3B45 FC       CMP EAX,DWORD PTR SS:
0040DE53|.0F87 87000000 JA PowerCmd.0040DEE0
0040DE59|.8B4D 10       MOV ECX,DWORD PTR SS:
0040DE5C|.83E9 01       SUB ECX,1
0040DE5F|.8B55 FC       MOV EDX,DWORD PTR SS:      ;同上
0040DE62|.2BD1          SUB EDX,ECX
0040DE64|.8955 FC       MOV DWORD PTR SS:,EDX
0040DE67|.8B4D F0       MOV ECX,DWORD PTR SS:
0040DE6A|.E8 E149FFFF   CALL PowerCmd.00402850
0040DE6F|.8B4D 0C       MOV ECX,DWORD PTR SS:
0040DE72|.8D1448      LEA EDX,DWORD PTR DS:
0040DE75|.8955 F4       MOV DWORD PTR SS:,EDX      ;假码、假码第一和最后“-”之间的部分【不同的CALL调用时有不同】
0040DE78|.EB 1C         JMP SHORT PowerCmd.0040DE96
0040DE7A|>8B45 F8       /MOV EAX,DWORD PTR SS:
0040DE7D|.2B45 F4       |SUB EAX,DWORD PTR SS:
0040DE80|.D1F8          |SAR EAX,1
0040DE82|.83C0 01       |ADD EAX,1
0040DE85|.8B4D FC       |MOV ECX,DWORD PTR SS:
0040DE88|.2BC8          |SUB ECX,EAX
0040DE8A|.894D FC       |MOV DWORD PTR SS:,ECX
0040DE8D|.8B55 F8       |MOV EDX,DWORD PTR SS:
0040DE90|.83C2 02       |ADD EDX,2
0040DE93|.8955 F4       |MOV DWORD PTR SS:,EDX
0040DE96|>8B45 08      MOV EAX,DWORD PTR SS:   ;“-”
0040DE99|.50            |PUSH EAX                         ; /Arg3
0040DE9A|.8B4D FC       |MOV ECX,DWORD PTR SS:   ; |
0040DE9D|.51            |PUSH ECX                         ; |Arg2
0040DE9E|.8B55 F4       |MOV EDX,DWORD PTR SS:   ; |
0040DEA1|.52            |PUSH EDX                         ; |Arg1
0040DEA2|.E8 A9590000   |CALL PowerCmd.00413850         ; \PowerCmd.00413850
0040DEA7|.83C4 0C       |ADD ESP,0C
0040DEAA|.8945 F8       |MOV DWORD PTR SS:,EAX   ;上面CALL决定了EAX是否为0
0040DEAD|.837D F8 00    |CMP DWORD PTR SS:,0
0040DEB1|.74 2D         |JE SHORT PowerCmd.0040DEE0       ;EAX为0,则跳出循环
0040DEB3|.8B45 10       |MOV EAX,DWORD PTR SS:
0040DEB6|.50            |PUSH EAX                         ; /Arg3
0040DEB7|.8B4D 08       |MOV ECX,DWORD PTR SS:   ; |“-”(2D)
0040DEBA|.51            |PUSH ECX                         ; |Arg2
0040DEBB|.8B55 F8       |MOV EDX,DWORD PTR SS:   ; |假码中剩余部分(包含“-”)
0040DEBE|.52            |PUSH EDX                         ; |Arg1
0040DEBF|.E8 1C65FFFF   |CALL PowerCmd.004043E0         ; \PowerCmd.004043E0
0040DEC4|.83C4 0C       |ADD ESP,0C
0040DEC7|.85C0          |TEST EAX,EAX
0040DEC9|.75 13         |JNZ SHORT PowerCmd.0040DEDE
0040DECB|.8B4D F0       |MOV ECX,DWORD PTR SS:
0040DECE|.E8 7D49FFFF   |CALL PowerCmd.00402850
0040DED3|.8B4D F8       |MOV ECX,DWORD PTR SS:   ;假码中剩余部分(包含第一个“-”)
0040DED6|.2BC8          |SUB ECX,EAX
0040DED8|.D1F9          |SAR ECX,1
0040DEDA|.8BC1          |MOV EAX,ECX
0040DEDC|.EB 05         |JMP SHORT PowerCmd.0040DEE3
0040DEDE|>^ EB 9A         \JMP SHORT PowerCmd.0040DE7A
0040DEE0|>83C8 FF       OR EAX,FFFFFFFF
0040DEE3|>8BE5          MOV ESP,EBP
0040DEE5|.5D            POP EBP
0040DEE6\.C2 0C00       RETN 0C

注册码检测1-2:
0042DF40/$51            PUSH ECX
0042DF41|.55            PUSH EBP
0042DF42|.57            PUSH EDI
0042DF43|.8B7C24 18   MOV EDI,DWORD PTR SS:
0042DF47|.8BE9          MOV EBP,ECX
0042DF49|.8B45 14       MOV EAX,DWORD PTR SS:   ;假码长度
0042DF4C|.896C24 08   MOV DWORD PTR SS:,EBP
0042DF50|.85FF          TEST EDI,EDI
0042DF52|.75 14         JNZ SHORT PowerCmd.0042DF68
0042DF54|.8B4C24 14   MOV ECX,DWORD PTR SS:
0042DF58|.3BC8          CMP ECX,EAX
0042DF5A|.0F83 BB000000 JNB PowerCmd.0042E01B
0042DF60|.5F            POP EDI
0042DF61|.8BC1          MOV EAX,ECX
0042DF63|.5D            POP EBP
0042DF64|.59            POP ECX
0042DF65|.C2 0C00       RETN 0C
0042DF68|>53            PUSH EBX
0042DF69|.56            PUSH ESI
0042DF6A|.3BF8          CMP EDI,EAX
0042DF6C|.0F87 A4000000 JA PowerCmd.0042E016
0042DF72|.8B4C24 1C   MOV ECX,DWORD PTR SS:
0042DF76|.2BC7          SUB EAX,EDI                     ;假码长度-
0042DF78|.3BC8          CMP ECX,EAX
0042DF7A|.73 02         JNB SHORT PowerCmd.0042DF7E
0042DF7C|.8BC1          MOV EAX,ECX
0042DF7E|>8B4D 18       MOV ECX,DWORD PTR SS:
0042DF81|.894C24 20   MOV DWORD PTR SS:,ECX   ;假码长度
0042DF85|.83F9 08       CMP ECX,8                         ;假码长度与8比较
0042DF88|.8D4D 04       LEA ECX,DWORD PTR SS:
0042DF8B|.894C24 1C   MOV DWORD PTR SS:,ECX
0042DF8F|.72 02         JB SHORT PowerCmd.0042DF93
0042DF91|.8B09          MOV ECX,DWORD PTR DS:      ;假码
0042DF93|>8B5C24 18   MOV EBX,DWORD PTR SS:   ;“-”(2D)
0042DF97|.8D3441      LEA ESI,DWORD PTR DS:;假码最后一位
0042DF9A|.8D9B 00000000 LEA EBX,DWORD PTR DS:      ;“-”(2D)
0042DFA0|>0FB703      /MOVZX EAX,WORD PTR DS:      ;“-”(2D)
0042DFA3|.66:3906       |CMP WORD PTR DS:,AX         ;“-”(2D)依次与(倒序的)假码比较
0042DFA6|.75 4C         |JNZ SHORT PowerCmd.0042DFF4      ;不等就跳
0042DFA8|.8BD7          |MOV EDX,EDI
0042DFAA|.8BCB          |MOV ECX,EBX
0042DFAC|.8BC6          |MOV EAX,ESI
0042DFAE|.85FF          |TEST EDI,EDI
0042DFB0|.76 13         |JBE SHORT PowerCmd.0042DFC5
0042DFB2|>66:8B28       |/MOV BP,WORD PTR DS:      ;已比较过的假码的第一位
0042DFB5|.66:3B29       ||CMP BP,WORD PTR DS:      ;“-”(2D)
0042DFB8|.75 26         ||JNZ SHORT PowerCmd.0042DFE0
0042DFBA|.83C0 02       ||ADD EAX,2
0042DFBD|.83C1 02       ||ADD ECX,2
0042DFC0|.83EA 01       ||SUB EDX,1
0042DFC3|.^ 75 ED         |\JNZ SHORT PowerCmd.0042DFB2
0042DFC5|>837C24 20 08|CMP DWORD PTR SS:,8      ;假码长度与8比较
0042DFCA|.72 38         |JB SHORT PowerCmd.0042E004
0042DFCC|.8B5424 1C   |MOV EDX,DWORD PTR SS:
0042DFD0|.8B0A          |MOV ECX,DWORD PTR DS:       ;假码
0042DFD2|.8BC6          |MOV EAX,ESI                      ;ESI(已比较过的假码)
0042DFD4|.5E            |POP ESI
0042DFD5|.5B            |POP EBX
0042DFD6|.2BC1          |SUB EAX,ECX                      ;倒序比较后还未比较的注册码部分
0042DFD8|.5F            |POP EDI
0042DFD9|.D1F8          |SAR EAX,1                        ;得到注册码未比较的部分的长度
0042DFDB|.5D            |POP EBP
0042DFDC|.59            |POP ECX
0042DFDD|.C2 0C00       |RETN 0C
0042DFE0|>66:8BC5       |MOV AX,BP
0042DFE3|.66:3B01       |CMP AX,WORD PTR DS:
0042DFE6|.1BC9          |SBB ECX,ECX
0042DFE8|.83E1 FE       |AND ECX,FFFFFFFE
0042DFEB|.83C1 01       |ADD ECX,1
0042DFEE|.^ 74 D5         |JE SHORT PowerCmd.0042DFC5
0042DFF0|.8B6C24 10   |MOV EBP,DWORD PTR SS:
0042DFF4|>8BCD          |MOV ECX,EBP
0042DFF6|.E8 5548FDFF   |CALL PowerCmd.00402850
0042DFFB|.3BF0          |CMP ESI,EAX                      ;已经比较过的假码 与 整个假码比较
0042DFFD|.74 17         |JE SHORT PowerCmd.0042E016       ;全部比较过后则跳出循环,也就决定了下面的EAX的值
0042DFFF|.83EE 02       |SUB ESI,2
0042E002|.^ EB 9C         \JMP SHORT PowerCmd.0042DFA0
0042E004|>8B4C24 1C   MOV ECX,DWORD PTR SS:
0042E008|.8BC6          MOV EAX,ESI
0042E00A|.5E            POP ESI
0042E00B|.5B            POP EBX
0042E00C|.2BC1          SUB EAX,ECX
0042E00E|.5F            POP EDI
0042E00F|.D1F8          SAR EAX,1
0042E011|.5D            POP EBP
0042E012|.59            POP ECX
0042E013|.C2 0C00       RETN 0C
0042E016|>5E            POP ESI
0042E017|.83C8 FF       OR EAX,FFFFFFFF
0042E01A|.5B            POP EBX
0042E01B|>5F            POP EDI
0042E01C|.5D            POP EBP
0042E01D|.59            POP ECX
0042E01E\.C2 0C00       RETN 0C

注册码格式检测2:
00430370/$6A FF         PUSH -1
00430372|.68 78496000   PUSH PowerCmd.00604978
00430377|.64:A1 0000000>MOV EAX,DWORD PTR FS:
0043037D|.50            PUSH EAX
0043037E|.83EC 24       SUB ESP,24
00430381|.A1 58316D00   MOV EAX,DWORD PTR DS:   ;
00430386|.33C4          XOR EAX,ESP
00430388|.894424 20   MOV DWORD PTR SS:,EAX
0043038C|.53            PUSH EBX
0043038D|.55            PUSH EBP
0043038E|.56            PUSH ESI
0043038F|.57            PUSH EDI
00430390|.A1 58316D00   MOV EAX,DWORD PTR DS:
00430395|.33C4          XOR EAX,ESP
00430397|.50            PUSH EAX
00430398|.8D4424 38   LEA EAX,DWORD PTR SS:
0043039C|.64:A3 0000000>MOV DWORD PTR FS:,EAX
004303A2|.8B4424 50   MOV EAX,DWORD PTR SS:
004303A6|.8B7424 48   MOV ESI,DWORD PTR SS:
004303AA|.8B5424 4C   MOV EDX,DWORD PTR SS:
004303AE|.33DB          XOR EBX,EBX
004303B0|.8BF9          MOV EDI,ECX
004303B2|.8B4F 14       MOV ECX,DWORD PTR DS:   ;注册码长度
004303B5|.895C24 14   MOV DWORD PTR SS:,EBX
004303B9|.83F8 FF       CMP EAX,-1                        ;注册码中第一个“-”和最后一个“-”之间部分的长度、注册码第一个“-”前的长度【不同的CALL调用时有不同。下同】
004303BC|.75 04         JNZ SHORT PowerCmd.004303C2
004303BE|.8BC1          MOV EAX,ECX
004303C0|.2BC2          SUB EAX,EDX
004303C2|>8D2C02      LEA EBP,DWORD PTR DS:    ;假码最后一个“-”(含)之前部分的长度
004303C5|.3BE9          CMP EBP,ECX                     ;假码最后一个“-”(含)之前部分的长度:假码长度
004303C7|.76 04         JBE SHORT PowerCmd.004303CD
004303C9|.8BC1          MOV EAX,ECX
004303CB|.2BC2          SUB EAX,EDX
004303CD|>3BD1          CMP EDX,ECX                     ;注册码中第一个“-”(含)前的长度:假码长度
004303CF|.76 0F         JBE SHORT PowerCmd.004303E0
004303D1|.A1 643E6D00   MOV EAX,DWORD PTR DS:
004303D6|.50            PUSH EAX                        ; /Arg1 => 006A3F60
004303D7|.8BCE          MOV ECX,ESI                     ; |
004303D9|.E8 E219FDFF   CALL PowerCmd.00401DC0            ; \PowerCmd.00401DC0
004303DE|.EB 53         JMP SHORT PowerCmd.00430433
004303E0|>50            PUSH EAX                        ; /注册码中第一个“-”和最后一个“-”之间部分的长度
004303E1|.33C9          XOR ECX,ECX                     ; |
004303E3|.52            PUSH EDX                        ; |Arg2
004303E4|.66:894C24 24MOV WORD PTR SS:,CX       ; |
004303E9|.BD 07000000   MOV EBP,7                         ; |
004303EE|.57            PUSH EDI                        ; |Arg1
004303EF|.8D4C24 24   LEA ECX,DWORD PTR SS:   ; |
004303F3|.896C24 3C   MOV DWORD PTR SS:,EBP   ; |假码最后一个“-”(含)之前部分的长度
004303F7|.895C24 38   MOV DWORD PTR SS:,EBX   ; |
004303FB|.E8 8024FDFF   CALL PowerCmd.00402880            ; \PowerCmd.00402880
00430400|.6A FF         PUSH -1                           ; /Arg3 = FFFFFFFF
00430402|.53            PUSH EBX                        ; |Arg2
00430403|.8D4424 20   LEA EAX,DWORD PTR SS:   ; |
00430407|.33D2          XOR EDX,EDX                     ; |
00430409|.896E 18       MOV DWORD PTR DS:,EBP   ; |
0043040C|.895E 14       MOV DWORD PTR DS:,EBX   ; |
0043040F|.50            PUSH EAX                        ; |Arg1
00430410|.8BCE          MOV ECX,ESI                     ; |
00430412|.895C24 4C   MOV DWORD PTR SS:,EBX   ; |
00430416|.66:8956 04    MOV WORD PTR DS:,DX      ; |
0043041A|.E8 6124FDFF   CALL PowerCmd.00402880            ; \PowerCmd.00402880
0043041F|.837C24 30 08CMP DWORD PTR SS:,8
00430424|.72 0D         JB SHORT PowerCmd.00430433
00430426|.8B4C24 1C   MOV ECX,DWORD PTR SS:   ;注册码中第一个“-”和最后一个“-”之间部分
0043042A|.51            PUSH ECX
0043042B|.E8 9BD2FEFF   CALL PowerCmd.0041D6CB
00430430|.83C4 04       ADD ESP,4
00430433|>8BC6          MOV EAX,ESI
00430435|.8B4C24 38   MOV ECX,DWORD PTR SS:
00430439|.64:890D 00000>MOV DWORD PTR FS:,ECX
00430440|.59            POP ECX
00430441|.5F            POP EDI
00430442|.5E            POP ESI
00430443|.5D            POP EBP
00430444|.5B            POP EBX
00430445|.8B4C24 20   MOV ECX,DWORD PTR SS:
00430449|.33CC          XOR ECX,ESP
0043044B|.E8 6CD2FEFF   CALL PowerCmd.0041D6BC
00430450|.83C4 30       ADD ESP,30
00430453\.C2 0C00       RETN 0C


其实算法很简单,对注册码格式也是一眼就猜出来了。关键在检测上花了点时间来验证我的推测是否是正确的。希望本文能对大家有点启发,那也不枉我辛苦地码字了。呵呵
最后上图:



gxwtk 发表于 2011-1-14 16:01:12

.NET 的东西。能用OD调试起来??

whypro 发表于 2011-1-14 19:40:32

好文!顶顶

tkone 发表于 2011-1-14 22:38:03

真强啊,不过确实看着有些眼花缭乱:loveliness:

月之精灵 发表于 2011-1-15 12:21:29

佩服你,哈哈,啥也不说了,加分,哈哈

GGLHY 发表于 2011-1-15 13:59:20

佩服你,哈哈,啥也不说了,加分,哈哈
月之精灵 发表于 2011-1-15 12:21 https://www.chinapyg.com/images/common/back.gif
/:001 ,最近在补看Nisy的视频,抽空搞的.....
多指点哈

wkxq 发表于 2011-1-17 12:46:52

来了就要支持一下

CCC_Fish 发表于 2011-1-17 13:14:51

查壳:Microsoft Visual Studio .NET 2005 -- 2008 -> Microsoft Corporation
经过OD跟踪,得出注册码形如XXXXX-XXXXX-XXXXX-XXXXX(可参见对注册码格式检测部分),分别设4部分为S1、S2、S3、S4
                        S1 -S2 -S3 -S4
我的电脑上怎么是“Microsoft Visual C++ v6.0 DLL *”?

GGLHY 发表于 2011-1-17 18:48:40

我的电脑上怎么是“Microsoft Visual C++ v6.0 DLL *”?
CCC_Fish 发表于 2011-1-17 13:14 https://www.chinapyg.com/images/common/back.gif



呵呵,我在单位上用看雪版的PEID查的与兄弟一样:Microsoft Visual C++ v6.0 DLL *





但家里用另一版本则是:

飘云 发表于 2011-1-18 00:53:57

精神可嘉!纳入精华~~
这样学习下去,没有不成材的道理,兄弟应该慢慢开始keygen
页: [1] 2
查看完整版本: PowerCMD 2.1版注册解码实录