• 标 题:Periodic Table SE v3.55 (6千字)
  • 作 者:  WksWlj
  • 时 间:2002-7-7 9:34:06
  • 链 接:http://bbs.pediy.com

Periodic Table SE v3.55 (元素周期表3.55)破解手记

Cracked by  WksWlj999@sohu.com

软件说明:
    目前市场上最好的电子元素周期表(是作者主页上讲的@_#),功能多多,你想知道的有关某个元素的信息都可以在上面找到。更多说明参见其主页http://www.smisoftware.com/。
    本人刚刚涉足加密与解密,水平有限,文中有不足之处还望各位大虾不吝指教!此文仅供初学者参考。

**************************************************
目    的:去除NAG和使用次数限制
下载地址:http://www.smisoftware.com/ftplib/ptab32.zip
破解工具:TRW2000 v1.23 For Win9X;RegMon
日    期:2002年7月6日
***************************************************

该程序有30天或60次试用限制,用RegMon检测注册表发现此软件在HKEY_CLASS_ROOT\PT350KeyInfo\下设有以下几个主键:
    SmiBuildLevel    ==>默认值为已使用的次数
    SmiGoData    ==>默认值为程序安装时的日期数据
当试用日期及次数全部过了时,你如果在NAG上点"Agree",程序会弹出"Order Form"窗口请你订购,点"Cancel"后程序出现个对话框告诉你"你获得了额外的15天或15次的试用期";并建立3个主键:
    SmiRunData    ==>默认值为0    (表示在额外试用期)
    SmiRunLevel    ==>默认值为1    (表示在第一次额外试用期)
    SmiRunType    ==>默认值为可试用的总天数
当这个期限也过了时,次序又会弹出"Order Form"窗口请你订购,点"Cancel"后程序再次告诉你"你获得了额外的15天或15次的试用期",此时:        SmiRunData    ==>默认值为0    (表示在额外试用期)
    SmiRunLevel    ==>默认值为2    (表示在第二次额外试用期)
    SmiRunType    ==>默认值为可试用的总天数
又过期后程序提醒你"我们已经给了你2次额外的试用期"然后,弹出"Order Form"窗口请你汇款订购,然后退出。此时:
    SmiRunData    ==>默认值为1    (表示两次额外试用期均过了)
    SmiRunLevel    ==>默认值为2    
    SmiRunType    ==>默认值为可试用的总天数

破解思路:跳过NAG窗口,并阻止程序改动注册表的SmiBuildLevel主键默认键值。

好了,用TRW2000加载主程序ptoe.exe,停在入口处,用F10大块跟踪......

017F:0044BD36 50              PUSH    EAX
017F:0044BD37 FF759C          PUSH    DWORD [EBP-64]
017F:0044BD3A 56              PUSH    ESI
017F:0044BD3B 56              PUSH    ESI
017F:0044BD3C FF15C4834800    CALL    `KERNEL32!GetModuleHandleA`
017F:0044BD42 50              PUSH    EAX
017F:0044BD43 E8BFF10000      CALL    0045AF07    <==跳过就出现NAG窗口,F8跟进
017F:0044BD48 8945A0          MOV      [EBP-60],EAX
017F:0044BD4B 50              PUSH    EAX
017F:0044BD4C E81A150000      CALL    0044D26B
017F:0044BD51 8B45EC          MOV      EAX,[EBP-14]
017F:0044BD54 8B08            MOV      ECX,[EAX]

来到这里...

017F:0045AF07 FF742410        PUSH    DWORD [ESP+10]
017F:0045AF0B FF742410        PUSH    DWORD [ESP+10]
017F:0045AF0F FF742410        PUSH    DWORD [ESP+10]
017F:0045AF13 FF742410        PUSH    DWORD [ESP+10]
017F:0045AF17 E8A2A60000      CALL    004655BE    <==跳过就出现NAG窗口,F8跟进
017F:0045AF07 FF742410        PUSH    DWORD [ESP+10]
017F:0045AF0B FF742410        PUSH    DWORD [ESP+10]
017F:0045AF0F FF742410        PUSH    DWORD [ESP+10]
017F:0045AF13 FF742410        PUSH    DWORD [ESP+10]
017F:0045AF17 E8A2A60000      CALL    004655BE
017F:0045AF1C C21000          RET      10

来到这里,用F10继续跟...

017F:004655BE 53              PUSH    EBX
017F:004655BF 56              PUSH    ESI
017F:004655C0 57              PUSH    EDI
017F:004655C1 83CBFF          OR      EBX,BYTE -01
017F:004655C4 E818ECFFFF      CALL    004641E1
......

017F:00435D79 8B17            MOV      EDX,[EDI]
017F:00435D7B 8BCF            MOV      ECX,EDI
017F:00435D7D 889C24E0040000  MOV      [ESP+04E0],BL
017F:00435D84 FF92B8000000    CALL    NEAR [EDX+B8]    <==跟到这里,跳过就出现NAG窗口
017F:00435D8A 85FF            TEST    EDI,EDI
017F:00435D8C 8BE8            MOV      EBP,EAX
017F:00435D8E 7409            JZ      00435D99
017F:00435D90 8B07            MOV      EAX,[EDI]
017F:00435D92 6A01            PUSH    BYTE +01
017F:00435D94 8BCF            MOV      ECX,EDI
017F:00435D96 FF5004          CALL    NEAR [EAX+04]
017F:00435D99 83FD02          CMP      EBP,BYTE +02    <==比较是否按了"Quit"按钮
017F:00435D9C 754E            JNZ      00435DEC      <==不是"Quit",跳到运行主程序处;否则不跳,就over了
017F:00435D9E 8D4C241C        LEA      ECX,[ESP+1C]
017F:00435DA2 C68424E004000008 MOV      BYTE [ESP+04E0],08
017F:00435DAA E8ADC30200      CALL    0046215C

因此,把00435D84的Call去掉,直接跳到00435DEC运行主程序处即可跳过NAG窗口。
分析发现,NAG出现后按"Agree"后程序才会改动SmiBuildLevel主键,使其值加1,于是按"Agree"之前下断点BPX RegSetValuea,按下"Agree"后TRW2000中断,往上看会发现00413846处是关键:

017F:0041381B 51              PUSH    ECX
017F:0041381C 52              PUSH    EDX
017F:0041381D 6814384A00      PUSH    DWORD 004A3814    <==[4A3814]="SmiBuildLevel"
017F:00413822 50              PUSH    EAX
017F:00413823 C744241480000000 MOV      DWORD [ESP+14],80
017F:0041382B FF150C804800    CALL    `ADVAPI32!RegQueryValueA`    <==取SmiBuildLevel的值
017F:00413831 85C0            TEST    EAX,EAX
017F:00413833 754B            JNZ      00413880
017F:00413835 8D4C2408        LEA      ECX,[ESP+08]
017F:00413839 57              PUSH    EDI
017F:0041383A 51              PUSH    ECX
017F:0041383B E839630300      CALL    00449B79
017F:00413840 8D542410        LEA      EDX,[ESP+10]
017F:00413844 6A0A            PUSH    BYTE +0A
017F:00413846 40              INC      EAX    <==就是这里把使用次数加1
017F:00413847 52              PUSH    EDX
017F:00413848 50              PUSH    EAX
017F:00413849 C744241880000000 MOV      DWORD [ESP+18],80
017F:00413851 E877A20300      CALL    0044DACD
017F:00413856 8D7C241C        LEA      EDI,[ESP+1C]
017F:0041385A 83C9FF          OR      ECX,BYTE -01
017F:0041385D 33C0            XOR      EAX,EAX
017F:0041385F 83C410          ADD      ESP,BYTE +10
017F:00413862 F2AE            REPNE SCASB
017F:00413864 F7D1            NOT      ECX
017F:00413866 49              DEC      ECX
017F:00413867 8D44240C        LEA      EAX,[ESP+0C]
017F:0041386B 51              PUSH    ECX
017F:0041386C 8B4C2408        MOV      ECX,[ESP+08]
017F:00413870 50              PUSH    EAX
017F:00413871 6A01            PUSH    BYTE +01
017F:00413873 6814384A00      PUSH    DWORD 004A3814
017F:00413878 51              PUSH    ECX
017F:00413879 FF1508804800    CALL    `ADVAPI32!RegSetValueA`    <==断在这里,把加过1的次数写回注册表
017F:0041387F 5F              POP      EDI
017F:00413880 8B542400        MOV      EDX,[ESP+00]
017F:00413884 52              PUSH    EDX
017F:00413885 FF1504804800    CALL    `ADVAPI32!RegCloseKey`
017F:0041388B 81C488000000    ADD      ESP,88
017F:00413891 C3              RET

继续F12加F10若干次后发现回到了00435D8A处,可见NAG的产生和把加过1的次数写回注册表的程序代码都在
017F:00435D84 FF92B8000000    CALL    NEAR [EDX+B8]这个Call里,因此只要把这里改为jmp 00435DEC直接跳到主程序运行处,即可一举两得,破除NAG和次数限制。下命令bpx 435D84,重新运行程序,中断在017F:00435D84处,下命令A EIP,输入下列代码
jmp 00435DEC
nop
记下更改前后机器码变化,F5运行,不再有NAG出现,查看SmiBuildLevel键值,亦保持不变。
用16进制编辑器打开ptoe.exe查找"FF92B800000085EF"改为"E9630000009085EF"就OK了。