发新话题
打印

[转载]注册宇宙图象创作大师Universe Image Creator v1.6

[转载]注册宇宙图象创作大师Universe Image Creator v1.6

文章作者: qduwg

题目:注册宇宙图象创作大师UniverseImageCreatorv1.6
软件介绍:经过试用,发现这个美国人开发的软件可以使用各种现成的模板创作出令人目眩的宇宙空间图象,不用3分钟,一个

神秘的宇宙美景就出现在您的眼前了,太令人惊奇了。未注册版本无法使用一些太空物体图象,比如旋涡,行星,镜头眩光效

果,银河系等等。还有许多太空现象可以用来创建一个适当的完美的太空景象,比如星云,各种颜色的星星,星际气团,球状

星团等等。非常棒的软件。

破解目的:分析注册码算法逻辑,找出注册码。
破解工具:SoftICE,PEID。

引子:今天安装了这个软件试用一下,发现软件虽小,功能强大。可是没有注册的版本无法使用好几个比较关键的图象模板,

比如银河系等,如果没有这些关键素材,制作的图象效果就差远了。所以,我们还是把它注册了吧。否则无法使用这些漂亮的

模板元素,真是一个不小的遗憾呢!!下面开始。拿出PEID查看是否加壳。发现没有加壳,用VC++开发。运行软件,点击help

,然后点击Register,输入UserName是wanggang,UserKey是654321。调出SOFTICE,下断点bpxgetwindowtexta,按一次F11来

到主程序。

