记事本xp v2.3破解--我和P-code的第一次

日期:2003年9月12日 作者:newlaos[CCG][DFCG] 人气: 321

软件名称:记事本xp v2.3
文件大小:475KB
软件授权:共享软件
使用平台:Win9x/Me/NT/2000/XP
发布公司: http://www.yaguo.com/~qswb2002 
软件简介:一个增强型的记事本软件。破它只是因为它是P-code的,想着软件小应该很简单。
加密方式:注册码
功能限制:未注册信息提示
PJ工具:WKT-VBDebuger1.4,FI2.5,pe-scan3.31
PJ日期:2003-04-13
作者newlaos申明:只是学习,请不用于商业用途或是将本文方法制作的注册机任意传播,造成后果,本人一概不负。

1、先用FI2.5看一下主文件“notepad.exe”,加ASPACK2.11壳。手动或是用pe-scan3.31脱壳,很快搞定生成文件unpack.exe

2、用WKT-VBDebuger1.4对unpack.exe进行跟踪调试,程序载入运行后,点出注册对话框。输入假码: 78787878,先不要按“确定”,返回WKT-VBDebuger1.4,点击“On Execution”或是CTRL+E,下断点40821D,这时再回到unpack.exe,按“确定”,很多被WKT-VBDebuger1.4断下,来到下列代码段:

.......
.......
004081F0: 4B OnErrorGoto 00408295h
004081F3: 27 LitVar_Missing 0064F5FCh
004081F6: 27 LitVar_Missing 0064F61Ch
004081F9: 27 LitVar_Missing 0064F63Ch
004081FC: 27 LitVar_Missing 0064F65Ch
004081FF: 04 FLdRfVar 0064F6BCh
00408202: 3A LitVarStr '软件注册'
00408207: 4E FStVarCopyObj 0064F67Ch
0040820A: 04 FLdRfVar 0064F67Ch
0040820D: 3A LitVarStr ' 要注册本产品,请先告诉作者您的E-Mail及计算机用户名(可通过查看开始菜单上的注销****看到您的用户名),作者会在收到您的注册费后24小时内告诉您注册码,然后您再在以下输入框中输入注册码! '
00408212: 4E FStVarCopyObj 0064F69Ch
00408215: 04 FLdRfVar 0064F69Ch
00408218: 0B ImpAdCallI2 rtcInputBox on address 660E21C1h0 <===程序停在这,等待接收输入的注册码
0040821D: 23 FStStrNoPop 0064F5F8h <===放了一个地址指针(42a5e0)78787878宽字符形式
00408220: 08 FLdPr <===520928
00408223: FD Lead2/MemStStrCopy
00408227: 2F FFree1Str <===42B216<===释放了6处内存空间
0040822A: 36 FFreeVar -> 6
00408239: 04 FLdRfVar 0064F5F6h
0040823C: 08 FLdPr <===520928
0040823F: 06 MemLdRfVar
00408242: 10 ThisVCallHresult 00407AB4->00407A40 <===关键的CALL,F8跟进(程序段也出来了)
00408247: 6B FLdI2
0040824A: 1C BranchF 00408264 <===如果是F就跳走,如果输入的注册码的中有"雪影无痕",则这里就不跳了?br> 0040824D: 08 FLdPr
00408250: 8A MemLdStr
00408253: 1B LitStr: 'regnumber'
00408256: 1B LitStr: 'regist'
00408259: 1B LitStr: 'notepad'
0040825C: 0A ImpAdCallFPR4 rtcSaveSetting on address 660F8762h <===这里保存设置的CALL
00408261: 1E Branch 00408295 <===信息保存完后跳走。?br> 00408264: 27 LitVar_Missing 0064F63Ch <===如果注册码就正确则跳到这里,也就是OVER了




------F8跟进来到下面代码段----------------
00407A40: F4 LitI2_Byte: -> 1h 1
00407A42: 08 FLdPr 520928h
00407A45: 06 MemLdRfVar
00407A48: 80 ILdI4 -> 430BACh 4393900 <===(430BAC位置上是宽字符的78787878)
00407A4B: 4A FnLenStr 430BA8h, 8 chars <===检测注册码字符串长度
00407A4C: E4 CI2I4 <===将integer类型转为word?
00407A4D: FE Lead3/ForI2: <===是不是说的循环结构,然后以NextI2结尾的
00407A53: 28 LitVarI2 0064F524h 4h , 4
00407A58: 08 FLdPr 520928h
00407A5B: 89 MemLdI2
00407A5E: E7 CI4UI1 <===这也是数据类型的轮换
00407A5F: 6C ILdRf 0052097Ch <===位置是一个指针,指向430BAC位置上是宽字符的78787878
00407A62: 4D CVarRef:
00407A67: 04 FLdRfVar 0064F514h
00407A6A: 0A ImpAdCallFPR4 rtcMidCharVar on address 660EA557h
00407A6F: 04 FLdRfVar 0064F514h
00407A72: 3A LitVarStr '雪影无痕'
00407A77: 5D HardType <===这是什么硬件类型?在64F504上的值是8008
00407A78: 33 EqVarBool <===要相等? 就填上"雪影无痕",进行注册,呵呵通过。再没有未注册提示!
00407A7A: 36 FFreeVar -> 2 <===释放了两个内存位置上的值64F524h和64F514h(分别对应的值是02,08)
00407A81: 1C BranchF 00407AA0 <===这里不相等就意味着一跳走就OVER了?br> 00407A84: F4 LitI2_Byte: -> FFh 255
00407A86: 70 FStI2 0064F55A ->ffffffffh -1 <===在0064F55A位置上放上两个FF
00407A89: F4 LitI2_Byte: -> 0h 0
00407A8B: 21 FLdPrThis 00520928h
00407A8C: 0F VCallAd Frmmain.regist 40EF24h <===这里才是真正的算法CALL?F8跟进
00407A8F: 19 FStAdFunc
00407A92: 08 FLdPr
00407A95: 0D VCallHresult put__ipropVISIBLEMENU <===使注册菜单不可见的CALL,也就是说已经注册
407A9A: 1a FFree1Ad local_00F0
407A9D: 1e Branch: 407aab <===我跳走,就不再循环了
407AA0: 08 FLdPr local_param_0008 <===如果不相等,就从上面跳到这里
407AA3: 06 MemLdRfVar local_param_0058
407AA6: 64 NextI2: (continue) 407A53 <===到这里是一整个循环结构

3、有点地方,我还不是很明白,还请高手指点!

Contributors: FHL