• 标 题:Nok2phone的注册算法与网络校验解除---VB程序关键处的快速定位
  • 作 者:txm123
  • 时 间:2003-9-13 周六, 下午6:07
  • 链 接:http://bbs.pediy.com

这个软件是一个网友在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    EAXEAX
66024746    JL      MSVBVM60.660470E7
6602474C    DEC     EAX
6602474D    RETN    0C
 
===================================================================================================
6602473E    CALL    DWORD PTR DS:[6610FE74]此CALL追进后来到这里,这是一个过渡,不是重点,直接按F8
快速通过:
7716C0CF >  PUSH    EBP
7716C0D0    MOV     EBPESP
7716C0D2    SUB     ESP, 18
7716C0D5    MOV     EAXDWORD 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     ECXDWORD 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    EAXEAX*********************进入关键处后停在这里!
004B82AF   .  JE      yzez.004B87D3****************下面有很长一段,搞什么飞机?网络校验你懂不懂?
004B82B5   .  MOV     EAXDWORD PTR SS:[EBP-28]
004B82B8   .  TEST    EAXEAX
004B82BA   .  JE      yzez.004B87D3
004B82C0   .  PUSH    yzez.004124D8**** "http://members.hknet.com/~leoto/nok2phone/n2p_reg/"(这是注册的主页)
004B82C5   .  MOV     ECXDWORD PTR SS:[EBP-24]
004B82C8   .  PUSH    ECX
004B82C9   .  CALL    EBX                              
004B82CB   .  MOV     EDXEAX*******把“http://members.hknet.com/~leoto/nok2phone/n2p_reg/yzez[DFCG]"你的注
*****************册用户名移入EDX,准备网络校验!
004B82CD   .  LEA     ECXDWORD 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     EDXESP
*************省略若干代码!********************************************************************************************
004B8347   .  PUSH    EAX
004B8348   .  LEA     EDXDWORD PTR SS:[EBP-68]
004B834B   .  PUSH    EDX
004B834C   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaOb>;  MSVBVM60.__vbaObjSet
004B8352   .  PUSH    EAX
004B8353   .  LEA     EAXDWORD 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     EDXEAX
004B836C   .  LEA     ECXDWORD PTR SS:[EBP-20]
004B836F   .  CALL    EDI                              ;  MSVBVM60.__vbaStrMove
004B8371   .  LEA     ECXDWORD PTR SS:[EBP-2C]
*************再次省略若干代码!VB的程序真是又长又臭呀!**********************************************************
004B83C1   .  CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
004B83C7   .  MOV     EAXDWORD PTR SS:[EBP+8]
004B83CA   .  MOV     EDXDWORD PTR DS:[EAX]
004B83CC   .  LEA     ECXDWORD PTR SS:[EBP-144]
004B83D2   .  PUSH    ECX
004B83D3   .  MOV     ECXDWORD PTR SS:[EBP-24]
004B83D6   .  PUSH    ECX
004B83D7   .  PUSH    EAX
004B83D8   .  CALL    DWORD PTR DS:[EDX+73C]****你一定会来到这里,到这里停!算法CALL,一定要按F7追进!
004B83DE   .  MOV     EDXDWORD 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     EAXEAX
004B83F1   .  NEG     EAX
004B83F3   .  XOR     ECXECX
004B83F5   .  MOV     EDXDWORD PTR SS:[EBP-28]********输入的试验码的十六进值入EDX,这里是:BC614E(12345678)
004B83F8   .  CMP     EDXDWORD PTR SS:[EBP-144]*******比较两者是否相等或者是否为0,SS:[EBP-144]存放的数值是:
******************2ACEED6B,就是上述对用户名计算后的值。
004B83FE   .  SETNE   CL********************************不相等置CL的值为1,相等置CL的值为0
004B8401   .  OR      EAXECX**************************EAX与ECX相或,EAX的值是多少,就是网络校验返回的值,
**************************如果通过网络校验返回值是0,否则EAX的值是1,这里当然是1,因为你没有交钱!
004B8403   .  JNZ      yzez.004B8921********************不相等就跳,这里一定不能跳,要解除它的网络验证,就在
*****************这里动手吧!把JNZ改成JE!把”0F85“改成”0F84“。修改后即使有网络验证,你也会注册成功!
004B8409   .  MOV     EAXDWORD PTR DS:[4CD91C]********不跳就往下。
004B840E   .  TEST    EAXEAX
004B8410   .  JNZ     SHORT yzez.004B8422
004B8412   .  PUSH    yzez.004CD91C
****************省略一部分无关代码!************************************************************************
004B86C4   .  PUSH    EAX
004B86C5   .  LEA     EAXDWORD PTR SS:[EBP-110]
004B86CB   .  PUSH    EAX
004B86CC   .  LEA     ECXDWORD PTR SS:[EBP-A0]
004B86D2   .  PUSH    ECX
004B86D3   .  CALL    ESI                             
004B86D5   .  PUSH    EAX
004B86D6   .  LEA     EDXDWORD PTR SS:[EBP-B0]
004B86DC   .  PUSH    EDX
004B86DD   .  LEA     EAXDWORD 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     EAXDWORD PTR DS:[4CD91C]********上面如果不相等就跳到这里!往下走!
004B8926   .  TEST    EAXEAX
********************再次省略一大段代码!**********************************************************************
004B8AC4   .  PUSH    ECX
004B8AC5   .  PUSH    10
004B8AC7   .  LEA     EDXDWORD PTR SS:[EBP-80]
004B8ACA   .  PUSH    EDX
004B8ACB   .  CALL    DWORD PTR DS:[<&MSVBVM60.#595>]*******到了这里兄弟留下买路钱吧!注册失败!
004B8AD1   .  LEA     EAXDWORD PTR SS:[EBP-50]
******************又是省略!*********************************************************************************
004B8BDF   .  C3            RETN

=============================================================================================================
算法CALL:004B83D8 CALL  DWORD PTR DS:[EDX+73C],追进后我们来到这里:

00444DC0    PUSH    EBP
00444DC1    MOV     EBPESP
00444DC3    SUB     ESP, 14
00444DC6    PUSH    <JMP.&MSVBVM60.__vbaExceptHandle>
00444DCB    MOV     EAXDWORD 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     EDIEDI                         
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     EDXDWORD PTR SS:[EBP+C]************用户名移入EDX中
00444DFD    LEA     ECXDWORD 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     EAXDWORD 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    EAXEAX****************************返回EAX的值为1,因为你没有交钱!
00444E20    JE      yzez.00444EC1
00444E26    MOV     EBXDWORD PTR DS:[<&MSVBVM60.#5>
00444E2C    MOV     DWORD PTR SS:[EBP-38], 1
00444E33    MOV     DWORD PTR SS:[EBP-40], 2
00444E3A    LEA     ECXDWORD PTR SS:[EBP-40]
00444E3D    PUSH    ECX
00444E3E    MOVSX   EDXSI
00444E41    PUSH    EDX                             
00444E42    MOV     EAXDWORD PTR SS:[EBP-28]
00444E45    PUSH    EAX
00444E46    CALL    DWORD PTR DS:[<&MSVBVM60.#631>]  
00444E4C    MOV     EDXEAX
00444E4E    LEA     ECXDWORD PTR SS:[EBP-30]
00444E51    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaSt>
00444E57    PUSH    EAX
00444E58    CALL    EBX                              
00444E5A    MOVSX   ECXAX*****************************取用户名的第一位的ASCII码值,第一位用户名是:y
****************************ASCII码值是:79,79送入ECX中!
00444E5D    ADD     ECXEDI****************************ECX=ECX+EDI=79+0=79                        
00444E5F    JO      yzez.00444F0F***********************溢出转移!
00444E65    MOV     EDIECX****************************ECX的值:79移入EDI中
00444E67    LEA     ECXDWORD PTR SS:[EBP-30]
00444E6A    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444E70    LEA     ECXDWORD 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     EDXDWORD PTR SS:[EBP-28]
00444E86    PUSH    EDX                              
00444E87    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaLe>
00444E8D    MOVSX   ECXSI
00444E90    CMP     ECXEAX***************************比较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    EDIEDI, 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    EDIEDI, 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     ECXDWORD PTR SS:[EBP-30]
00444ED8    CALL    DWORD PTR DS:[<&MSVBVM60.__vbaFr>
00444EDE    LEA     ECXDWORD 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处直接修改,改后即使有网络验证,也会注册成功!