00462C8B|.FF15A8854700CALLDWORDPTRDS:[<&USER32.GetWindowTextA>]
00462C91|.8D4518LEAEAX,DWORDPTRSS:[EBP+18]//我们来到这里
00462C94|.50PUSHEAX
00462C95|.8D45E0LEAEAX,DWORDPTRSS:[EBP-20]
00462C98|.FF7510PUSHDWORDPTRSS:[EBP+10]
00462C9B|.50PUSHEAX
00462C9C|.E822FFFFFFCALLUNIVERSE.00462BC3//我们看看这个函数干什么。
00462CA1|.85C0TESTEAX,EAX
00462CA3|.752FJNZSHORTUNIVERSE.00462CD4
============================================================
00462BC3/$55PUSHEBP
00462BC4|.8BECMOVEBP,ESP
*省去多行
00462C01|.E8C602FEFFCALLUNIVERSE.00442ECC//F8跟入这个函数
00462C06|.EB11JMPSHORTUNIVERSE.00462C19
00462C08|>80FB2DCMPBL,2D
00462C0B|.743DJESHORTUNIVERSE.00462C4A
00462C0D|.8D4508LEAEAX,DWORDPTRSS:[EBP+8]
============================================================
00442ECC/$6A00PUSH0
00442ECE|.FF742410PUSHDWORDPTRSS:[ESP+10]
00442ED2|.FF742410PUSHDWORDPTRSS:[ESP+10]
00442ED6|.FF742410PUSHDWORDPTRSS:[ESP+10]
00442EDA|.E804000000CALLUNIVERSE.00442EE3//F8跟入这个函数
00442EDF|.83C410ADDESP,10
00442EE2\.C3RETN
============================================================
00442ECC/$6A00PUSH0
*省去多行
00442EF3|.8A1FMOVBL,BYTEPTRDS:[EDI]//第一位注册码送BL。
00442EF5|.8D7701LEAESI,DWORDPTRDS:[EDI+1]//第二位假码地址送ESI。
00442EF8|.8975FCMOVDWORDPTRSS:[EBP-4],ESI
00442EFB|>833D60154900>/CMPDWORDPTRDS:[491560],1
*省去几行
00442F13|>8B0D54134900|MOVECX,DWORDPTRDS:[491354]
00442F19|.0FB6C3|MOVZXEAX,BL//第一位假码扩展后送EAX。
00442F1C|.8A0441|MOVAL,BYTEPTRDS:[ECX+EAX*2]//参与地址计算,找到一个值84h送AL。
00442F1F|.83E008|ANDEAX,8//与8相与。
00442F22|>85C0|TESTEAX,EAX
00442F24|.7405|JESHORTUNIVERSE.00442F2B//此处顺其自然跳。
00442F26|.8A1E|MOVBL,BYTEPTRDS:[ESI]
00442F28|.46|INCESI
00442F29|.^EBD0\JMPSHORTUNIVERSE.00442EFB
00442F2B|>80FB2DCMPBL,2D//第一位假码与2D比较。
00442F2E|.8975FCMOVDWORDPTRSS:[EBP-4],ESI
00442F31|.7506JNZSHORTUNIVERSE.00442F39//此处顺其自然跳。
00442F33|.834D1402ORDWORDPTRSS:[EBP+14],2
00442F37|.EB05JMPSHORTUNIVERSE.00442F3E
00442F39|>80FB2BCMPBL,2B//第一位假码与2B比较。
00442F3C|.7506JNZSHORTUNIVERSE.00442F44//此处顺其自然跳。
00442F3E|>8A1EMOVBL,BYTEPTRDS:[ESI]
00442F40|.46INCESI
00442F41|.8975FCMOVDWORDPTRSS:[EBP-4],ESI
00442F44|>8B4510MOVEAX,DWORDPTRSS:[EBP+10]//把一个常量'A'送EAX
00442F47|.85C0TESTEAX,EAX
00442F49|.0F8C89010000JLUNIVERSE.004430D8
00442F4F|.83F801CMPEAX,1
00442F52|.0F8480010000JEUNIVERSE.004430D8
00442F58|.83F824CMPEAX,24
00442F5B|.0F8F77010000JGUNIVERSE.004430D8//如果EAX大于24H则跳。
00442F61|.6A10PUSH10
00442F63|.85C0TESTEAX,EAX
00442F65|.59POPECX
00442F66|.7524JNZSHORTUNIVERSE.00442F8C//此处跳。
*省略几行
00442F8C|>394D10CMPDWORDPTRSS:[EBP+10],ECX//常量'A'与16h比较。
00442F8F|.7517JNZSHORTUNIVERSE.00442FA8//不等则跳走。
*省略几行
00442FA8|>83C8FFOREAX,FFFFFFFF//'A'与常量-1或运算。
00442FAB|.33D2XOREDX,EDX
00442FAD|.F77510DIVDWORDPTRSS:[EBP+10]//EAX=EAX/A
00442FB0|.BF03010000MOVEDI,103
00442FB5|.8945F4MOVDWORDPTRSS:[EBP-C],EAX//EAX=19999999h
00442FB8|>833D60154900>/CMPDWORDPTRDS:[491560],1
00442FBF|.0FB6F3|MOVZXESI,BL
00442FC2|.7E0C|JLESHORTUNIVERSE.00442FD0//自然跳走。
*****
00442FD0|>A154134900|MOVEAX,DWORDPTRDS:[491354]//一地址送EAX。
00442FD5|.8A0470|MOVAL,BYTEPTRDS:[EAX+ESI*2]//取出一个84h送AL。
00442FD8|.83E004|ANDEAX,4
00442FDB|>85C0|TESTEAX,EAX
00442FDD|.7408|JESHORTUNIVERSE.00442FE7
00442FDF|.0FBECB|MOVSXECX,BL//第一位假码符号扩展后送ECX。
00442FE2|.83E930|SUBECX,30//减去30h,变成16进制数。
00442FE5|.EB32|JMPSHORTUNIVERSE.00443019//跳走。
*****
00443019|>3B4D10|CMPECX,DWORDPTRSS:[EBP+10]//ECX与常量'A'比较。ECX=6。
0044301C|.7336|JNBSHORTUNIVERSE.00443054
0044301E|.8B75F8|MOVESI,DWORDPTRSS:[EBP-8]
00443021|.834D1408|ORDWORDPTRSS:[EBP+14],8
00443025|.3B75F4|CMPESI,DWORDPTRSS:[EBP-C]//ESI与19999999h比较。
00443028|.7214|JBSHORTUNIVERSE.0044303E//跳走。
*****
0044303E|>0FAF7510|IMULESI,DWORDPTRSS:[EBP+10]//ESI与常量'A'相乘,就是扩大10倍。
00443042|.03F1|ADDESI,ECX//把ECX加到ESI
00443044|.8975F8|MOVDWORDPTRSS:[EBP-8],ESI//保存累加和
00443047|>8B45FC|MOVEAX,DWORDPTRSS:[EBP-4]//下一位假码的地址送EAX。
0044304A|.FF45FC|INCDWORDPTRSS:[EBP-4]//假码地址增1。
0044304D|.8A18|MOVBL,BYTEPTRDS:[EAX]//下位假码送BL。
0044304F|.^E964FFFFFF\JMPUNIVERSE.00442FB8//循环到上面。
注:上面这个循环就是把你的假码换算为16进制。比如654321被转换为9FBF1h。下面继续;
00443090|.3975F8CMPDWORDPTRSS:[EBP-8],ESI//ESI与7FFFFFFF比较。
00443093|.7627JBESHORTUNIVERSE.004430BC//当然ESI不大于7FFFFFFF则跳走。
*****
004430BC|>85DBTESTEBX,EBX
004430BE|.7405JESHORTUNIVERSE.004430C5
004430C0|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]
004430C3|.8903MOVDWORDPTRDS:[EBX],EAX
004430C5|>F6451402TESTBYTEPTRSS:[EBP+14],2
004430C9|.7408JESHORTUNIVERSE.004430D3
004430CB|.8B45F8MOVEAX,DWORDPTRSS:[EBP-8]
004430CE|.F7D8NEGEAX
004430D0|.8945F8MOVDWORDPTRSS:[EBP-8],EAX
004430D3|>8B45F8MOVEAX,DWORDPTRSS:[EBP-8]//EAX=假码十六进制的结果。
============================================================
下面返回到下面代码处:
0040AC80|.8B8898000000MOVECX,DWORDPTRDS:[EAX+98]
0040AC86|.51PUSHECX
0040AC87|.8B55F4MOVEDX,DWORDPTRSS:[EBP-C]
0040AC8A|.81C29C000000ADDEDX,9C
0040AC90|.52PUSHEDX
0040AC91|.B950794900MOVECX,UNIVERSE.00497950
0040AC96|.E8F3C00000CALLUNIVERSE.00416D8E//F8跟入这个CALL。
******
00416DA5|>8B4DFCMOVECX,DWORDPTRSS:[EBP-4]
00416DA8|.8B5110MOVEDX,DWORDPTRDS:[ECX+10]
00416DAB|.8955F8MOVDWORDPTRSS:[EBP-8],EDX
00416DAE|>8B4508MOVEAX,DWORDPTRSS:[EBP+8]
00416DB1|.50PUSHEAX
00416DB2|.E88DFAFFFFCALLUNIVERSE.00416844//F8跟入这个CALL。
============================================================
我们经过一番周折来到下面:
00416D1F|.E80C9E0200|CALLUNIVERSE.00440B30//这个函数处理一个串Qmvtinn!\QD:8^,返回串长E。
00416D24|.83C404|ADDESP,4
00416D27|.3945E8|CMPDWORDPTRSS:[EBP-18],EAX
00416D2A|.7D25|JGESHORTUNIVERSE.00416D51
00416D2C|.8B550C|MOVEDX,DWORDPTRSS:[EBP+C]
00416D2F|.0355E8|ADDEDX,DWORDPTRSS:[EBP-18]
00416D32|.0FBE02|MOVSXEAX,BYTEPTRDS:[EDX]//依次取上述串每一位送EAX。
00416D35|.83E801|SUBEAX,1//把每一位都统统减1。
00416D38|.50|PUSHEAX
00416D39|.6A00|PUSH0
00416D3B|.8D4DF0|LEAECX,DWORDPTRSS:[EBP-10]
00416D3E|.E8C8F30300|CALLUNIVERSE.0045610B//把减一后的值送指定地址保存。
00416D43|.8D4DF0|LEAECX,DWORDPTRSS:[EBP-10]
00416D46|.51|PUSHECX
00416D47|.8D4DEC|LEAECX,DWORDPTRSS:[EBP-14]
00416D4A|.E8A0F20300|CALLUNIVERSE.00455FEF
00416D4F|.^EBC1\JMPSHORTUNIVERSE.00416D12//如果未完继续循环。最后上述串变为:Plushmm[PC97]
00416D51|>8D55ECLEAEDX,DWORDPTRSS:[EBP-14]//取新串地址。
00416D54|.52PUSHEDX
00416D55|.8B4D08MOVECX,DWORDPTRSS:[EBP+8]
00416D58|.E87CEC0300CALLUNIVERSE.004559D9
00416D5D|.8B45E4MOVEAX,DWORDPTRSS:[EBP-1C]
00416D60|.0C01ORAL,1
00416D62|.8945E4MOVDWORDPTRSS:[EBP-1C],EAX
00416D65|.C645FC01MOVBYTEPTRSS:[EBP-4],1
00416D69|.8D4DF0LEAECX,DWORDPTRSS:[EBP-10]
00416D6C|.E8F3EE0300CALLUNIVERSE.00455C64
00416D71|.C645FC00MOVBYTEPTRSS:[EBP-4],0
============================================================
我们经过一番周折来到下面,也是重头戏:
00416880|.8B55C8MOVEDX,DWORDPTRSS:[EBP-38]//新串地址送EDX
00416883|.52PUSHEDX
00416884|.8B4508MOVEAX,DWORDPTRSS:[EBP+8]//用户名地址送EAX
00416887|.50PUSHEAX
00416888|.E893070000CALLUNIVERSE.00417020//大概进行比较上述串。
****
004168B3|>E8183E0100CALLUNIVERSE.0042A6D0//取用户名串长。
004168B8|.8945DCMOVDWORDPTRSS:[EBP-24],EAX
004168BB|.C745F0000000>MOVDWORDPTRSS:[EBP-10],0
004168C2|.C745E0010000>MOVDWORDPTRSS:[EBP-20],1
004168C9|.C745E4000000>MOVDWORDPTRSS:[EBP-1C],0
004168D0|.EB09JMPSHORTUNIVERSE.004168DB
****
004168EF|.E80C070000|CALLUNIVERSE.00417000//依次取用户名字符,在AL返回。
004168F4|.0FBEC8|MOVSXECX,AL//把字符送ECX。
004168F7|.894DD8|MOVDWORDPTRSS:[EBP-28],ECX//把ECX送内存保存。
004168FA|.8B55F0|MOVEDX,DWORDPTRSS:[EBP-10]//累加和送EDX
004168FD|.0355D8|ADDEDX,DWORDPTRSS:[EBP-28]//EDX=EDX+用户名字符
00416900|.8955F0|MOVDWORDPTRSS:[EBP-10],EDX//送回保存。
00416903|.8B45E4|MOVEAX,DWORDPTRSS:[EBP-1C]//这个值关键,决定后面的运算。
00416906|.2501000080|ANDEAX,80000001
0041690B|.7905|JNSSHORTUNIVERSE.00416912//非负数则跳。
0041690D|.48|DECEAX//否则,EAX减1。
0041690E|.83C8FE|OREAX,FFFFFFFE//EAX与此常量或运算。
00416911|.40|INCEAX//EAX加1。
00416912|>85C0|TESTEAX,EAX
00416914|.7409|JESHORTUNIVERSE.0041691F//若为0则跳。
00416916|.C745E0FFFFFF>|MOVDWORDPTRSS:[EBP-20],-1//根据前面不同情况跳转,设置1或者-1
0041691D|.EB07|JMPSHORTUNIVERSE.00416926
0041691F|>C745E0010000>|MOVDWORDPTRSS:[EBP-20],1
00416926|>8B4DE0|MOVECX,DWORDPTRSS:[EBP-20]//前面设置的1或者-1送ECX。
00416929|.0FAF4DD8|IMULECX,DWORDPTRSS:[EBP-28]//ECX=ECX*每位用户名字符。
0041692D|.8B55F0|MOVEDX,DWORDPTRSS:[EBP-10]//累加和取出送EDX。
00416930|.03D1|ADDEDX,ECX//EDX=EDX+ECX。
00416932|.8955F0|MOVDWORDPTRSS:[EBP-10],EDX//累加结果送回保存。
00416935|.^EB9B\JMPSHORTUNIVERSE.004168D2//没有处理完继续循环。
00416937|>8B45F0MOVEAX,DWORDPTRSS:[EBP-10]//用户名累加结果送EAX。
0041693A|.8945E8MOVDWORDPTRSS:[EBP-18],EAX//用户名累加结果送[EBP-18]保存。
0041693D|.8B4DF0MOVECX,DWORDPTRSS:[EBP-10]//累加和送ECX。
00416940|.0FAF4DF0IMULECX,DWORDPTRSS:[EBP-10]//ECX=ECX*ECX。
00416944|.894DF0MOVDWORDPTRSS:[EBP-10],ECX//乘方结果送回。
00416947|.8B55F0MOVEDX,DWORDPTRSS:[EBP-10]//乘方结果送EDX。
0041694A|.0355E8ADDEDX,DWORDPTRSS:[EBP-18]//EDX=EDX+用户名累加和。
0041694D|.8955F0MOVDWORDPTRSS:[EBP-10],EDX//EDX结果送回保存。
00416950|.8B45F0MOVEAX,DWORDPTRSS:[EBP-10]
00416953|.50PUSHEAX
00416954|.E8673D0100CALLUNIVERSE.0042A6C0//保存EAX到指定单元。
00416959|.83C404ADDESP,4
0041695C|.C745E4000000>MOVDWORDPTRSS:[EBP-1C],0
00416963|.EB09JMPSHORTUNIVERSE.0041696E
00416965|>8B4DE4/MOVECX,DWORDPTRSS:[EBP-1C]//下面是处理上述运算结果的循环。
00416968|.83C101|ADDECX,1
0041696B|.894DE4|MOVDWORDPTRSS:[EBP-1C],ECX
0041696E|>8B55E4MOVEDX,DWORDPTRSS:[EBP-1C]//循环次数
00416971|.3B1508784900|CMPEDX,DWORDPTRDS:[497808]//是否已经到达次数。
00416977|.7D07|JGESHORTUNIVERSE.00416980//如果循环次数已到,跳出循环。
00416979|.E8623D0100|CALLUNIVERSE.0042A6E0//我们进入这个CALL看看,代码见后面。(*)
0041697E|.^EBE5\JMPSHORTUNIVERSE.00416965//如果没有结束,继续循环。
00416980|>E85B3D0100CALLUNIVERSE.0042A6E0//保存计算结果到指定内存单元[48e7f8],这个就是正确

