• 标 题:狂猫日记之三部曲 (13千字)
  • 作 者:mu2003
  • 时 间:2003-10-12 13:19:50
  • 链 接:http://bbs.pediy.com


【软件简介】:  用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     EDIDWORD PTR DS:[<&MSVBVM60.>;  MSVBVM60.__vbaStrMove
00495C92   .  8B1D 64104000 MOV     EBXDWORD 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     SIWORD PTR SS:[EBP-70]         产生变码 以下开始
00495CA4   . /0F8F AA000000 JG      Unpacked.00495D54
00495CA4   .  0F8F AA000000 JG      Unpacked.00495D54
00495CAA   .  0FBFD6        MOVSX   EDXSI
00495CAD   .  8D4D C8       LEA     ECXDWORD PTR SS:[EBP-38]
00495CB0   .  8D45 A8       LEA     EAXDWORD PTR SS:[EBP-58]
00495CB3   .  51            PUSH    ECX
00495CB4   .  52            PUSH    EDX
00495CB5   .  8D4D B8       LEA     ECXDWORD 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     EDXDWORD PTR SS:[EBP-20]
00495CDF   .  8D45 B8       LEA     EAXDWORD PTR SS:[EBP-48]
00495CE2   .  52            PUSH    EDX
00495CE3   .  68 00001040   PUSH    40100000
00495CE8   .  6A 00         PUSH    0
00495CEA   .  8D4D DC       LEA     ECXDWORD 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     EDXEAX
00495D16   .  8D4D D8       LEA     ECXDWORD PTR SS:[EBP-28]
00495D19   .  FFD7          CALL    NEAR EDI
00495D1B   .  50            PUSH    EAX
00495D1C   .  FFD3          CALL    NEAR EBX
00495D1E   .  8BD0          MOV     EDXEAX
00495D20   .  8D4D E0       LEA     ECXDWORD PTR SS:[EBP-20]
00495D23   .  FFD7          CALL    NEAR EDI
00495D25   .  8D55 D8       LEA     EDXDWORD PTR SS:[EBP-28]
00495D28   .  8D45 DC       LEA     EAXDWORD 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     ECXDWORD PTR SS:[EBP-48]
00495D38   .  8D55 C8       LEA     EDXDWORD 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     ESIEAX
00495D4F   .^ E9 4CFFFFFF   JMP     Unpacked.00495CA0
00495D54   >  8D4D A8       LEA     ECXDWORD PTR SS:[EBP-58]     产生变码 结束
-------------------------------------------------------------------此处会生成32位的一个变码
-------------------------------------------------------------------取其左边15个字符就是注册码
00495D57   .  6A 0F         PUSH    0F                             这么简单??令人怀疑!
00495D59   .  8D55 C8       LEA     EDXDWORD PTR SS:[EBP-38]
00495D5C   .  8D45 E0       LEA     EAXDWORD 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     EAXDWORD PTR SS:[EBP-38]
00495D74   .  50            PUSH    EAX
00495D75   .  FF15 30104000 CALL    NEAR DWORD PTR DS:[<&MSVBVM60.>;  MSVBVM60.__vbaStrVarMove
00495D7B   .  8BD0          MOV     EDXEAX            注册码存入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     EBPESP
00492B53   .  83EC 08       SUB     ESP, 8
00492B56   .  68 36404000   PUSH    ;  SE handler installation
00492B5B   .  64:A1 0000000>MOV     EAXDWORD 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     EAXEAX
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     EBPESP |
00494063   .  8>SUB     ESP, 8 |
00494066   .  6>PUSH     |
0049406B   .  6>MOV     EAXDWORD 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     EAXDWORD PTR DS:[4A34DC]
0049408E   .  8>MOV     EDIDWORD PTR DS:[<&MSVBVM60.__>;  MSVBVM60.__vbaStrCmp
00494094   .  3>XOR     EBXEBX
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    EAXEAX
004940B3   .  0>JE      Unpacked.00494158----------------如果不填注册码,这里就跳走了
004940B9   .  8>MOV     ECXDWORD 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     ESIDWORD PTR DS:[<&MSVBVM60.__>;  MSVBVM60.__vbaStrMove
004940E0   .  8>MOV     EDXEAX
004940E2   .  B>MOV     ECX, Unpacked.004A319C             常数串存入 4a319cUnpac
004940E7   .  F>CALL    NEAR ESI                           <&MSVBVM60.__vbaStrMove>
004940E9   .  8>LEA     EDXDWORD PTR SS:[EBP-38]
004940EC   .  6>PUSH    8
004940EE   .  8>LEA     EAXDWORD 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     ECXDWORD PTR SS:[EBP-28]
0049410A   .  5>PUSH    ECX
0049410B   .  F>CALL    NEAR DWORD PTR DS:[<&MSVBVM60.__>;  MSVBVM60.__vbaStrVarMove
00494111   .  8>MOV     EDXEAX                           取注册码左边8个字符
00494113   .  8>LEA     ECXDWORD PTR SS:[EBP-14]         
00494116   .  F>CALL    NEAR ESI
00494118   .  8>LEA     ECXDWORD PTR SS:[EBP-28]
0049411B   .  F>CALL    NEAR DWORD PTR DS:[<&MSVBVM60.__>;  MSVBVM60.__vbaFreeVar
00494121   .  8>MOV     EDXDWORD PTR SS:[EBP-14]
00494124   .  5>PUSH    EDX                                左8个字符入栈 
00494125   .  E>CALL    Unpacked.004944E0----------------运行到此会有异常调用,继续单步执行
0049412A   .  8>MOV     EDXEAX
经过一系列变换后在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     EAXDWORD PTR DS:[4A3104]'正常的程序入口

直接修改源代码即可拔掉暗桩:
采用直接跳到正常入口
00456A56   JMP Unpacked.00456BED
收工了!
谁有英语八哥的验证文件,请给我一个好吗?好东西大家分享嘛!E_Mail:cy_mu2003@tom.com
三部曲结束,好辛苦!写破文比动手破还难呀。
第一篇文章,文笔不够好,大家凑合看吧!