WINNC注册算法分析实录
本帖最后由 GGLHY 于 2014-2-15 13:12 编辑WINNC注册算法分析实录
winnc,一款独具特色的文件管理类软件。
先放界面截图一张:
有兴趣的童靴可以移步其官网:www.winnc.com
又是一个实时验证的。呵呵。
闲话少叙,咱直奔主题:
一、莽苍踏雪寻
寒风萧萧、飞雪飘零,长路漫漫,踏歌而行:
00C9EE4E|.8B83 AC030000 MOV EAX,DWORD PTR DS:
00C9EE54|.E8 CB8881FF CALL WinNc.004B7724
00C9EE59|.8B45 F0 MOV EAX,DWORD PTR SS: ;取用户名(UNICODE "gglhy")
00C9EE5C|.8D55 FC LEA EDX,DWORD PTR SS:
00C9EE5F|.E8 285E78FF CALL WinNc.00424C8C
00C9EE64|.8D55 EC LEA EDX,DWORD PTR SS:
00C9EE67|.8B83 B4030000 MOV EAX,DWORD PTR DS:
00C9EE6D|.E8 B28881FF CALL WinNc.004B7724
00C9EE72|.8B45 EC MOV EAX,DWORD PTR SS: ;取输入的假码(UNICODE "1598753046")
00C9EE75|.8D55 F8 LEA EDX,DWORD PTR SS:
00C9EE78|.E8 0F5E78FF CALL WinNc.00424C8C
00C9EE7D|.8B45 FC MOV EAX,DWORD PTR SS:
00C9EE80|.85C0 TEST EAX,EAX
00C9EE82|.74 05 JE SHORT WinNc.00C9EE89
00C9EE84|.83E8 04 SUB EAX,4
00C9EE87|.8B00 MOV EAX,DWORD PTR DS: ;用户名长度,本例为5
00C9EE89|>83F8 04 CMP EAX,4 ;用户名长度不得小于4!
00C9EE8C|.7D 3C JGE SHORT WinNc.00C9EECA
00C9EE8E|.BA 50F0C900 MOV EDX,WinNc.00C9F050 ;UNICODE "Please enter a valid registration name"
00C9EE93|.8B83 D4030000 MOV EAX,DWORD PTR DS:
(省略部分代码)
00C9EF04|>E8 9B85CAFF CALL WinNc.009474A4
00C9EF09|.8B4D F8 MOV ECX,DWORD PTR SS: ;输入的假码(UNICODE "1598753046")
00C9EF0C|.8B55 FC MOV EDX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
00C9EF0F|.E8 588BCAFF CALL WinNc.00947A6C ;莽苍踏雪寻
00C9EF14|.84C0 TEST AL,AL ;玉壁月华明
00C9EF16|.75 14 JNZ SHORT WinNc.00C9EF2C ;谁家子弟谁家院?无计悔多情!
00C9EF18|.E8 8785CAFF CALL WinNc.009474A4
00C9EF1D|.8B4D F8 MOV ECX,DWORD PTR SS:
00C9EF20|.8B55 F4 MOV EDX,DWORD PTR SS:
00C9EF23|.E8 448BCAFF CALL WinNc.00947A6C
00C9EF28|.84C0 TEST AL,AL
00C9EF2A|.74 72 JE SHORT WinNc.00C9EF9E
00C9EF2C|>33D2 XOR EDX,EDX
00C9EF2E|.8B83 D0030000 MOV EAX,DWORD PTR DS:
(省略部分代码)
00C9EF97|.E8 2C117FFF CALL WinNc.004900C8
00C9EF9C|.EB 70 JMP SHORT WinNc.00C9F00E
00C9EF9E|>BA ACF0C900 MOV EDX,WinNc.00C9F0AC ;UNICODE "Please enter a valid key"
00C9EFA3|.8B83 D0030000 MOV EAX,DWORD PTR DS:
00C9EFA9|.E8 D28781FF CALL WinNc.004B7780哎~~
00C9EF09|.8B4D F8 MOV ECX,DWORD PTR SS: ;输入的假码(UNICODE "1598753046")
00C9EF0C|.8B55 FC MOV EDX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
00C9EF0F|.E8 588BCAFF CALL WinNc.00947A6C ;莽苍踏雪寻
00C9EF14|.84C0 TEST AL,AL ;玉壁月华明
00C9EF16|.75 14 JNZ SHORT WinNc.00C9EF2C ;谁家子弟谁家院?无计悔多情!
枯井底、污泥处 念枉求美眷良缘安在?元芳你怎么看?
二、青衫磊落险峰行
好吧,莽苍踏雪寻!让我们轻踏“凌波微步”,到00C9EF0F CALL WinNc.00947A6C处
F7进入:
00947A6C/[ DISCUZ_CODE_67 ]nbsp; 55 PUSH EBP
(省略部分代码)
00947A9C|.33DB XOR EBX,EBX
00947A9E|.8B45 FC MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
00947AA1|.85C0 TEST EAX,EAX
00947AA3|.74 05 JE SHORT WinNc.00947AAA
00947AA5|.83E8 04 SUB EAX,4
00947AA8|.8B00 MOV EAX,DWORD PTR DS: ;用户名长度,本例为5
00947AAA|>85C0 TEST EAX,EAX
00947AAC|.74 1A JE SHORT WinNc.00947AC8
00947AAE|.8D55 F4 LEA EDX,DWORD PTR SS:
00947AB1|.8B45 FC MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
00947AB4|.E8 5FFFFFFF CALL WinNc.00947A18 ;为谁开?茶花满路~
00947AB9|.8B45 F4 MOV EAX,DWORD PTR SS: ;千万里,我追寻着你~
00947ABC|.8B55 F8 MOV EDX,DWORD PTR SS: ;输入的假码("1598753046")
00947ABF|.E8 8026ACFF CALL WinNc.0040A144
00947AC4|.75 02 JNZ SHORT WinNc.00947AC8 ;风骤紧,缥缈峰头云乱
00947AC6|.B3 01 MOV BL,1 ;却试问,几时把痴心?
00947AC8|>33C0 XOR EAX,EAX
00947ACA|.5A POP EDX
00947ACB|.59 POP ECX
00947ACC|.59 POP ECX
00947ACD|.64:8910 MOV DWORD PTR FS:,EDX
00947AD0|.68 EA7A9400 PUSH WinNc.00947AEA
00947AD5|>8D45 F4 LEA EAX,DWORD PTR SS:
00947AD8|.BA 03000000 MOV EDX,3
00947ADD|.E8 E211ACFF CALL WinNc.00408CC4
00947AE2\.C3 RETN
显然,爆破的地方很明显~~,这也不是本文的目的。
昔时因、今日意、且自逍遥没谁管,输赢成败又争由人算?
三、杏子林中 商略平生义
看完第二部分我们很容易得出一个结论,那就是:
00947AB4处CALL WinNc.00947A18这里是我们必须进去的:
F7后:
00947A18/[ DISCUZ_CODE_68 ]nbsp; 55 PUSH EBP
00947A19|.8BEC MOV EBP,ESP
00947A1B|.51 PUSH ECX
00947A1C|.53 PUSH EBX
00947A1D|.8BDA MOV EBX,EDX
00947A1F|.8945 FC MOV DWORD PTR SS:,EAX
00947A22|.8B45 FC MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
00947A25|.E8 1E13ACFF CALL WinNc.00408D48
00947A2A|.33C0 XOR EAX,EAX
00947A2C|.55 PUSH EBP
00947A2D|.68 617A9400 PUSH WinNc.00947A61
00947A32|.64:FF30 PUSH DWORD PTR FS:
00947A35|.64:8920 MOV DWORD PTR FS:,ESP
00947A38|.53 PUSH EBX
00947A39|.BA B899E700 MOV EDX,WinNc.00E799B8
00947A3E|.B9 0B000000 MOV ECX,0B ;记住这个0B吧!
00947A43|.8B45 FC MOV EAX,DWORD PTR SS:
00947A46|.E8 39FEFFFF CALL WinNc.00947884 ;赤手屠熊博虎~,金戈荡寇鏖兵!
00947A4B|.33C0 XOR EAX,EAX
00947A4D|.5A POP EDX
00947A4E|.59 POP ECX
00947A4F|.59 POP ECX
00947A50|.64:8910 MOV DWORD PTR FS:,EDX
00947A53|.68 687A9400 PUSH WinNc.00947A68
00947A58|>8D45 FC LEA EAX,DWORD PTR SS:
00947A5B|.E8 0412ACFF CALL WinNc.00408C64
00947A60\.C3 RETN
00947A61 .^ E9 FA07ACFF JMP WinNc.00408260
00947A66 .^ EB F0 JMP SHORT WinNc.00947A58
00947A68 .5B POP EBX
00947A69 .59 POP ECX
00947A6A .5D POP EBP
00947A6B .C3 RETN
四、 酒罢问君三语
不入虎穴,焉得虎子?我们再向虎山行:
00947884/[ DISCUZ_CODE_69 ]nbsp; 55 PUSH EBP
00947885|.8BEC MOV EBP,ESP
00947887|.83C4 BC ADD ESP,-44
0094788A|.53 PUSH EBX
0094788B|.56 PUSH ESI
0094788C|.57 PUSH EDI
0094788D|.33DB XOR EBX,EBX
0094788F|.895D BC MOV DWORD PTR SS:,EBX
00947892|.895D F8 MOV DWORD PTR SS:,EBX
00947895|.894D F0 MOV DWORD PTR SS:,ECX ;0B,记住你了!
00947898|.8955 F4 MOV DWORD PTR SS:,EDX
0094789B|.8945 FC MOV DWORD PTR SS:,EAX
0094789E|.8B45 FC MOV EAX,DWORD PTR SS:
009478A1|.E8 A214ACFF CALL WinNc.00408D48
009478A6|.33C0 XOR EAX,EAX
009478A8|.55 PUSH EBP
009478A9|.68 F7799400 PUSH WinNc.009479F7
009478AE|.64:FF30 PUSH DWORD PTR FS:
009478B1|.64:8920 MOV DWORD PTR FS:,ESP
009478B4|.BF 03020000 MOV EDI,203 ;好吧,还要记着这个203H
009478B9|.8B45 FC MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
009478BC|.85C0 TEST EAX,EAX
009478BE|.74 05 JE SHORT WinNc.009478C5
009478C0|.83E8 04 SUB EAX,4
009478C3|.8B00 MOV EAX,DWORD PTR DS: ;用户名长度,本例为5
009478C5|>8BF0 MOV ESI,EAX
009478C7|.85F6 TEST ESI,ESI
009478C9|.7E 3E JLE SHORT WinNc.00947909
009478CB|.BB 01000000 MOV EBX,1 ;计数器初始化为1
009478D0|>55 /PUSH EBP
009478D1|.8B45 FC |MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
009478D4|.4B |DEC EBX
009478D5|.85C0 |TEST EAX,EAX
009478D7|.74 05 |JE SHORT WinNc.009478DE
009478D9|.3B58 FC |CMP EBX,DWORD PTR DS: ;用户名是否取完
009478DC|.72 05 |JB SHORT WinNc.009478E3
009478DE|>E8 F9F4ABFF |CALL WinNc.00406DDC
009478E3|>43 |INC EBX
009478E4|.0FB74458 FE |MOVZX EAX,WORD PTR DS:[EAX+EBX*2-2>;用户名依次每一位
009478E9|.E8 4EFFFFFF |CALL WinNc.0094783C ;来吧,来吧,一起舞蹈~~
009478EE|.59 |POP ECX
009478EF|.03F8 |ADD EDI,EAX ;跳舞后的结果累加(EDI初始为203H)
009478F1|.71 05 |JNO SHORT WinNc.009478F8
009478F3|.E8 ECF4ABFF |CALL WinNc.00406DE4
009478F8|>43 |INC EBX
009478F9|.4E |DEC ESI
009478FA|.^ 75 D4 \JNZ SHORT WinNc.009478D0 ;循环结束,累加的结果为21D
009478FC|.EB 0B JMP SHORT WinNc.00947909
009478FE|>8D45 FC /LEA EAX,DWORD PTR SS:
00947901|.8B55 FC |MOV EDX,DWORD PTR SS:
00947904|.E8 4B26ACFF |CALL WinNc.00409F54
00947909|>8B45 FC MOV EAX,DWORD PTR SS: ;用户名(UNICODE "gglhy")
0094790C|.E8 4B18ACFF |CALL WinNc.0040915C
00947911|.83F8 0C |CMP EAX,0C ;用户名长度:12
00947914|.^ 7C E8 \JL SHORT WinNc.009478FE ;用户名自我复制到不小于12为止!!!!!
00947916|.BB 01000000 MOV EBX,1
0094791B|.8D75 C0 LEA ESI,DWORD PTR SS:
0094791E|>55 /PUSH EBP
0094791F|.8B45 FC |MOV EAX,DWORD PTR SS: ;自我复制后的用户名("gglhygglhygglhygglhy")
00947922|.4B |DEC EBX
00947923|.85C0 |TEST EAX,EAX
00947925|.74 05 |JE SHORT WinNc.0094792C
00947927|.3B58 FC |CMP EBX,DWORD PTR DS: ;自我复制后的用户名长度,本例=20取完没有
0094792A|.72 05 |JB SHORT WinNc.00947931
0094792C|>E8 ABF4ABFF |CALL WinNc.00406DDC
00947931|>43 |INC EBX
00947932|.0FB74458 FE |MOVZX EAX,WORD PTR DS:[EAX+EBX*2-2>;复制后的用户名依次每一位
00947937|.8BD3 |MOV EDX,EBX
00947939|.83EA 01 |SUB EDX,1 ;计数器-1
0094793C|.71 05 |JNO SHORT WinNc.00947943
0094793E|.E8 A1F4ABFF |CALL WinNc.00406DE4
00947943|>85D2 |TEST EDX,EDX
00947945|.7C 05 |JL SHORT WinNc.0094794C
00947947|.3B55 F0 |CMP EDX,DWORD PTR SS: ;在这里会看到熟人0B哦!
0094794A|.7E 05 |JLE SHORT WinNc.00947951
0094794C|>E8 8BF4ABFF |CALL WinNc.00406DDC
00947951|>8B4D F4 |MOV ECX,DWORD PTR SS:
00947954|.030491 |ADD EAX,DWORD PTR DS: ;用户名ASC相加,[]里查表,初始为37
00947957|.71 05 |JNO SHORT WinNc.0094795E
00947959|.E8 86F4ABFF |CALL WinNc.00406DE4
0094795E|>03C7 |ADD EAX,EDI ;再次累加,还记得前面跳完舞的21D吗?
00947960|.71 05 |JNO SHORT WinNc.00947967
00947962|.E8 7DF4ABFF |CALL WinNc.00406DE4
00947967|>99 |CDQ
00947968|.33C2 |XOR EAX,EDX ;累加结果 XOR 0
0094796A|.2BC2 |SUB EAX,EDX ;再-0
0094796C|.71 05 |JNO SHORT WinNc.00947973
0094796E|.E8 71F4ABFF |CALL WinNc.00406DE4
00947973|>E8 C4FEFFFF |CALL WinNc.0094783C ;又去前面的广场跳舞了~~
00947978|.59 |POP ECX
00947979|.8906 |MOV DWORD PTR DS:,EAX ;每次跳完舞蹈后的结果保存起来
0094797B|.43 |INC EBX
0094797C|.83C6 04 |ADD ESI,4
0094797F|.83FB 0D |CMP EBX,0D ;12位运算完了吗?
00947982|.^ 75 9A \JNZ SHORT WinNc.0094791E
00947984|.8D45 F8 LEA EAX,DWORD PTR SS:
00947987|.E8 D812ACFF CALL WinNc.00408C64
0094798C|.BB 01000000 MOV EBX,1
00947991|.8D75 C0 LEA ESI,DWORD PTR SS:
00947994|>8D55 BC /LEA EDX,DWORD PTR SS:
00947997|.8B06 |MOV EAX,DWORD PTR DS: ;保存起来的12个结果
00947999|.E8 C2DCADFF |CALL WinNc.00425660
0094799E|.8B55 BC |MOV EDX,DWORD PTR SS: ;转字符形式
009479A1|.8D45 F8 |LEA EAX,DWORD PTR SS:
009479A4|.E8 AB25ACFF |CALL WinNc.00409F54
009479A9|.83FB 04 |CMP EBX,4
009479AC|.74 05 |JE SHORT WinNc.009479B3 ;分段
009479AE|.83FB 08 |CMP EBX,8
009479B1|.75 0D |JNZ SHORT WinNc.009479C0 ;分段
009479B3|>8D45 F8 |LEA EAX,DWORD PTR SS:
009479B6|.BA 147A9400 |MOV EDX,WinNc.00947A14
009479BB|.E8 9425ACFF |CALL WinNc.00409F54
009479C0|>43 |INC EBX
009479C1|.83C6 04 |ADD ESI,4
009479C4|.83FB 0D |CMP EBX,0D
009479C7|.^ 75 CB \JNZ SHORT WinNc.00947994 ;12位平均分成3段,每段4位
009479C9|.8B45 08 MOV EAX,DWORD PTR SS:
009479CC|.8B55 F8 MOV EDX,DWORD PTR SS:
009479CF|.E8 7016ACFF CALL WinNc.00409044
009479D4|.33C0 XOR EAX,EAX
009479D6|.5A POP EDX
009479D7|.59 POP ECX
009479D8|.59 POP ECX
009479D9|.64:8910 MOV DWORD PTR FS:,EDX
009479DC|.68 FE799400 PUSH WinNc.009479FE
009479E1|>8D45 BC LEA EAX,DWORD PTR SS:
009479E4|.E8 7B12ACFF CALL WinNc.00408C64
009479E9|.8D45 F8 LEA EAX,DWORD PTR SS:
009479EC|.BA 02000000 MOV EDX,2
009479F1|.E8 CE12ACFF CALL WinNc.00408CC4
009479F6\.C3 RETN
009479F7 .^ E9 6408ACFF JMP WinNc.00408260
009479FC .^ EB E3 JMP SHORT WinNc.009479E1
009479FE .5F POP EDI
009479FF .5E POP ESI
00947A00 .5B POP EBX
00947A01 .8BE5 MOV ESP,EBP
00947A03 .5D POP EBP
00947A04 .C2 0400 RETN 4
其实上面我已经注释的比较详细了~~~,这里小结一下:
a.第一个循环得到一个数值,并参与第三个循环的计算,其来历详见下面的第五部分。
b.第二个循环是对用户名的判断与处理。用户名长度不足12位则自我复制一直到不小于12位为止。
这里要说明的是,用户名的自我复制是以新用户名为准来复制。比如用户名"ABCD",则自我复制的过程为:
ABCD--->ABCDABCD--->ABCDABCDABCDABCD
这里需要大家注意下即可~~
不信,可以去这里看看:
00409F6C .8B56 FC MOV EDX,DWORD PTR DS:
00409F6F .01FA ADD EDX,EDI ;自己复制后再次复制~~~~!!!
00409F71 .F7C2 000000C0 TEST EDX,C0000000
c.第三个循环其实是依次取用户名每一位的ASC,查表、计算,得到12位数值。
d.第四个循环就很简单了,数值转字符,格式化为“XXXX-XXXX-XXXX”的形式。没啥可说的,也不解释~~~
五、水榭听香 指点群豪戏
**** Hidden Message *****
六、奈天昏地暗斗转星移
**** Hidden Message *****
七、悄立雁门,绝壁无余字!
没什么需要说的了。
燕云十八骑 奔腾如虎风烟举:
实时验证通过~~~~~
OK了
reged!
PS:本文首发于飘云阁论坛。转载请注明出处。谢谢~~{:handshake:}
仔细拜读!!!!受益匪浅!!!!!感谢G大神!!! fywy 发表于 2014-2-14 21:08
仔细拜读!!!!受益匪浅!!!!!感谢G大神!!!
{:handshake:}
兄弟客气了~~
看大神的文章就像在读武侠小说一样的峰回路转、荡气回肠。剑指江山。 屠龙刀,倚天剑,侠骨柔肠走江湖,好文,膜拜G兄! 枯燥的代码用这样的方式写出来,有创意。 写得很详细,也有条理,赞一下 {:lol:}分析的真好。谢谢楼主了 哈哈,G大,不写书,做作家,可惜了,谢谢,写得太令人心神舒畅啊,又能学到东西,看得又爽!太好了 膜拜GG 哥哥的又一次精彩分析 麻烦能分析一下PDF转换器么 VB的程序