注册码的16进制数。
00416985|.8945ECMOVDWORDPTRSS:[EBP-14],EAX
00416988|.8B45DCMOVEAX,DWORDPTRSS:[EBP-24]
0041698B|.50PUSHEAX
0041698C|.E82F3D0100CALLUNIVERSE.0042A6C0//保存EAX到指定单元[48e7f8],这个不是正确注册码了。
============================================================
先看(*)处的函数:
0042A6E0/$A1E8E74800MOVEAX,DWORDPTRDS:[48E7E8]
0042A6E5|.68400CB378PUSH78B30C40
0042A6EA|.99CDQ
0042A6EB|.6A00PUSH0
0042A6ED|.680DA4A225PUSH25A2A40D
0042A6F2|.52PUSHEDX
0042A6F3|.50PUSHEAX
0042A6F4|.E877710100CALLUNIVERSE.00441870//F8跟入这个函数,代码在后面。(**)
0042A6F9|.83C001ADDEAX,1//返回的EAX加1。变成了1CE5C035h。
0042A6FC|.83D200ADCEDX,0
0042A6FF|.52PUSHEDX
0042A700|.50PUSHEAX
0042A701|.E85A000000CALLUNIVERSE.0042A760//F8跟入这个函数,代码在后面。(***)
0042A706|.83C40CADDESP,0C
0042A709|.A3E8E74800MOVDWORDPTRDS:[48E7E8],EAX//返回的结果保存在:[48E7E8]内。
0042A70E\.C3RETN
下面是(**)处的函数:
00441870/$8B442408MOVEAX,DWORDPTRSS:[ESP+8]
00441874|.8B4C2410MOVECX,DWORDPTRSS:[ESP+10]
00441878|.0BC8ORECX,EAX
0044187A|.8B4C240CMOVECX,DWORDPTRSS:[ESP+C]//ECX为一常数:25A2A40Dh
0044187E|.7509JNZSHORTUNIVERSE.00441889
00441880|.8B442404MOVEAX,DWORDPTRSS:[ESP+4]//EAX为前面用户名处理后的结果。比如wanggang处理后为

