记事本xp
v2.3破解--我和P-code的第一次
作者:newlaos[CCG][DFCG]
软件名称:记事本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就跳走,如果输入的注册码的中有"雪影无痕",则这里就不跳了?
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 <===信息保存完后跳走。?
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了?
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、有点地方,我还不是很明白,还请高手指点!