【软件简介】: 用MODEM实现电话录音/播放/远程控制
录制谈话内容并回播
支持来电号码显示
内置通讯录,直接显示来电人姓名
无需拨号,支持姓名-电话绑定
电脑值班,自动录制来电者留言
机主远程听取留言,获取来电号码
定时电话叫醒功能
电话号码查询功能
自动呼叫机主,报告来电号码与时间
远程关闭计算机
远程配置软件设置
【软件限制】: NAG暗桩、功能限制。
【作者声明】: 初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【破解工具】: Ollydbg1.09
—————————————————————————————————
【过 程】:
想找一个电话录音软件,开搜后找到这个东东,试用后非常不错!但未注册版在30分钟后自动退出,帮助文件中
还被告之有功能限制!首先开搜注册机,很不幸居然没找到,只好自己动手解决!
现在开工:
我无法搞定注册机,仅仅是简单分析 ,怎样取得注册码并破除暗桩。
狂猫日记XC-Talk.exe 是ASPack壳,用AspackDie脱之。140K->704K。VB编写。版本(1.2.0)
用Ollydbg调入程序,停在入口处,运行后调出注册窗口,VB的东东一向很难跟踪,首先从VbaLenBstr取
字符串的长度入手,右键弹出菜单搜索当前模块中的名称,找到VbaLenBstr在每个参考设置断点,你会
发现很多处被设为断点(肯定会有很会),并且程序被中断。禁止被中断的当前断点,F9运行,直到程序
窗口重新出现。因为我们的目的是在点注册按钮时让程序中断。
随便输入几个字符,点注册按钮,看看是不是中断了呢?
好,现在我们已处于注册码比较程序中了,你会看到三个函数:
VbaLenBstr
VbaStrMove
VbaStrCat
如果你有一定的编程基础的话,那肯定会明白,对破解有兴趣的都有基本的编程经验吧?!(废话)
寄存器窗口中EAX为机器码,EDX为注册码。
VB 的程序压栈出栈操作非常频繁,所以一定注意函数调用的前后代码!
第一部曲(催眠曲):
00495C86 . FF15 34104000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaLenBstr
00495C8C . 8B3D 94124000 MOV EDI, DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrMove
00495C92 . 8B1D 64104000 MOV EBX, DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrCat
00495C98 . 8945 90 MOV DWORD PTR SS:[EBP-70], EAX
00495C9B . BE 01000000 MOV ESI, 1
00495CA0 > 66:3B75 90 CMP SI, WORD PTR SS:[EBP-70] 产生变码 以下开始
00495CA4 . /0F8F AA000000 JG Unpacked.00495D54
00495CA4 . 0F8F AA000000 JG Unpacked.00495D54
00495CAA . 0FBFD6 MOVSX EDX, SI
00495CAD . 8D4D C8 LEA ECX, DWORD PTR SS:[EBP-38]
00495CB0 . 8D45 A8 LEA EAX, DWORD PTR SS:[EBP-58]
00495CB3 . 51 PUSH ECX
00495CB4 . 52 PUSH EDX
00495CB5 . 8D4D B8 LEA ECX, DWORD PTR SS:[EBP-48]
00495CB8 . 50 PUSH EAX
00495CB9 . 51 PUSH ECX
00495CBA . C745 D0 01000>MOV DWORD PTR SS:[EBP-30], 1
00495CC1 . C745 C8 02000>MOV DWORD PTR SS:[EBP-38], 2
00495CC8 . C745 B0 E0344>MOV DWORD PTR SS:[EBP-50], Unpacke>
00495CCF . C745 A8 08400>MOV DWORD PTR SS:[EBP-58], 4008
00495CD6 . FF15 08114000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.rtcMidCharVar
00495CDC . 8B55 E0 MOV EDX, DWORD PTR SS:[EBP-20]
00495CDF . 8D45 B8 LEA EAX, DWORD PTR SS:[EBP-48]
00495CE2 . 52 PUSH EDX
00495CE3 . 68 00001040 PUSH 40100000
00495CE8 . 6A 00 PUSH 0
00495CEA . 8D4D DC LEA ECX, DWORD PTR SS:[EBP-24]
00495CED . 50 PUSH EAX
00495CEE . 51 PUSH ECX
00495CEF . FF15 C8114000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrVarVal
00495CF5 . 50 PUSH EAX
00495CF6 . FF15 E4124000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.rtcR8ValFromBstr
00495CFC . 83EC 08 SUB ESP, 8
00495CFF . DD1C24 FSTP QWORD PTR SS:[ESP]
00495D02 . FF15 30124000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaPowerR8
00495D08 . 83EC 08 SUB ESP, 8
00495D0B . DD1C24 FSTP QWORD PTR SS:[ESP]
00495D0E . FF15 60114000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrR8
00495D14 . 8BD0 MOV EDX, EAX
00495D16 . 8D4D D8 LEA ECX, DWORD PTR SS:[EBP-28]
00495D19 . FFD7 CALL NEAR EDI
00495D1B . 50 PUSH EAX
00495D1C . FFD3 CALL NEAR EBX
00495D1E . 8BD0 MOV EDX, EAX
00495D20 . 8D4D E0 LEA ECX, DWORD PTR SS:[EBP-20]
00495D23 . FFD7 CALL NEAR EDI
00495D25 . 8D55 D8 LEA EDX, DWORD PTR SS:[EBP-28]
00495D28 . 8D45 DC LEA EAX, DWORD PTR SS:[EBP-24]
00495D2B . 52 PUSH EDX
00495D2C . 50 PUSH EAX
00495D2D . 6A 02 PUSH 2
00495D2F . FF15 24124000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaFreeStrList
00495D35 . 8D4D B8 LEA ECX, DWORD PTR SS:[EBP-48]
00495D38 . 8D55 C8 LEA EDX, DWORD PTR SS:[EBP-38]
00495D3B . 51 PUSH ECX
00495D3C . 52 PUSH EDX
00495D3D . 6A 02 PUSH 2
00495D3F . FF15 3C104000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaFreeVarList
00495D45 . B8 01000000 MOV EAX, 1
00495D4A . 83C4 18 ADD ESP, 18
00495D4D . 03F0 ADD ESI, EAX
00495D4F .^ E9 4CFFFFFF JMP Unpacked.00495CA0
00495D54 > 8D4D A8 LEA ECX, DWORD PTR SS:[EBP-58] 产生变码 结束
-------------------------------------------------------------------此处会生成32位的一个变码
-------------------------------------------------------------------取其左边15个字符就是注册码
00495D57 . 6A 0F PUSH 0F 这么简单??令人怀疑!
00495D59 . 8D55 C8 LEA EDX, DWORD PTR SS:[EBP-38]
00495D5C . 8D45 E0 LEA EAX, DWORD PTR SS:[EBP-20]
00495D5F . 51 PUSH ECX
00495D60 . 52 PUSH EDX
00495D61 . 8945 B0 MOV DWORD PTR SS:[EBP-50], EAX
00495D64 . C745 A8 08400>MOV DWORD PTR SS:[EBP-58], 4008
00495D6B . FF15 88124000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.rtcLeftCharVar
00495D71 . 8D45 C8 LEA EAX, DWORD PTR SS:[EBP-38]
00495D74 . 50 PUSH EAX
00495D75 . FF15 30104000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrVarMove
00495D7B . 8BD0 MOV EDX, EAX 注册码存入EAX中
-------------------------------------------------------------------此处即是取其左边15个字符
填入注册码注册吧,注册成功!?
第二部曲(小夜曲):
退出系统重新运行程序试试,我靠,怎么注册成功后又变成未注册版了。
我怀疑此注册码为作者故意设置的陷阱。
作者肯定还对变码进行了一系列操作,才能得到真正的注册码,我也懒得分析了,VB代码很浪费时间。
条条大路通罗马,此路不通,另走一条。既然是注册码总有保存的地方,对了,注册表,利用REGMON很快锁定
在了\HKEY_CURRENT_USER\Software\VB and VBA Program Settings\XC-Soft\XC-Talk\SN
认真观察就会发现程序在每次启动时验证注册码,刚才填入的注册码已经消失了。
重新载入程序吧,别着急运行,在程序入口处,上方有很多跳转语句,认真观察你会发现RtcSaveSetting
在搜索名称中你是找不到的,(VB的绝大多数程序都是在程序入口处保存很多的函数调用入口),所以不能
急于运行。因为每次启动都会把注册表中的SN清除,所以程序中肯定判断后保存注册码为空,会调用RtcSaveSetting
----别忘了先在注册表中填入15位注册码(第一步注册成功的注册码),如果不填,则根本不会判断!-----
在此代码行上右键弹出菜单中选择查找参考/地址常数,在参考窗口中会找到两个参考
右键弹出菜单中选择在每个命令中设置断点,全部设断。
发现调用了第一个断点:
运行程序F9,程序中断后观察发现明显是一个子程序调用,如下:
00468D60 $ 68 BC234100 PUSH Unpacked.004123BC--------------查找参考/选定命令
00468D65 . 68 445D4100 PUSH Unpacked.00415D44 UNICODE "SN"
00468D6A . 68 F8594100 PUSH Unpacked.004159F8 UNICODE "XC-Talk"
00468D6F . 68 305D4100 PUSH Unpacked.00415D30 UNICODE "XC-Soft"
00468D74 . FF15 08104000 CALL NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.rtcSaveSetting
00468D7A . BA BC234100 MOV EDX, Unpacked.004123BC
00468D7F . B9 DC344A00 MOV ECX, Unpacked.004A34DC
00468D84 .- FF25 14124000 JMP NEAR DWORD PTR DS:[<&MSVBVM60.>; MSVBVM60.__vbaStrCopy
查找调用此子程序的程序段:
查找第一行代码,会发现4处调用了该子程序,全部设置断点。
调试重新运行,中断后往上滚动找到子程序的开始,在此设置断点,禁止其它断点,该子程序即是
验证的关键程序:
00492B50 > 55 PUSH EBP
00492B51 . 8BEC MOV EBP, ESP
00492B53 . 83EC 08 SUB ESP, 8
00492B56 . 68 36404000 PUSH ; SE handler installation
00492B5B . 64:A1 0000000>MOV EAX, DWORD PTR FS:[0]
00492B61 . 50 PUSH EAX
00492B62 . 64:8925 00000>MOV DWORD PTR FS:[0], ESP
00492B69 . 83EC 34 SUB ESP, 34
00492B6C . 53 PUSH EBX
00492B6D . 56 PUSH ESI
00492B6E . 57 PUSH EDI
00492B6F . 8965 F8 MOV DWORD PTR SS:[EBP-8], ESP
00492B72 . C745 FC 78384>MOV DWORD PTR SS:[EBP-4], Unpacked.>
00492B79 . 33C0 XOR EAX, EAX
00492B7B . 8945 EC MOV DWORD PTR SS:[EBP-14], EAX
00492B7E . 8945 E8 MOV DWORD PTR SS:[EBP-18], EAX
00492B81 . E8 DA140000 CALL Unpacked.00494060
-----------------此程序的第一个调用--------------------------------------
一定要跟进去看看:
00494060 $ 5>PUSH EBP |
00494061 . 8>MOV EBP, ESP |
00494063 . 8>SUB ESP, 8 |
00494066 . 6>PUSH |
0049406B . 6>MOV EAX, DWORD PTR FS:[0] |VB子程序的必要设置
00494071 . 5>PUSH EAX |基本格式都相同
00494072 . 6>MOV DWORD PTR FS:[0], ESP |
00494079 . 8>SUB ESP, 2C |
0049407C . 5>PUSH EBX |
0049407D . 5>PUSH ESI |
0049407E . 5>PUSH EDI |
0049407F . 8>MOV DWORD PTR SS:[EBP-8], ESP
00494082 . C>MOV DWORD PTR SS:[EBP-4], Unpacked.0>
00494089 . A>MOV EAX, DWORD PTR DS:[4A34DC]
0049408E . 8>MOV EDI, DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaStrCmp
00494094 . 3>XOR EBX, EBX
00494096 . 5>PUSH EAX
00494097 . 6>PUSH Unpacked.004123BC
0049409C . 8>MOV DWORD PTR SS:[EBP-14], EBX
0049409F . 8>MOV DWORD PTR SS:[EBP-18], EBX
004940A2 . 8>MOV DWORD PTR SS:[EBP-28], EBX
004940A5 . 8>MOV DWORD PTR SS:[EBP-38], EBX
004940A8 . 6>MOV WORD PTR DS:[4A31B0], BX
004940AF . F>CALL NEAR EDI <&MSVBVM60.__vbaStrCmp>
004940B1 . 8>TEST EAX, EAX
004940B3 . 0>JE Unpacked.00494158----------------如果不填注册码,这里就跳走了
004940B9 . 8>MOV ECX, DWORD PTR DS:[4A34DC]
004940BF . 5>PUSH ECX
004940C0 . F>CALL NEAR DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaLenBstr
004940C6 . 8>CMP EAX, 14 注册码必须为20位,否则跳走
004940C9 . /0>JNZ Unpacked.00494158 还填原注册码后5位可以随便
004940CF . 6>PUSH 2869718D
004940D4 . F>CALL NEAR DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaStrI4
004940DA . 8>MOV ESI, DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaStrMove
004940E0 . 8>MOV EDX, EAX
004940E2 . B>MOV ECX, Unpacked.004A319C 常数串存入 4a319cUnpac
004940E7 . F>CALL NEAR ESI <&MSVBVM60.__vbaStrMove>
004940E9 . 8>LEA EDX, DWORD PTR SS:[EBP-38]
004940EC . 6>PUSH 8
004940EE . 8>LEA EAX, DWORD PTR SS:[EBP-28]
004940F1 . 5>PUSH EDX
004940F2 . 5>PUSH EAX
004940F3 . C>MOV DWORD PTR SS:[EBP-30], Unpacked.>;
004940FA . C>MOV DWORD PTR SS:[EBP-38], 4008
00494101 . F>CALL NEAR DWORD PTR DS:[<&MSVBVM60.#6>; MSVBVM60.rtcLeftCharVar
00494107 . 8>LEA ECX, DWORD PTR SS:[EBP-28]
0049410A . 5>PUSH ECX
0049410B . F>CALL NEAR DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaStrVarMove
00494111 . 8>MOV EDX, EAX 取注册码左边8个字符
00494113 . 8>LEA ECX, DWORD PTR SS:[EBP-14]
00494116 . F>CALL NEAR ESI
00494118 . 8>LEA ECX, DWORD PTR SS:[EBP-28]
0049411B . F>CALL NEAR DWORD PTR DS:[<&MSVBVM60.__>; MSVBVM60.__vbaFreeVar
00494121 . 8>MOV EDX, DWORD PTR SS:[EBP-14]
00494124 . 5>PUSH EDX 左8个字符入栈
00494125 . E>CALL Unpacked.004944E0----------------运行到此会有异常调用,继续单步执行
0049412A . 8>MOV EDX, EAX
经过一系列变换后在EAX得到一个8位的字符串,用它替换原来注册码的前8位,在注册窗口中注册,
心急的已经在注册,我倒,怎么还不行??
别急,在注册表中填好注册码,退出重新运行(不是最小化)看看是不是OK了。
在注册窗口中为什么不能注册,我也不知道,可能是作者的第二支催眠曲吧,不管他。
第三部曲(交响曲):
运行30分钟后跳出一窗口说未注册版,系统会自动关闭,重启又变成未注册,注册表中的注册已经清除
看来有暗桩,那就拔掉它,开工:
判断是否正确只要双击下断后观察是否中断即可,因为程序肯定每分每秒
都在取时间,肯定会有定时器。
搜索所有常数30没找到断点,又搜索1800只找到了5个,按顺序下断,第一个就是了,为什么是1800
30*60=1800.
如下所示:
00456A56 CMP EAX, 708 是否到30分
00456A5B JLE Unpacked.00456B25 小于等于30跳走
00456A61 CMP EAX, 0E10 大于等于1小时跳走
00456A66 JGE Unpacked.00456B25
--------------中间是一大段的强制退出程序------
00456B25 CMP DWORD PTR DS:[EDI+40], 1518 1个半小时
00456B2C JLE Unpacked.00456BED
--------------又是一大段的强制退出程序--------
00456BED MOV EAX, DWORD PTR DS:[4A3104]'正常的程序入口
直接修改源代码即可拔掉暗桩:
采用直接跳到正常入口
00456A56 JMP Unpacked.00456BED
收工了!
谁有英语八哥的验证文件,请给我一个好吗?好东西大家分享嘛!E_Mail:cy_mu2003@tom.com
三部曲结束,好辛苦!写破文比动手破还难呀。
第一篇文章,文笔不够好,大家凑合看吧!