BF004。
00441884|.F7E1MULECX//EAX=EAX*ECX。例如:EAX=25A2A40Dh*BF004=1CE5C034h。
00441886|.C21000RETN10
下面是(***)处的函数:
0042A760/$55PUSHEBP
0042A761|.8BECMOVEBP,ESP
0042A763|.53PUSHEBX
0042A764|.8B4508MOVEAX,DWORDPTRSS:[EBP+8]//EAX=前面得到的结果1CE5C035h。
0042A767|.8B550CMOVEDX,DWORDPTRSS:[EBP+C]//EDX=一个常数1C146。
0042A76A|.8B5D10MOVEBX,DWORDPTRSS:[EBP+10]//EBX=一个常数78B30C40。
0042A76D|.F7F3DIVEBX//EAX,EDX联合为一个8字节数,除以EBX。
0042A76F|.8BC2MOVEAX,EDX//余数送EAX保存。
0042A771|.5BPOPEBX
0042A772|.5DPOPEBP
0042A773\.C3RETN
============================================================
上面用户名进行运算完毕,程序流程来到下面:
00416D8E/$55PUSHEBP
00416D8F|.8BECMOVEBP,ESP
00416D91|.83EC08SUBESP,8
00416D94|.894DFCMOVDWORDPTRSS:[EBP-4],ECX
00416D97|.837D0C00CMPDWORDPTRSS:[EBP+C],0
00416D9B|.7E08JLESHORTUNIVERSE.00416DA5
00416D9D|.8B450CMOVEAX,DWORDPTRSS:[EBP+C]
00416DA0|.8945F8MOVDWORDPTRSS:[EBP-8],EAX
00416DA3|.EB09JMPSHORTUNIVERSE.00416DAE
00416DA5|>8B4DFCMOVECX,DWORDPTRSS:[EBP-4]
00416DA8|.8B5110MOVEDX,DWORDPTRDS:[ECX+10]
00416DAB|.8955F8MOVDWORDPTRSS:[EBP-8],EDX
00416DAE|>8B4508MOVEAX,DWORDPTRSS:[EBP+8]
00416DB1|.50PUSHEAX
00416DB2|.E88DFAFFFFCALLUNIVERSE.00416844
00416DB7|.83C404ADDESP,4
00416DBA|.33C9XORECX,ECX
00416DBC|.3945F8CMPDWORDPTRSS:[EBP-8],EAX//在这里用户名计算结果和EAX内的假注册码计算结果进行

