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
其实算法很简单,对注册码格式也是一眼就猜出来了。关键在检测上花了点时间来验证我的推测是否是正确的。希望本文能对大家有点启发,那也不枉我辛苦地码字了。呵呵
最后上图:
.NET 的东西。能用OD调试起来?? 好文!顶顶 真强啊,不过确实看着有些眼花缭乱:loveliness: 佩服你,哈哈,啥也不说了,加分,哈哈 佩服你,哈哈,啥也不说了,加分,哈哈
月之精灵 发表于 2011-1-15 12:21 https://www.chinapyg.com/images/common/back.gif
/:001 ,最近在补看Nisy的视频,抽空搞的.....
多指点哈 来了就要支持一下 查壳: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 *”? 我的电脑上怎么是“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 *
但家里用另一版本则是:
精神可嘉!纳入精华~~
这样学习下去,没有不成材的道理,兄弟应该慢慢开始keygen
页:
[1]
2