【破文作者】 rdsnow[BCG][PYG][D.4s]
【作者主页】 http://rdsnow.ys168.com
【 E-mail 】 rdsnow@163.com
【 作者QQ 】 83757177
【文章题目】 音乐海盗 V1.32 的注册
【软件名称】 音乐海盗1.32
【下载地址】 http://www.enowsoft.com/asp_7i24_co...reg_yyhd132.exe
----------------------------------------------------------------------------------------------
【加密方式】 序列号
【破解工具】 ODbyDYK v1.10[05.09]
【软件限制】 功能限制
【破解平台】 Microsoft Windows XP SP2
【文章简介】
呵呵,这个版本是一个注册用户发给我的下载地址,只有这个地址下载到的才是完整版,其他的都是试用版的。
Microsoft Visual Basic 5.0 / 6.0,其他没有什么说的,原因是最近被壳搞得头大,来个简单的,全当灌水吧!高手勿进。
----------------------------------------------------------------------------------------------
【破解过程】
程序启动时会弹出一个输入对话框,让你输入注册码
于是输入假码,命令行下断:bp rtcInputBox
运行程序,中断,并返回到程序领空,来到这里:
007C0E5F 52 PUSH EDX
007C0E60 FF15 88104000 CALL DWORD PTR DS:[<&MSVBVM60.#596>] ; MSVBVM60.rtcInputBox
007C0E66 8BD0 MOV EDX,EAX
007C0E68 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007C0E6B FFD3 CALL EBX
007C0E6D 8D85 4CFFFFFF LEA EAX,DWORD PTR SS:[EBP-B4]
007C0E73 50 PUSH EAX
………………
省略中间一大段次要代码
007C0EDB 52 PUSH EDX
007C0EDC 8D45 9C LEA EAX,DWORD PTR SS:[EBP-64]
007C0EDF 50 PUSH EAX
007C0EE0 FFD3 CALL EBX
007C0EE2 8D4D AC LEA ECX,DWORD PTR SS:[EBP-54]
007C0EE5 51 PUSH ECX ; 假注册码
007C0EE6 8D55 9C LEA EDX,DWORD PTR SS:[EBP-64]
007C0EE9 52 PUSH EDX ; 真注册码
007C0EEA FF15 D4104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTstEq>] ; MSVBVM60.__vbaVarTstEq,真假注册码比较
007C0EF0 66:8BD8 MOV BX,AX
007C0EF3 8D45 9C LEA EAX,DWORD PTR SS:[EBP-64]
007C0EF6 50 PUSH EAX
007C0EF7 8D4D AC LEA ECX,DWORD PTR SS:[EBP-54]
007C0EFA 51 PUSH ECX
007C0EFB 6A 02 PUSH 2
007C0EFD FFD7 CALL EDI ; MSVBVM60.__vbaFreeVarList
007C0EFF 83C4 0C ADD ESP,0C
007C0F02 66:85DB TEST BX,BX
007C0F05 0F84 B0010000 JE 音乐海盗.007C10BB ; 关键跳转
007C0F0B 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
007C0F0E 52 PUSH EDX
007C0F0F 56 PUSH ESI
007C0F10 6A FF PUSH -1
007C0F12 6A 02 PUSH 2
007C0F14 FF15 80114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileOpen>] ; MSVBVM60.__vbaFileOpen
007C0F1A 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
007C0F1D 50 PUSH EAX
007C0F1E 56 PUSH ESI
007C0F1F 68 64F74000 PUSH 音乐海盗.0040F764
007C0F24 FF15 30114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPrintFile>] ; MSVBVM60.__vbaPrintFile
007C0F2A 83C4 0C ADD ESP,0C
007C0F2D 56 PUSH ESI
007C0F2E FF15 C0104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileClose>] ; MSVBVM60.__vbaFileClose
007C0F34 BA 08104100 MOV EDX,音乐海盗.00411008
007C0F39 8D4D CC LEA ECX,DWORD PTR SS:[EBP-34]
007C0F3C FF15 9C114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
007C0F42 B8 04000280 MOV EAX,80020004
……………………
007C0F7C 51 PUSH ECX
007C0F7D 6A 40 PUSH 40
007C0F7F 8D95 3CFFFFFF LEA EDX,DWORD PTR SS:[EBP-C4]
007C0F85 52 PUSH EDX ; 注册成功的对话框
007C0F86 FF15 7C104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
007C0F8C 8D45 8C LEA EAX,DWORD PTR SS:[EBP-74]
其实直接在__vbaVarTstEq上下断,就可以看到注册码了。
不过瘾,那就继续分析程序的注册码是怎么形成的:
程序在不同的电脑上有不同的注册码,可能跟硬盘序列号有关,于是命令行下断:bp GetVolumeInformationA
中断后,来到这里:
007BFD0B . 50 PUSH EAX
007BFD0C . E8 BBF2C4FF CALL 音乐海盗.0040EFCC ; 读取程序所在分区的硬盘序列号
偶的硬盘序号:80D252D7
下面的注释中的数据是偶机器上得到的:
007BFD11 . FF15 60104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaSetSystemErr>; MSVBVM60.__vbaSetSystemError
007BFD17 . 8B55 D4 MOV EDX,DWORD PTR SS:[EBP-2C]
007BFD1A . 52 PUSH EDX
007BFD1B . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
007BFD1E . 50 PUSH EAX
007BFD1F . FF15 2C114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrToUnicode>; MSVBVM60.__vbaStrToUnicode
007BFD25 . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007BFD28 . 8B35 14124000 MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
007BFD2E . FFD6 CALL ESI ; <&MSVBVM60.__vbaFreeStr>
007BFD30 . 6A 06 PUSH 6 ; 堆栈中压入6
007BFD32 . 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20]
007BFD35 . 51 PUSH ECX ; 硬盘序号转换成10进制字符串得到"-2133699881"
007BFD36 . FF15 18104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrI4>] ; MSVBVM60.__vbaStrI4
007BFD3C . 8BD0 MOV EDX,EAX
007BFD3E . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007BFD41 . 8B3D F8114000 MOV EDI,DWORD PTR DS:[<&MSVBVM60.__vbaStrMove>] ; MSVBVM60.__vbaStrMove
007BFD47 . FFD7 CALL EDI ; <&MSVBVM60.__vbaStrMove>
007BFD49 . 50 PUSH EAX ; 上面堆栈中压入6,这里取硬盘序号的前6位"-21336"
007BFD4A . FF15 E4114000 CALL DWORD PTR DS:[<&MSVBVM60.#616>] ; MSVBVM60.rtcLeftCharBstr
007BFD50 . 8BD0 MOV EDX,EAX
007BFD52 . 8D4D D8 LEA ECX,DWORD PTR SS:[EBP-28]
007BFD55 . FFD7 CALL EDI ; <&MSVBVM60.__vbaStrMove>
007BFD57 . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007BFD5A . FFD6 CALL ESI ; <&MSVBVM60.__vbaFreeStr>
007BFD5C . FF15 78104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaExitProc>] ; MSVBVM60.__vbaExitProc
007BFD62 . 68 A7FD7B00 PUSH 音乐海盗.007BFDA7
007BFD67 . EB 34 JMP SHORT 音乐海盗.007BFD9D
007BFD69 . BA 14FF4000 MOV EDX,音乐海盗.0040FF14
007BFD6E . 8D4D D8 LEA ECX,DWORD PTR SS:[EBP-28]
007BFD71 . FF15 9C114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
007BFD77 . FF15 78104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaExitProc>] ; MSVBVM60.__vbaExitProc
007BFD7D . 68 A7FD7B00 PUSH 音乐海盗.007BFDA7
007BFD82 . EB 19 JMP SHORT 音乐海盗.007BFD9D
007BFD84 . F645 F4 04 TEST BYTE PTR SS:[EBP-C],4
007BFD88 . 74 09 JE SHORT 音乐海盗.007BFD93
007BFD8A . 8D4D D8 LEA ECX,DWORD PTR SS:[EBP-28]
007BFD8D . FF15 14124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
007BFD93 > 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007BFD96 . FF15 14124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
007BFD9C . C3 RETN
007BFD9D > 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
007BFDA0 . FF15 14124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
007BFDA6 . C3 RETN
这段代码是:取程序所在分区的序列号:80D2-52D7
转为10进制字符串得到:"-2133699881"
再取前6位得到:"-21336"
跟出 RETN 继续对"-21336"处理:
007C08F0 > 6A 01 PUSH 1 ; 取出"-21336"的第一位"-"
007C08F2 . 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
007C08F5 . 50 PUSH EAX
007C08F6 . 8B3D E4114000 MOV EDI,DWORD PTR DS:[<&MSVBVM60.#616>] ; MSVBVM60.rtcLeftCharBstr
007C08FC . FFD7 CALL EDI ; <&MSVBVM60.#616>
007C08FE . 8BD0 MOV EDX,EAX
007C0900 . 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
007C0903 . FFD3 CALL EBX
007C0905 . 50 PUSH EAX
007C0906 . 68 84FA4000 PUSH 音乐海盗.0040FA84
007C090B . FFD6 CALL ESI ; 判断第一位是不是"-"
007C090D . 8BF0 MOV ESI,EAX
007C090F . F7DE NEG ESI
007C0911 . 1BF6 SBB ESI,ESI
007C0913 . 46 INC ESI
007C0914 . F7DE NEG ESI
007C0916 . 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
007C0919 . FF15 14124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
007C091F . 66:85F6 TEST SI,SI
007C0922 . 74 2F JE SHORT 音乐海盗.007C0953 ; 不是"-"就跳走
007C0924 . 68 BC0F4100 PUSH 音乐海盗.00410FBC
007C0929 . 6A 05 PUSH 5 ; 取后5位"21336"
007C092B . 8B4D D4 MOV ECX,DWORD PTR SS:[EBP-2C]
007C092E . 51 PUSH ECX
007C092F . FF15 F0114000 CALL DWORD PTR DS:[<&MSVBVM60.#618>] ; MSVBVM60.rtcRightCharBstr
007C0935 . 8BD0 MOV EDX,EAX
007C0937 . 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
007C093A . FFD3 CALL EBX
007C093C . 50 PUSH EAX ; "1"+后5位,得到"121336"
007C093D . FF15 54104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
007C0943 . 8BD0 MOV EDX,EAX
007C0945 . 8D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
007C0948 . FFD3 CALL EBX
007C094A . 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
007C094D . FF15 14124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
这里就是如果硬盘序号是负数,那么就用"1"替换掉"-"号
我电脑上得到的是"-21336"前面有"-"用"1"换掉,得到"121336"
如果前面没有"-"则没有这个操作
007C0953 > 6A 03 PUSH 3 ; 取"121336"的后三位"336"
007C0955 . 8B55 D4 MOV EDX,DWORD PTR SS:[EBP-2C]
007C0958 . 52 PUSH EDX
007C0959 . FF15 F0114000 CALL DWORD PTR DS:[<&MSVBVM60.#618>] ; MSVBVM60.rtcRightCharBstr
007C095F . 8BD0 MOV EDX,EAX
007C0961 . 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
007C0964 . FFD3 CALL EBX
007C0966 . 50 PUSH EAX
007C0967 . 6A 03 PUSH 3 ; 取"121336"的前三位"121"
007C0969 . 8B45 D4 MOV EAX,DWORD PTR SS:[EBP-2C]
007C096C . 50 PUSH EAX
007C096D . FFD7 CALL EDI
007C096F . 8BD0 MOV EDX,EAX
007C0971 . 8D4D C4 LEA ECX,DWORD PTR SS:[EBP-3C]
007C0974 . FFD3 CALL EBX
007C0976 . 50 PUSH EAX ; "336"+"121"="336121"
007C0977 . FF15 54104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
007C097D . 8BD0 MOV EDX,EAX
007C097F . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
007C0982 . FFD3 CALL EBX
007C0984 . 8D4D C4 LEA ECX,DWORD PTR SS:[EBP-3C]
007C0987 . 51 PUSH ECX
007C0988 . 8D55 C8 LEA EDX,DWORD PTR SS:[EBP-38]
007C098B . 52 PUSH EDX
007C098C . 6A 02 PUSH 2
007C098E . FF15 A8114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeStrList>>; MSVBVM60.__vbaFreeStrList
007C0994 . 83C4 0C ADD ESP,0C
007C0997 . 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24]
007C099A . 50 PUSH EAX ; 字符串->整数,"336121"得到0x520F9
007C099B . FF15 A0114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaI4Str>] ; MSVBVM60.__vbaI4Str
007C09A1 . 69C0 FE010000 IMUL EAX,EAX,1FE ; 0x520F9 × 0x1FE = 0xA37B00E
007C09A7 . 0F80 90080000 JO 音乐海盗.007C123D
007C09AD . 50 PUSH EAX ; 再转为10进制字符串得到"171421710"
007C09AE . FF15 18104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrI4>] ; MSVBVM60.__vbaStrI4
上面拿"121336"的前三位和后三位交换得到"336121"
336121×510=171421710
得到的"171421710"就是我机器上的注册码了。
----------------------------------------------------------------------------------------------
【破解心得】
个人觉得VB程序的流程中不断地在调用VB的函数库,只要熟悉一些常用的函数库,那么它的注册流程基本上就暴露出来的。
中断地址:7C09B4
中断次数:1
第一字节:8B
指令长度:2
注册码保存为:内存方式
寄存器:EAX
记得选上:宽字符串
算法比较简单,算法注册机懒得写了
----------------------------------------------------------------------------------------------
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
----------------------------------------------------------------------------------------------
文章写于2005-10-18 18:28:50