网络电视大师V4.0.0 Build 2003.9.25注册算法简析
软件简介:这是一个在网络上看电视的软件。
破解作者:
yzez[DFCG]
破解工具:
w32dasm、ODBG109B
破解目的:
初学破解,只为交流技术,请不要依据本文章写注册机,还是多多保护一下本就艰难的国产软件吧!
破解过程:
1、软件注册失败,会有提示信息,用w32dasm反汇编找到关键断点,用ODBG109B载入程序,按F9出现注册信息框后,
输入注册信息,用户名:YZEZ,试验码:1234567890098765432112,点确定,程序被断下来,看下面:
00485958 . PUSH EBP
00485959 . 8BEC MOV EBP, ESP
0048595B . B9 05000000 MOV ECX, 5
00485960 > 6A 00 PUSH 0
00485962 . 6A 00 PUSH 0
00485964 . 49 DEC ECX
00485965 .^ 75 F9 JNZ SHORT main.00485960
00485967 . 53 PUSH EBX
00485968 . 8BD8 MOV EBX, EAX
0048596A . 33D2 XOR EDX, EDX
0048596C . 55 PUSH EBP
0048596D . 68 145B4800 PUSH main.00485B14
00485972 . 64:FF32 PUSH DWORD PTR FS:[EDX]
00485975 . 64:8922 MOV DWORD PTR FS:[EDX], ESP
00485978 . 84C0 TEST AL, AL
0048597A . 0F84 5F010000 JE main.00485ADF
00485980 . 8D45 F4 LEA EAX, DWORD PTR SS:[EBP-C]
00485983 . CALL main.00404308***************我们在此CALL设断!输入注册信息后往下走!
00485988 . LEA EDX, DWORD PTR SS:[EBP-1C]
0048598B . MOV EAX, DWORD PTR DS:[EBX+2FC]
00485991 . CALL main.0043F94C
00485996 . MOV EAX, DWORD PTR SS:[EBP-1C]***把机器码:6875849699120117131144移入EAX中
00485999 . LEA EDX, DWORD PTR SS:[EBP-18]
0048599C . CALL main.00485878****************算法CALL,按F7跟进!代码附后!
004859A1 . MOV EAX, DWORD PTR SS:[EBP-18]***转换后的机器码:9:8=?:>BDC:B??>KDEBIKJ入EAX
004859A4 . PUSH EAX
004859A5 . LEA EDX, DWORD PTR SS:[EBP-20]
004859A8 . MOV EAX, DWORD PTR DS:[EBX+2F4]
004859AE . CALL main.0043F94C
004859B3 . MOV EDX, DWORD PTR SS:[EBP-20]***用户名:YZEZ移入EDX
004859B6 . LEA EAX, DWORD PTR SS:[EBP-4]
004859B9 . POP ECX
004859BA . CALL main.0040460C
004859BF . LEA EDX, DWORD PTR SS:[EBP-24]
004859C2 . MOV EAX, DWORD PTR DS:[EBX+2F4]
004859C8 . CALL main.0043F94C
004859CD . MOV EDX, DWORD PTR SS:[EBP-24]
004859D0 . MOV EAX, DWORD PTR DS:[EBX+318]
004859D6 . CALL main.0043F97C*****************此CALL把用户名和变换后的机器码串起来就是这种
*****************************************************形式:YZEZ9:8=?:>BDC:B??>KDEBIKJ
004859DB . MOV EAX, DWORD PTR DS:[EBX+31C]
004859E1 . MOV EDX, DWORD PTR SS:[EBP-4]
004859E4 . CALL main.0043F97C
004859E9 . CMP DWORD PTR SS:[EBP-4], 0
004859ED . JE main.00485ADF
004859F3 . LEA EDX, DWORD PTR SS:[EBP-8]
004859F6 . MOV EAX, DWORD PTR DS:[EBX+304]
004859FC . CALL main.0043F94C
00485A01 . LEA EDX, DWORD PTR SS:[EBP-C]
00485A04 . MOV EAX, DWORD PTR SS:[EBP-4]
00485A07 . CALL main.00485878******************第二次计算,调用上面的同一个子程序,代码也是
*************一样,这次是对变形机器码+用户名进行计算,即:YZEZ9:8=?:>BDC:B??>KDEBIKJ,计算也是一样!
00485A0C . MOV EDX, DWORD PTR SS:[EBP-8]
00485A0F . MOV EAX, DWORD PTR SS:[EBP-C]
00485A12 . CALL main.004085C0******************在此CALL把计算后的值与输入的试验码相比较
00485A17 . TEST EAX, EAX***********************如果比较都符合,则EAX的值为0,否则不为0
00485A19 . JE SHORT main.00485A44************不为0,就不跳,不跳就往下!为0则跳走!
00485A1B . MOV EAX, main.00485B28
00485A20 . CALL main.004392AC******************不跳,在这里就失败了,交钱吧!
00485A25 . MOV EAX, DWORD PTR DS:[EBX+2F4]
00485A2B . XOR EDX, EDX
00485A2D . CALL main.0043F97C
00485A32 . MOV EAX, DWORD PTR DS:[EBX+304]
00485A38 . XOR EDX, EDX
00485A3A . CALL main.0043F97C
00485A3F . JMP main.00485ADF
00485A44 > XOR EAX, EAX***********************相等就跳到这里!下面就写入注册信息!
00485A46 . PUSH EBP
00485A47 . PUSH main.00485AD8
00485A4C . PUSH DWORD PTR FS:[EAX]
00485A4F . MOV DWORD PTR FS:[EAX], ESP
00485A52 . MOV DL, 1
00485A54 . MOV EAX, DWORD PTR DS:[469F4C]
00485A59 . CALL main.0046A04C
00485A5E . MOV DWORD PTR SS:[EBP-10], EAX
00485A61 . MOV EDX, 80000002
00485A66 . MOV EAX, DWORD PTR SS:[EBP-10]
00485A69 . CALL main.0046A0EC
00485A6E . LEA EAX, DWORD PTR SS:[EBP-14]
00485A71 . MOV EDX, main.00485B68
00485A76 . CALL main.004043A0
00485A7B . MOV CL, 1
00485A7D . MOV EDX, DWORD PTR SS:[EBP-14]
00485A80 . MOV EAX, DWORD PTR SS:[EBP-10]
00485A83 . CALL main.0046A150
00485A88 . TEST AL, AL
00485A8A . JE SHORT main.00485ABA
00485A8C . MOV ECX, DWORD PTR SS:[EBP-8]
00485A8F . MOV EDX, main.00485B88********************ASCII "Passwd"这里写入注册码!
00485A94 . MOV EAX, DWORD PTR SS:[EBP-10]
00485A97 . CALL main.0046A2EC
00485A9C . LEA EDX, DWORD PTR SS:[EBP-28]
00485A9F . MOV EAX, DWORD PTR DS:[EBX+318]
00485AA5 . CALL main.0043F94C
00485AAA . MOV ECX, DWORD PTR SS:[EBP-28]
00485AAD . MOV EDX, main.00485B98********************"UsrName"这里写入用户名!已经成功了!
00485AB2 . MOV EAX, DWORD PTR SS:[EBP-10]
00485AB5 . CALL main.0046A2EC
00485ABA > MOV EAX, DWORD PTR SS:[EBP-10]
00485ABD . CALL main.0046A0BC
00485AC2 . XOR EAX, EAX
00485AC4 . POP EDX
00485AC5 . POP ECX
00485AC6 . POP ECX
00485AC7 . MOV DWORD PTR FS:[EAX], EDX
00485ACA . PUSH main.00485ADF
00485ACF > MOV EAX, DWORD PTR SS:[EBP-10]
00485AD2 . CALL main.0040359C
00485AD7 . RETN
=======================================================================================================================
***********************************算法CALL的代码!省略部分代码**********************************************************
00485878 /$ PUSH EBP*********************************追进算法CALL后,我们停在这里!
***********************************省略部分代码!
004858A8 |. CALL main.00404308
004858AD |. MOV EAX, [LOCAL.1]**************把机器码移入EAX中
004858B0 |. CALL main.004045C0
004858B5 |. MOV ESI, EAX********************机器码的位数移入ESI,机器码是22(十六进制值是16),ESI=16
004858B7 |. TEST ESI, ESI********************测试位数!
004858B9 |. JLE SHORT main.0048590D*********小于就跳走!这里不会跳!直接往下!
004858BB |. MOV EBX, 1**********************把1放进EBX
004858C0 |> LEA EAX, DWORD PTR DS:[EBX+1E]**把值:EBX+1E=1+1E=1F入EAX这是第一次,第二次是2+1E=20,以后类
**************推,直至取完22位机器码!
004858C3 |. PUSH EAX*************************EAX入栈!1F入栈
004858C4 |. MOV EAX, EBX********************EBX的值入EAX,即EAX的值变成1
004858C6 |. POP EDX
004858C7 |. MOV ECX, EDX********************EDX的值1F移入ECX中
004858C9 |. CDQ*********************************EDX清0
004858CA |. IDIV ECX*************************EAX=EAX/ECX=1/1F=0,余数1放在EDX中
004858CC |. MOV EDI, EDX********************EDX入EDI,1入EDI
004858CE |. MOV EAX, EBX********************1入EAX
004858D0 |. XOR EAX, EBX********************EAX清0
004858D2 |. XOR EAX, EBX********************EAX的值为1
004858D4 |. XOR EDI, EAX********************EDI清0
004858D6 |. LEA EAX, DWORD PTR DS:[EBX+14]**EBX+14=1+14=15入EAX,同上,第二次是2+14=16
004858D9 |. PUSH EAX
004858DA |. MOV EAX, EBX********************EAX的值为1
004858DC |. POP EDX
004858DD |. MOV ECX, EDX********************15入ECX
004858DF |. CDQ*********************************EDX清0
004858E0 |. IDIV ECX*************************EAX=EAX/ECX=1/15=0,余数1放在EDX中
004858E2 |. XOR EDX, EBX********************EDX清0
004858E4 |. ADD EDI, EDX********************EDI=EDI+EDX=0+0=0
004858E6 |. ADD EDI, EBX********************EDI=EDI+EBX=0+1=1
004858E8 |. XOR EDI, 3**********************1与常数3相异或,值为2
004858EB |. INC EDI*************************EDI的值再加1,为3
004858EC |. LEA EAX, [LOCAL.4]
004858EF |. MOV EDX, [LOCAL.1]**************机器码入EDX
004858F2 |. MOVZX EDX, BYTE PTR DS:[EDX+EBX-1]***取机器码的第一位:6(ASCII码值为36)
004858F7 |. ADD EDX, EDI********************EDX=EDX+EDI=3+36=39(十进制值为9)
004858F9 |. CALL main.004044E8
004858FE |. MOV EDX, [LOCAL.4]
00485901 |. LEA EAX, [LOCAL.3]
00485904 |. CALL main.004045C8
00485909 |. INC EBX*************************EBX+1=2
0048590A |. DEC ESI*************************ESI-1=16-1=15
0048590B |.^ JNZ SHORT main.004858C0*********机器码取完了吗?没取完继续循环,这一个循环是处理机器
********码,把机器码进行转换!转换是这样:每次取出一位机器码设为M,其对应的在机器码中所处的位数设为X,
********X XOR 3=Y,设转换后的值为N,N=Y+M(加的值是其ASCII码值),得到结果N取对应的字符串,就是转换后的值
********如取第一位:6,6对应的位数是:1,所以1^3=2,2+1=3,3+36=39,转换后的第一位值就是:9;第二位:8,就
********是:2^3=1,1+1=2,2+38=3A,3A对应的字符串是:“:”这就是转换后的第二位值,以下类推。我的机器码:
********6875849699120117131144转换后的值是:9:8=?:>BDC:B??>KDEBIKJ
0048590D |> MOV EAX, [LOCAL.2]
00485910 |. MOV EDX, [LOCAL.3]
00485913 |. CALL main.0040435C
00485918 |. XOR EAX, EAX
0048591A |. POP EDX
0048591B |. POP ECX
0048591C |. POP ECX
0048591D |. MOV DWORD PTR FS:[EAX], EDX
00485920 |. PUSH main.00485942
00485925 |> LEA EAX, [LOCAL.4]
00485928 |. MOV EDX, 2
0048592D |. CALL main.0040432C
00485932 |. LEA EAX, [LOCAL.1]
00485935 |. CALL main.00404308
0048593A . RETN
2、算法小结:
计算注册码用到机器码和你输入的用户名,要经过两次计算,第一次计算把机器码进行转换,转换是这样:每次取
出一位机器码设为M,其对应的在机器码中所处的位数设为X,X XOR 3=Y,设转换后的值为N,N=Y+M(加的值是其ASCII
码值),得到结果N取对应的字符串,就是转换后的值如取第一位:6,6对应的位数是:1,所以1^3=2,2+1=3,3+36=39,
转换后的第一位值就是:9;第二位:8,是:2^3=1,1+1=2,2+38=3A,3A对应的字符串是:“:”这就是转换后的第二
位值,以下类推。我的机器码:6875849699120117131144转换后的值是:9:8=?:>BDC:B??>KDEBIKJ
第二次计算把用户名和变形后的机器码连接起来,组成一个新的值,再把这个值按上述公式计算出你的注册码,计算
一样,不再多说明。
一个成功的注册码:
用户名:YZEZ
机器码:6875849699120117131144
注册码:\Fb@@=IJDGRSQGVRQOc[[Wefd
计算注册码的公式简述如下:
设一位注册码为M,其对应在码中的位数为X,计算的中间值为Y,计算后的注册码对应的ASCII码值为N
公式如下:X^3=Y,N=Y+M(取对应的字符串)