比较。
00416DBF|.0F94C1SETECL//相等则让CL=1。
00416DC2|.8BC1MOVEAX,ECX//把ECX送EAX,作为注册成功标志。
00416DC4|.8BE5MOVESP,EBP
00416DC6|.5DPOPEBP
00416DC7\.C20800RETN8
============================================================
后记:
这个软件没有想到搞了那么多弯弯绕在里面,特别是在验证那个字符串Plushmm[PC97]时,感到莫名其妙!最后用户名的计算

是用大数进行乘除运算,进行了3遍。最后得到一个结果与前面注册码16进制值比较,现在已经得到了真码,把最后拿来比较的

那个数转换为10进制,输入就OK啦!比如我这里UserName是wanggang,得到的是830350h,转换为10进制数为8586064。现在输

入正确注册码,注册成功!!所有限制解除!我试用了一下提供的银河系图象还有其他气团图象,效果非常棒!!犹如真的来

到天上一样!!

追踪这个软件的过程比较讨厌,真是如同掉进无底深渊一样!没有边际!因为无论哪个CALL都值得怀疑里面做了什么工作,所

以不得不追进去看看。如果一下子掠过去可能就没戏。经过2个小时艰苦奋战,我终于又可以把我的破文与各位分享了!希望我

们共同进步提高!!:)

另附诗一首,献给各位关注我的坛友:

“宇宙”软件无“银河”,功能限制真是多;如今遇到俺菜鸟,眩目银河失又得!

qduwg

qduwg@163.com

TOP

发新话题