这个软件是一个网友在DFCG论坛要求破解的,他的原贴如:这是一款可以把MID转换为手机编辑
键谱的工具,我自己试着破解过但终不得法,所以还没能这个能力破解,希望有哪位好人帮我得到注册码,并教我如何破解,小弟在这里先谢过了!
下载地址是:
http://www.hkpcug.org/personal/leoto/n2p_setup/Setup.EXE
破解作者: yzez[DFCG]
破解工具: peid0.8汉化版、UPXUnpack、OLLYDBG1.09B
破解目的: 本不为破解而破解,只因为技术而破解!
破解过程:
1、用peid0.8检查是UPX的壳,用UPXUnpack轻松脱壳,脱壳后的程序可以正常运行,不需要修复输入表,是VB
程序,用OLLYDBG1.09B载入程序,用:vbastrcomp设置断点,按F9让程序运行,这个过程中要按几次F9,才会出
现注册窗口,出现注册窗口后输入注册信息,用户名:yzez[DFCG],注册码:12345678,下面的重点是VB程序的关
键处的快速定位,这不是一个万能方法,破无常法,这里仅供参考,具体过程往下看:
66024722 > CMP DWORD PTR SS:[ESP+4], 2****用vbastrcomp设置断点,中断与此,按F9运行!
66024727 JE MSVBVM60.660470E0
6602472D PUSH 30001
66024732 PUSH DWORD PTR SS:[ESP+8]
66024736 PUSH DWORD PTR SS:[ESP+10]
6602473A PUSH DWORD PTR SS:[ESP+18]
6602473E CALL DWORD PTR DS:[6610FE74]****追进此CALL,可以快速到达注册算法的核心处,按F7跟进!
66024744 TEST EAX, EAX
66024746 JL MSVBVM60.660470E7
6602474C DEC EAX
6602474D RETN 0C
===================================================================================================
6602473E CALL DWORD PTR DS:[6610FE74]此CALL追进后来到这里,这是一个过渡,不是重点,直接按F8
快速通过:
7716C0CF > PUSH EBP
7716C0D0 MOV EBP, ESP
7716C0D2 SUB ESP, 18
7716C0D5 MOV EAX, DWORD PTR SS:[EBP+8]
7716C0D8 PUSH EAX
7716C0D9 CALL OLEAUT32.77168DE7
7716C0DE ADD ESP, 4
7716C0E1 MOV DWORD PTR SS:[EBP-8], EAX
7716C0E4 MOV ECX, DWORD PTR SS:[EBP+C]
7716C0E7 PUSH ECX
7716C0E8 CALL OLEAUT32.77168DE7
7716C0ED ADD ESP, 4
这个CALL结束后会跳回到:66024722 > CMP DWORD PTR SS:[ESP+4]这个比较的上面一行,按一次F8就可以
直接来到关键处。
************************以下是关键代码!*****************************************************************
004B82AD . TEST EAX, EAX*********************进入关键处后停在这里!
004B82AF . JE yzez.004B87D3****************下面有很长一段,搞什么飞机?网络校验你懂不懂?
004B82B5 . MOV EAX, DWORD PTR SS:[EBP-28]
004B82B8 . TEST EAX, EAX
004B82BA . JE yzez.004B87D3
004B82C0 . PUSH yzez.004124D8**** "http://members.hknet.com/~leoto/nok2phone/n2p_reg/"(这是注册的主页)
004B82C5 . MOV ECX, DWORD PTR SS:[EBP-24]
004B82C8 . PUSH ECX
004B82C9 . CALL EBX
004B82CB . MOV EDX, EAX*******把“http://members.hknet.com/~leoto/nok2phone/n2p_reg/yzez[DFCG]"你的注
*****************册用户名移入EDX,准备网络校验!
004B82CD . LEA ECX, DWORD PTR SS:[EBP-2C]
004B82D0 . CALL EDI
004B82D2 . PUSH EAX
004B82D3 . PUSH yzez.00412544 ; UNICODE ".txt"
004B82D8 . CALL EBX ; MSVBVM60.__vbaStrCat
004B82DA . MOV DWORD PTR SS:[EBP-78], EAX** "http://members.hknet.com/~leoto/nok2phone/n2p_reg/yzez[DFCG].txt"
*************这是你在对方主机上的注册信息的存放处,你有交注册费吗?
004B82DD . MOV ECX, 8
004B82E2 . MOV DWORD PTR SS:[EBP-80], ECX
004B82E5 . MOV DWORD PTR SS:[EBP-108], 0
004B82EF . MOV DWORD PTR SS:[EBP-110], 3
004B82F9 . SUB ESP, 10
004B82FC . MOV EDX, ESP
*************省略若干代码!********************************************************************************************
004B8347 . PUSH EAX
004B8348 . LEA EDX, DWORD PTR SS:[EBP-68]
004B834B . PUSH EDX
004B834C . CALL DWORD PTR DS:[<&MSVBVM60.__vbaOb>; MSVBVM60.__vbaObjSet
004B8352 . PUSH EAX
004B8353 . LEA EAX, DWORD PTR SS:[EBP-90]
004B8359 . PUSH EAX
004B835A . CALL DWORD PTR DS:[<&MSVBVM60.__vbaLa>******此CALL进行一次网络校验,如果你交了注册费用,对方主机上
*************就会有你的信息,有你的信息,这里返回EAX的值为0,否则EAX的值为1
004B8360 . ADD ESP, 30
004B8363 . PUSH EAX
004B8364 . CALL DWORD PTR DS:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrVarMove
004B836A . MOV EDX, EAX
004B836C . LEA ECX, DWORD PTR SS:[EBP-20]
004B836F . CALL EDI ; MSVBVM60.__vbaStrMove
004B8371 . LEA ECX, DWORD PTR SS:[EBP-2C]
*************再次省略若干代码!VB的程序真是又长又臭呀!**********************************************************
004B83C1 . CALL DWORD PTR DS:[<&MSVBVM60.__vbaFr>
004B83C7 . MOV EAX, DWORD PTR SS:[EBP+8]
004B83CA . MOV EDX, DWORD PTR DS:[EAX]
004B83CC . LEA ECX, DWORD PTR SS:[EBP-144]
004B83D2 . PUSH ECX
004B83D3 . MOV ECX, DWORD PTR SS:[EBP-24]
004B83D6 . PUSH ECX
004B83D7 . PUSH EAX
004B83D8 . CALL DWORD PTR DS:[EDX+73C]****你一定会来到这里,到这里停!算法CALL,一定要按F7追进!
004B83DE . MOV EDX, DWORD PTR SS:[EBP-20]
004B83E1 . PUSH EDX
004B83E2 . PUSH yzez.00411B8C ; UNICODE "Nok2Phone"
004B83E7 . CALL DWORD PTR DS:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrCmp*****再一次比较校验!
004B83ED . NEG EAX
004B83EF . SBB EAX, EAX
004B83F1 . NEG EAX
004B83F3 . XOR ECX, ECX
004B83F5 . MOV EDX, DWORD PTR SS:[EBP-28]********输入的试验码的十六进值入EDX,这里是:BC614E(12345678)
004B83F8 . CMP EDX, DWORD PTR SS:[EBP-144]*******比较两者是否相等或者是否为0,SS:[EBP-144]存放的数值是:
******************2ACEED6B,就是上述对用户名计算后的值。
004B83FE . SETNE CL********************************不相等置CL的值为1,相等置CL的值为0
004B8401 . OR EAX, ECX**************************EAX与ECX相或,EAX的值是多少,就是网络校验返回的值,
**************************如果通过网络校验返回值是0,否则EAX的值是1,这里当然是1,因为你没有交钱!
004B8403 . JNZ yzez.004B8921********************不相等就跳,这里一定不能跳,要解除它的网络验证,就在
*****************这里动手吧!把JNZ改成JE!把”0F85“改成”0F84“。修改后即使有网络验证,你也会注册成功!
004B8409 . MOV EAX, DWORD PTR DS:[4CD91C]********不跳就往下。
004B840E . TEST EAX, EAX
004B8410 . JNZ SHORT yzez.004B8422
004B8412 . PUSH yzez.004CD91C
****************省略一部分无关代码!************************************************************************
004B86C4 . PUSH EAX
004B86C5 . LEA EAX, DWORD PTR SS:[EBP-110]
004B86CB . PUSH EAX
004B86CC . LEA ECX, DWORD PTR SS:[EBP-A0]
004B86D2 . PUSH ECX
004B86D3 . CALL ESI
004B86D5 . PUSH EAX
004B86D6 . LEA EDX, DWORD PTR SS:[EBP-B0]
004B86DC . PUSH EDX
004B86DD . LEA EAX, DWORD PTR SS:[EBP-C0]
004B86E3 . PUSH EAX
004B86E4 . CALL ESI
004B86E6 . PUSH EAX
004B86E7 . CALL DWORD PTR DS:[<&MSVBVM60.#595>]***********你能来到这里你就可以大笑了!因为你的钱不用往外拿
****************************************************************了!注册成功!
*****************省略若干代码!******************************************************************************
004B891A . CALL EDI ; MSVBVM60.__vbaStrMove
004B891C . JMP yzez.004B8A54
004B8921 > MOV EAX, DWORD PTR DS:[4CD91C]********上面如果不相等就跳到这里!往下走!
004B8926 . TEST EAX, EAX
********************再次省略一大段代码!**********************************************************************
004B8AC4 . PUSH ECX
004B8AC5 . PUSH 10
004B8AC7 . LEA EDX, DWORD PTR SS:[EBP-80]
004B8ACA . PUSH EDX
004B8ACB . CALL DWORD PTR DS:[<&MSVBVM60.#595>]*******到了这里兄弟留下买路钱吧!注册失败!
004B8AD1 . LEA EAX, DWORD PTR SS:[EBP-50]
******************又是省略!*********************************************************************************
004B8BDF . C3 RETN
=============================================================================================================
算法CALL:004B83D8 CALL DWORD PTR DS:[EDX+73C],追进后我们来到这里:
00444DC0 PUSH EBP
00444DC1 MOV EBP, ESP
00444DC3 SUB ESP, 14
00444DC6 PUSH <JMP.&MSVBVM60.__vbaExceptHandle>
00444DCB MOV EAX, DWORD PTR FS:[0]
00444DD1 PUSH EAX
00444DD2 MOV DWORD PTR FS:[0], ESP
00444DD9 SUB ESP, 44
00444DDC PUSH EBX
00444DDD PUSH ESI
00444DDE PUSH EDI
00444DDF MOV DWORD PTR SS:[EBP-14], ESP
00444DE2 MOV DWORD PTR SS:[EBP-10], yzez.0040>
00444DE9 XOR EDI, EDI
00444DEB MOV DWORD PTR SS:[EBP-C], EDI
00444DEE MOV DWORD PTR SS:[EBP-8], EDI
00444DF1 MOV DWORD PTR SS:[EBP-28], EDI
00444DF4 MOV DWORD PTR SS:[EBP-30], EDI
00444DF7 MOV DWORD PTR SS:[EBP-40], EDI
00444DFA MOV EDX, DWORD PTR SS:[EBP+C]************用户名移入EDX中
00444DFD LEA ECX, DWORD PTR SS:[EBP-28]
00444E00 CALL DWORD PTR DS:[<&MSVBVM60.__vbaSt>
00444E06 PUSH 1
00444E08 CALL DWORD PTR DS:[<&MSVBVM60.__vbaOn>
00444E0E MOV ESI, 1******************************把1移入ESI,ESI做计数器!
00444E13 MOV EAX, DWORD PTR SS:[EBP-28]**********用户名移入EAX中
00444E16 PUSH EAX*********************************EAX入栈,即用户名入栈!
00444E17 PUSH EDI*********************************EDI入栈,EDI的初始值是:0
00444E18 CALL DWORD PTR DS:[<&MSVBVM60.__vbaSt>***此CALL又跳回到中断处,不管,按F8就行!又一次校验!
00444E1E TEST EAX, EAX****************************返回EAX的值为1,因为你没有交钱!
00444E20 JE yzez.00444EC1
00444E26 MOV EBX, DWORD PTR DS:[<&MSVBVM60.#5>
00444E2C MOV DWORD PTR SS:[EBP-38], 1
00444E33 MOV DWORD PTR SS:[EBP-40], 2
00444E3A LEA ECX, DWORD PTR SS:[EBP-40]
00444E3D PUSH ECX
00444E3E MOVSX EDX, SI
00444E41 PUSH EDX
00444E42 MOV EAX, DWORD PTR SS:[EBP-28]
00444E45 PUSH EAX
00444E46 CALL DWORD PTR DS:[<&MSVBVM60.#631>]
00444E4C MOV EDX, EAX
00444E4E LEA ECX, DWORD PTR SS:[EBP-30]
00444E51 CALL DWORD PTR DS:[<&MSVBVM60.__vbaSt>
00444E57 PUSH EAX
00444E58 CALL EBX
00444E5A MOVSX ECX, AX*****************************取用户名的第一位的ASCII码值,第一位用户名是:y
****************************ASCII码值是:79,79送入ECX中!
00444E5D ADD ECX, EDI****************************ECX=ECX+EDI=79+0=79
00444E5F JO yzez.00444F0F***********************溢出转移!
00444E65 MOV EDI, ECX****************************ECX的值:79移入EDI中
00444E67 LEA ECX, DWORD PTR SS:[EBP-30]
00444E6A CALL DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444E70 LEA ECX, DWORD PTR SS:[EBP-40]
00444E73 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444E79 ADD SI, 1******************************SI=SI+1=1+1=2,小学数学!
00444E7D JO yzez.00444F0F**********************溢出转移!
00444E83 MOV EDX, DWORD PTR SS:[EBP-28]
00444E86 PUSH EDX
00444E87 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLe>
00444E8D MOVSX ECX, SI
00444E90 CMP ECX, EAX***************************比较ECX与EAX的值,EAX的值是用户名的位数,这里是
*****************************10位,故EAX的值是:0A
00444E92 ^ JLE SHORT yzez.00444E2C****************小于等于就跳回,形成循环,循环次数取决于输入的用
***************户名的位数,这个循环的作用是取用户名的每一位ASCII码值,然后把它们相加,我输入的用户名
***************计算后的最终结果是:39E!,这个结果被保存在EDI中!
00444E94 ADD EDI, 0AD****************************EDI=EDI+0AD=39E+0AD=0000044B
00444E9A JO SHORT yzez.00444F0F**********************溢出转移!
00444E9C IMUL EDI, EDI, 7*************************EDI=EDI*7=44B*7=00001E0D
00444E9F JO SHORT yzez.00444F0F**********************溢出转移!
00444EA1 SUB EDI, 180****************************EDI=EDI-180=1E0D-180=00001C8D
00444EA7 JO SHORT yzez.00444F0F**********************溢出转移!
00444EA9 IMUL EDI, EDI, 17FD7*************************EDI=EDI*17FD7=1C8D*17FD7=2ACEED6B
00444EAF JO SHORT yzez.00444F0F**********************溢出转移!
00444EB1 MOV DWORD PTR SS:[EBP-24], EDI***************把上述计算的值保存到:SS:[EBP-24]
00444EB4 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEx>
00444EBA PUSH yzez.00444EF2
00444EBF JMP SHORT yzez.00444EE8
00444EC1 MOV DWORD PTR SS:[EBP-24], 3B9AC9FF
00444EC8 CALL DWORD PTR DS:[<&MSVBVM60.__vbaEx>
00444ECE PUSH yzez.00444EF2
00444ED3 JMP SHORT yzez.00444EE8
00444ED5 LEA ECX, DWORD PTR SS:[EBP-30]
00444ED8 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444EDE LEA ECX, DWORD PTR SS:[EBP-40]
00444EE1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444EE7 RETN******************************************返回!这个子程序结束!
2、算法小结:
设用户名的每一位的ASCII码相加的值是X,则注册码SN是:
SN=[(x+0AD)*7-180]*17FD7的结果的十进制值。
3、验证算法:用户名:yzez[DFCG]
X=79+7A+65+7A+5B+44+46+43+47+5D=39E
SN=[(39E+0AD)*7-180]*17FD7=2ACEED6B,十进制值为:718204267,这就是我们要的注册码。
一个可用的注册码:用户名:yzez[DFCG],注册码:718204267
4、解除网络验证,因为这个程序有几处涉及到网络验证,所以直接修改跳过验证,并不太现实,所以我们可以在:
004B8403 . JNZ yzez.004B8921处直接修改,改后即使有网络验证,也会注册成功!