吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3246|回复: 4
收起左侧

[会员申请] 申请会员ID:囚童【申请通过】

[复制链接]
吾爱游客  发表于 2024-12-28 10:56
1、申 请 I D:囚童
2、个人邮箱:1298174881@QQ.com
3、原创技术文章,来自看雪论坛精华(计10篇):


标 题:Turbo Note+ 破解手记 (4千字)_ 来自看雪论坛精华3
发信人:囚童
时 间:2001-5-13 17:22:27
详细信息:
解除Turbo Note+ 时间限制
课题:    解除Turbo Note+ V4.4时间限制
工具:    TRW 2000
    TYP
    Ultra Editer 32
下载:http://turbopress.com/tnplus44.exe

关键字:    破解 解压缩

TurboNote+是一个方便的"即时帖"软件,可以工作在Win95/98, WinNT 和 Win2000环境下.它可以即时在自己或通过IP地址向其他人的屏幕上贴上一个可定义尺寸和颜色的"留言条",也可以按预定的时间启动备忘提示功能.
通过"留言条",可以方便地启动可执行程序、互联网址、E-mail地址,也可以把它们作为附件发送给指定的IP地址.它可以隐藏,也可以再现,甚至关机后信息也不会丢失.使用十分方便.

TurboNote V4.4是有30天的时间限制.过期后会随时出现延时的注册窗口,程序仍能使用.

TurboNote+是一个被压缩了的可执行软件,用一般的方法无法修改.

以下是破解其时间限制的方法:

先在DOS环境下键入:C:>MYPATH\TYP TBNOTE.EXE

屏幕出现对运行环境和文件的分析结果,观察最后一行,TurboNote+的压缩外壳是SHRINKER V3.3.

解压缩(脱壳):

启动TRW2000,点击OK使其最小化.右击TRW图标,选择TRnewTCB(截获新线程).

双击TurboNote+图标,TurboNote+被TRW截获.

下指令:BPX GETModuleFileNameA,按F5,TurboNote+再次被TRW截获.

按F12、F10各一次,程序回到TurboNote+域:


0167:0049944B        JMP    SHORT 00499450    ;光标停在这里                              
0167:0049944D        MOV    ESI,[EBP+08]                        
0167:00499450        CALL    00498000                          
0167:00499455        PUSH     DWORD [EBP+10]                           
0167:00499458        PUSH     DWORD [EBP+0C]                           
0167:0049945B        PUSH    ESI                                
0167:0049945C        CALL    00499467    ;追到这里,按F8追进去

按F10追到CS:49945C,按F8追进去,再按F10一直追到:

0167:004994BF        CMP    WORD [00496E84],BYTE +00
0167:004994C6        JZ    004994E7
0167:004994C8        MOV    EAX,[00496E84]
0167:004994CD        ADD    EAX,[00496F98]
0167:004994D3        MOV    [EBP-20],EAX
0167:004994D6        PUSH     WORD [EBP+10]
0167:004994D9        PUSH     WORD [EBP+0C]
0167:004994DC        PUSH    WORD [EBP+08]
0167:004994DF        CALL     NEAR [EBP-20] ;追到这里,按F8追进去
0167:004994E2        MOV    [EBP-1C],EAX
0167:004994E5        JMP     SHORT 004994EE

追到CS:4994DF,按F8追进去:

XXXX:XXXXXXXX    BD    ??
XXXX:0045B8F3    BD    ??
XXXX:XXXXXXXX    BD    ??
.......

当前代码页不可见.但光标停留在地址CS:0045B8F3,这是解压缩后的程序入口.

下指令:    MAKEPE

TRW在当前目录下生成被还原了的程序.程序名为NEWPE.EXE.

按F5,TRW退出,回到WINDOWS环境下.在屏幕右下脚生成一个TurboNote+图标.

右击TurboNote+图标,出现TurboNote+主菜单,点击"Exit",退出.

在资源管理器中双击NEWPE.EXE,在屏幕右下脚生成一个TurboNote+图标.

点击该图标,可运行且功能齐全,解压缩成功.

破解时间限制:

按Ctrl+N,进入TRW环境.

下指令:    BPX GetLocalTime

按F5,TRW退出,回到WINDOWS环境下.

右击TurboNote+图标,TurboNote+被TRW截获.

按F12、F10各一次,程序回到TurboNote+域:

0167:0040BD3B      CALL    KERNEL32!GetLocalTime
0167:0040BD41      MOV    CL,[ESP+06];          光标停在这里
0167:0040BD45      MOV    DL,[ESP+02]
0167:0040BD49      MOV    AX,[ESP+00]
0167:0040BD4E      MOV    [ESP+90],CL
0167:0040BD55      MOV    CX,[ESP+08]
0167:0040BD5A      MOV    [ESP+91],DL
0167:0040BD61      MOV    DX,[ESP+0A]
0167:0040BD66      MOV    [ESP+92],AX
0167:0040BD6E      MOV    AX,[ESP+0C]
0167:0040BD73      MOV    [ESP+94],CX
0167:0040BD7B      MOV    CL,[00477178]
0167:0040BD81      MOV    [ESP+96],DX
0167:0040BD89      MOV    DL,[00477179]
0167:0040BD8F      MOV    [ESP+98],AX
0167:0040BD97      MOV    AX,[0047717A]
0167:0040BD9D      MOV    [ESP+10],CL
0167:0040BDA1      MOV    CX,[0047717C]
0167:0040BDA8      MOV    [ESP+11],DL
0167:0040BDAC      MOV    DX,[0047717E]
0167:0040BDB3      MOV    [ESP+12],AX
0167:0040BDB8      MOV    AX,[00477180]
0167:0040BDBE      MOV    [ESP+14],CX
0167:0040BDC3      PUSH    BYTE +01
0167:0040BDC5      LEA    ECX,[ESP+14]
0167:0040BDC9      MOV    [ESP+1A],DX
0167:0040BDCE      MOV    [ESP+1C],AX
0167:0040BDD3      CALL    0042D040
0167:0040BDD8      LEA    ECX,[ESP+10]  ;TurboNote+安装日期
0167:0040BDDC      PUSH    ECX
0167:0040BDDD      LEA    ECX,[ESP+94]    ;当前日期
0167:0040BDE4      CALL    0042D220    ;分析比较
0167:0040BDE9      TEST    EAX,EAX
0167:0040BDEB      JNZ    NEAR 40BEDE    ;EAX≠0,成功跳转
0167:0040BDf1                ;EAX=0,向下打出延时的注册窗口

向下看0040BDD8处的两句,[ESP+10]是TurboNote+安装日期,[ESP+94]是当前日期,在下面的子调用中进行比较,
根据比较结果决定是否调用延时的注册窗口.

若始终用同一个日期,例如TurboNote+安装日期,进行比较,则比较的结果就一定是真,将不再显示延时的注册窗
口.

下指令:    code on

抄下0040BDDD处的代码:

8D 8C 24 94 00 00 00
-- -- -- 10 -- -- --

用Ultra Editer 32按上面显示的方法修改TurboNote+,--意为保留.

存盘。

如果能找到SHRINKER V3.3(谁有呢?),还可以将修改过的TurboNote+重新处理成压缩形态.。

此帖在看雪论坛上的地址Turbo Note+ V4.4(注:这个地址标注中没有作者,但看雪精华合集里标注的“作者”为:囚童,请见截图:)

[size=1.75]修改指针法破解VB程序-Fast PC Linker-III (8千字)_ 来自看雪论坛精华3
发布者:Editor发布于:2001-06-29 21:31

修改指针法破解VB程序
Fast PC Linker-III

作者: 囚童
课题: 解除Fast PC Linker-III传送量限制,清NAG
背景: VB3.0编程
下载:   
工具: TRW2000
   Ultra Edit 32
   FC

Fast PC Linker-III支持基于不同平台(Windows 3.1, 95, 98 和 NT4 WorkStation)的两台PC
之间通过串并口进行高速文件传送.支持全目录和全盘复制.支持长文件名.也支持网络设备及
光驱.Fast PC Linker-III具有自动搜索和优化配置I/O口的功能,又十分小巧,一张软盘就可以
带走.对于那些没有光驱的老式机器和笔记本机,想安装运行大一点的程序有了它可就方便多了.
特别在它之前,由于NT不支持直接电缆连接,从办公室向家里传送MP3之类的大文件,要是其中一
台机不能上网,那可就惨了.有了Fast PC Linker-III,找一台笔记本机,在打印电缆上装一个转
换接头(有关转换接头另文介绍),两下搞定.

Fast PC Linker-III试用版采用传送量限制,试用完规定的传送量(大约25x300MB),程序就停止
工作.倘若正在传送一个大硬盘,刚传了一半就死翘翘,确实让人恼火.

由于必须支持Windows 3.1,Fast PC Linker-III选择VB3.0编程.大家知道,VB程序的特点是既难
跟又难改,这就给破解带来相当的难度.


下面给出用修改指针法破解VB程序的例子,供参考.

将C:\WINDOWS\WIN.INI以1.INI为名做一个备份.
安装Fast PC Linker-III,将安装后的WIN.INI以2.INI为名再做一个备份.
在C:\WINDOWS\COMMAND目录下找到fc.exe,在DOS提示符下键入:

fc 1.ini 2.ini > comp.txt

fc将对安装前后的两个ini文件进行比较,并把比较结果存入comp.txt中.
打开comp.txt,可以看到:

Comparing files 1.INI and 2.ini
****** 1.INI


****** 2.ini

[Disk Safety Info]   ┐
Protection FL3= 25    > FastPCL安装后向WIN.INI中加入的两行
            ┘
******

新加入的两行即试用版赋予用户的初始传送量,其最大值为25节,每节大约300MB.当这一数值用
尽时,即使重新安装,也不能恢复.


启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.右击这个图标,选TRmewTCB.

双击Fast PC Linker-III图标,TRW截获这一新线程.

WIN.INI是WINDOWS启动时调入内存常驻的.
下指令:    S 30:0 LFFFFFFFF 3D 32 35    ;=25
TRW给出:  9B0B6

下指令:    BPM 30:9B0B6+1 R
按F5,程序被TRW截获.
下指令:    BD*  ;清中断.

按F5数次,程序来到:

014F:5A96 CLD   
014F:5A97 PUSH DS
014F:5A98 PUSH ES
014F:5A99 POP  DS
014F:5A9A MOV  SI,DI
014F:5A9C LES  DI,[BP+06]
014F:5A9F MOV  AX,CX
014F:5AA1 REP     MOVSB      ;光标停在这里
014F:5AA3 MOV  BYTE [ES:DI],00
014F:5AA7 POP  DS

下指令:    D DS:SI-1
TRW给出:
00CF:25D7 32 35 0D 0A 0D 0A 0D 0A-0D 0A 00 00 00 00 00 00 25..............

此时若连续下指令: BPM ES:DI-1,通过88C0、96E5可以跟踪这个"25"一直来到:

1B2F:0B43 LODSB
1B2F:0B44 CMP BYTE [0FB9],00 ;光标停在这里
1B2F:0B49 JZ  0B5B
1B2F:0B4B CMP AL,20
1B2F:0B4D JZ  0B3D
1B2F:0B4F CMP AL,09
1B2F:0B51 JZ  0B3D

下指令:    D DS:SI-1
TRW给出:
0F1F:779A 32 35 00 FF 9C 00 C0 77-A8 91 47 35 04 00 2A 00 25.?wG5..*.

如果有耐心继续跟踪,将会发现程序将ASCII码"25"转换为16进制码H19后,又将16进制码转换为
80Bit的浮点数,自76A2送入浮点系统进行繁杂的浮点运算,然后来到:

372F:0F67 SUB  SP,BYTE +02
372F:0F6A MOV  BX,SP
372F:0F6C NOP   
372F:0F6D FISTP WORD [SS:BX]    ;关键!
372F:0F70 INT  3D
372F:0F72 LODSW
372F:0F74 JMP  AX

利用F6D处的指令FISTP,将预放在浮点堆栈内的80Bit运算结果,恢复成16进制码H19压入当前堆
栈内.接着通过F74处的跳转指令,来到:

3DC7:2D55 LODSW
3DC7:2D57 XCHG AX,BX
3DC7:2D58 MOV  BX,[BX]
3DC7:2D5A MOV  DS,[SS:1CFA]
3DC7:2D5F POP  WORD [BX]    ;关键!
3DC7:2D61 MOV  DS,[SS:1CF2]
3DC7:2D66 LODSW
3DC7:2D68 JMP  AX

利用2D5F处的弹出指令,将16进制码H19从栈顶弹出到变量寄存器中.

下指令:    ? BX
TRW给出:
DEC = 32106
HEX = 7D6A

试着用E命令修改DS:7D6A.
置入0,程序在后面的运行中将弹出程序失效的提示窗口;置入H63(D99),试用版传输量将大大提
升.

但是,上面提到的全部数据传输和处理过程都是在vbrun300.dll中完成的,无法将f6d处改写为例
如MOV [SS:BX],H63 这样的指令.

分析上面给出的F67和2D55两节指令,可以看出VB代码结构的明显特征:指针ES:SI指向一个混合
装有指令入口和数据的指针列表,节首的装载指令通过指针列表下载数据;节尾的装载指令通过
指针列表下载新的指令入口.这样就将事先按死顺序编好在VB运行库里的指令代码和用户数据通
过指针列表盘活了.

把上面的过程整理一下,如下表:

节序    ①    ②    ③       ④
指令指针  6080   6084   6086      6088
指令入口  3234   76A2   F67      2D55
数据指针  6082   -     -       -
数据内容  0380   -     -       -
功能    传送数据 浮点处理    浮点栈>当前栈 当前栈>变量寄存器

如果能舍去浮点处理,将数据如H63(D99)在节①处直接压入当前堆栈内,在节④处从栈顶弹出到
变量寄存器中,试用版传输量将提高到可以认为是没有限制了.

在当前指令代码段中找了一下,有下面3节大约可用:


1C2F:2A86 LODSW
1C2F:2A88 XCHG AX,BX
1C2F:2A89 MOV  BX,[BX]
1C2F:2A8B MOV  DS,[SS:1CFA]
1C2F:2A90 PUSH WORD [BX]
1C2F:2A92 MOV  DS,[SS:1CF2]
1C2F:2A97 LODSW
1C2F:2A99 JMP  AX


1C2F:2B50 LODSW
1C2F:2B52 XCHG AX,BX
1C2F:2B53 PUSH WORD [BX]
1C2F:2B55 LODSW
1C2F:2B57 JMP  AX


1C2F:3834 LODSW
1C2F:3836 PUSH AX
1C2F:3837 LODSW
1C2F:3839 JMP  AX

试选⑶,做一个新的指针方案:

节序   ①      ②   ③   ④
指令指针 6080     6084  6086  6088
指令入口 3834     3837  3837  2D55
数据指针 6082     -    -    -
数据内容 0063     -    -    -
功能   数据>当前栈 空运转 空运转 当前栈>变量寄存器

选定TRW的TRnewTCB,重新激活FastPCL,TRW截获它.

下指令:    BPM 30:9B0B7 R
按F5,程序被TRW截获.
下指令:    BD*  ;清中断.
按F12三次,F10六次,来到:

342F:650E PUSH AX  ;光标停在这里
342F:650F CMP  CL,FF
342F:6512 JZ  6515
342F:6514 PUSH CX
342F:6515 OR  SI,SI
342F:6517 JZ  651D
342F:6519 LODSW
342F:651B JMP  AX

可以看到TRW反汇编窗口下面的横线中央标有VBRUN300(xx)+xxx,指出当前模块名是vbrun300,
括号中是子模块序号,加号后是在模块中的偏移量.
这就是VB3的指针控制域.所谓VB难追,也是指在这个域里.

下指令:    E ES:6080 34 38 63 00 37 38 37 38
按F5.
修改成功.FastPCL右上角的试用版窗口显示剩余传输量为99节.左上角是定购信息窗.

这么大的传输量对于一般用户来讲可以说已经没有什么限制了,故可以进一步尝试将试用版窗
口和定购信息窗去掉.

选定TRW的TRnewTCB,重新激活FastPCL,TRW截获它.

下指令:    BPX ACCESSRESOURCE
按F5十七次,按F12两次,F10一直来到:

3FEF:010D CALL 063C
3FEF:0112 MOV  SI,AX    ;光标停在这里
3FEF:0114 OR  SI,AX
3FEF:0116 JZ  0120
3FEF:0118 MOV  AX,SI
3FEF:011A POP  SI
3FEF:011B POP  DI
3FEF:011C LEAVE
3FEF:011D RET  0A
3FEF:0120 LEA  AX,[BP-04]
3FEF:0123 PUSH SS
3FEF:0124 PUSH AX
3FEF:0125 MOV  ES,[1F3A]
3FEF:0129 LEA  BX,[DI+19]
3FEF:012C PUSH WORD [ES:BX]
3FEF:012F CALL 0482     ;按F8跟进去
3FEF:0134 MOV  SI,AX

下指令:    BD*  ;清中断.

接着一直按F10,来到:

1BD7:0493 CALL 07C0  ;按F8跟进去
1BD7:0498 MOV  SI,AX
1BD7:049A OR  SI,AX
1BD7:049C JZ  04A6
1BD7:049E MOV  AX,SI
1BD7:04A0 POP  SI
1BD7:04A1 POP  DI
1BD7:04A2 LEAVE
1BD7:04A3 RETF 06

接着一直按F10,来到:

35C7:08F8 CALL `KERNEL!_LREAD`
35C7:08FD MOV  [BP-06],AX   ;光标停在这里
35C7:0900 CMP  AX,FFFF
35C7:0903 JNZ  0908
35C7:0905 JMP  09A8
35C7:0908 MOV  ES,[1F42]

下指令:    DW ES:26A
获得段地址①.

下指令:    DB 段地址①:B19
数据窗口显示:

35AF:0B19 04 00 00 00 00 05 2D 00-DE 03 9E 07 85 02 12 07 ......-.???..
35AF:0B29 00 14 02 1E FF FF 00 03-65 00 00 80 0A 12 00 00 ......e......
35AF:0B39 01 FF 00 22 41 6C 73 6F-20 4C 6F 67 20 4E 65 74 .."Also Log Net

这是定购窗口的VB显示参数,包括窗口位置、字体、字体尺寸、前景、背景、效果等.
在它的前面是将要显示的字串.

下指令:    DB 段地址①:CB8
数据窗口显示:

35AF:0CB8 03 00 00 FF 00 04 FF FF-FF 00 05 BB 17 DE 03 EA .......???
35AF:0CC8 06 85 02 0C 0D 4D 53 20-53 61 6E 73 20 53 65 72 .?..MS Sans Ser

这是试用版窗口的VB显示参数.

下指令:    E 段地址①:B21 0 0 0 0 A 0
下指令:    E 段地址①:CBE 0 0 0 0 5 2D 0 0 0 0 0 A 0

按F5.
修改成功.两个窗口均被清除.

使用Ultra Edit 32,按下面的方法做最后的修改:

34 32 80 03 A2 76 67 0F 55
-- 38 63 00 37 38 37 38 --

17 DE 03 EA 06 85 02 OC
-- 00 00 00 00 0A 00 --

00 DE 03 9E 07 85 02 12
-- 00 00 00 00 0A 00 --

试运行.哇,成功!
VB是可以修改的!

忙了半天,只是为了说明VB是可以修改的.
其实按下面的方法修改,只要修改一处,效果是一样的:

34 32 80 03 A2 76 67 0F 55
-- 38 FF FF 37 38 37 38 --

俨然一个正版.

倘若只是想用一用软件,或想偷个懒,或者缺少工具,只要用Notepad打开Win.ini,在Protection
FL3= 25一行的前面加上一个分号";",然后存盘,就万事大吉了。此帖在看雪论坛上的地址:[size=1.1]Fast PC Linker-III
[size=1.75]修改指针法破解VB程序 腾图影视'97 (14千字)_ 来自看雪论坛精华3发布者:Editor发布于:2001-07-25 22:57修改指针法破解VB程序
腾图影视'97

作者: 囚童
课题: 解除"腾图影视'97"五分钟播映时间限制,清NAG
背景: VB4.0编程
下载:
工具: TRW2000
    Ultra Edit 32


  腾图影视'97是一个播放VCD等数字影视节目的工具软件,除了播放画面流畅、色
彩逼真、界面美观以外,还采用了独创的“无界面”操作技术,即在影片播放过程中
进行的任何操作,都不会有操作画面进行遮挡。此外,还增加了动态屏幕变焦(动态
的将局部画面进行放大、缩小)及漫游,多画面播放(产生电视墙的效果),动态连
续抓拍,还可以将窗口缩小后放在最上层,边干别的工作边看电影,互不干扰。在播
放卡拉-OK时,可将所有曲目的画面显示在屏幕上,从而进行屏幕选曲,操作十分方
便。播放多种格式的视频文件(*.FLI)、 (*.FLC)、(*.DAT)、(*.MPG)、 (*.AVI)、
(*.MOV)等。

腾图影视'97试用版有5分钟播映时间限制,并会弹出一个提示窗口。没有注册入口。

  腾图影视'97选择VB4.0编程.大家知道,VB程序的特点是既难跟又难改,这就给破解
带来相当的难度.


下面给出用修改指针法破解VB程序的例子,供参考.

启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.右击这个图标,选TRmewTCB.

将一张VCD影碟放入光驱,双击腾图影视'97图标,TRW截获这一新线程.

为了让大家了解什么是VB的指针,我们先做如下操作:

下指令:    BPX THROW
按F5,程序被TRW截获.
下指令:    BD*  ;清中断.
按F12三次,按F10一直来到:

109F:30B6 MOV  DS,BX
109F:30B8 CALL FAR [BP+0C] //按F7、F8进入
109F:30BB MOV  [BP-04],AX  //光标停在这里
109F:30BE MOV  [BP-02],DX
109F:30C1 MOV  CX,[BP+06]
109F:30C4 ADD  SP,CX
109F:30C6 ADD  SP,CX
109F:30C8 MOV  AX,[BP-04]
109F:30CB MOV  DX,[BP-02]
109F:30CE POP  SI
109F:30CF  POP  DI
109F:30D0 LEAVE
109F:30D1 RETF 0A

将光标上移到30B8一行,按F7、F8进入到:

418F:2CF0 MOV CX,C8   //光标停在这里
418F:2CF3 CMP AX,C933
418F:2CF6 MOV AX,2622
418F:2CF9 MOV DX,1ADF
418F:2CFC JMP `VB40016!METHCALLENGINE`  //将光标移在这里,按F7、F8进入
418F:2D01 ADD [BX+SI],AL
418F:2D03 ADD [BX+SI],AL
418F:2D05 DB  00
3EC7:2D06 MOV CX,D0
3EC7:2D09 CMP AX,C933
3EC7:2D0C MOV AX,1CB4
3EC7:2D0F MOV DX,3EDF
3EC7:2D12 JMP `VB40016!METHCALLENGINE`

这是典型的VB指针控制域的一个引导入口表。
按F8跟进去,来到:

VB40016!METHCALLENGINE
1A57:0E40 MOV  BX,SP     //光标停在这里
1A57:0E42 SUB  [SS:BX+04],CX
1A57:0E46 MOV  BX,CX
1A57:0E48 MOV  CX,3D0C
1A57:0E4B JMP  SHORT 0E50
1A57:0E4D MOV  CX,3CDD
1A57:0E50 PUSH BP
     ┇
     ┇
1ADF:0F7E MOV [ES:BX+0162],AX
1ADF:0F83 ADD SI,BYTE +02
1ADF:0F86 JMP NEAR [SI-02]   //将光标移在这里,按F7跟到这里

将光标下移到F86一行,按F7。
可以看到,AX的值经处理存入指针SI,DX置为DS段值。
按住F10,可以来到:

1C27:209B MOV   AX,[SI]
1C27:209D PUSH  SS
1C27:209E ADD   AX,BP
1C27:20A0 PUSH  AX
1C27:20A1 ADD   SI,BYTE +04
1C27:20A4 JMP   NEAR [SI-02]
     ┇
     ┇
1C27:20B9 MOV   DI,[SI]
1C27:20BB POP   AX
1C27:20BC MOV   [BP+DI],AL
1C27:20BE ADD   SI,BYTE +04
1C27:20C1 JMP   NEAR [SI-02]

  分析上面给出的209B和20B9两节指令,可以看出VB指针控制域代码结构的明显特
征:指针DS:SI指向一个混合装有指令入口和数据的指针列表,节首的传送指令通过指
针列表下载数据;节尾的跳转指令通过指针列表下载新的指令入口。这样就将事先按
死顺序编好在VB运行库里的指令代码和用户所给的数据通过指针列表盘活了。因此,
下面给出的带条件语句的TRW跟踪指令也反映了VB指针控制域代码结构的这一特征。

那么,怎样解除"腾图影视'97"五分钟播映时间限制呢?

  "腾图影视'97"有多个时间限制机制,一个是由窗口内的鼠标指针激活的与系统时
钟相关的5分钟计时,另七个是内建的以分钟为单位的5分钟计时,它们各自独立运行。

先看第一个:
A:

其指令引导表为:
1B1F:22DE MOV CX,0086
1B1F:22E1 CMP AX,C933
1B1F:22E4 MOV AX,2DA6
1B1F:22E7 MOV DX,1AC7
1B1F:22EA JMP `VB40016!METHCALLENGINE`

下指令:G 158E IF(SI==2),回车,将光标移入窗口,截获到:

15A7:158B MOV  DI,15AF
15A7:158E CALL FAR [SI]   //光标停在这里
15A7:1590 ADD  SI,BYTE +04
15A7:1593 JMP  DI
15A7:1595 MOV  DI,159A
15A7:1598 JMP  SHORT 158E
15A7:159A XOR  AH,AH
15A7:159C PUSH AX
15A7:159D ADD  SI,BYTE +02
15A7:15A0 JMP  NEAR [SI-02]
15A7:15A3 MOV  DI,15AE
15A7:15A6 JMP  SHORT 158E
15A7:15A8 MOV  DI,15AD
15A7:15AB SHORT 158E
15A7:15AD PUSH DX
15A7:15AE PUSH AX
15A7:15AF ADD  SI,BYTE +02
15A7:15B2 JMP  NEAR [SI-02]

  可以看到TRW反汇编窗口下面的横线中央标有VB40016(xx)+xxx,指出当前模块名
是VB40016,括号中是子模块序号,加号后是在模块中的偏移量.

这就是VB4的指针控制域.所谓VB难追,也是指在这个域里.

  为什么上面的TRW跟踪指令要附带条件语句呢?因为VB是解释语言,解释语言的
一节命令可能会被反复多次调用,不同的调用会有不同的指针。用指针做条件可以限
定在指定的调用环境下截获中断。特别在长调用返回时,若调用的节对自身再次调用,
无指针做条件会导致返回在下一个调用的返回处。

(若按F8跟进去,可以发现这是对函数RTCGetTimeBSTR的调用。)

下指令:D DS:0
得到指针列表(方扩号是作者加的。方扩号内是指令指针,方扩号外是数据指针):

1AC7:0000[15A8]0BCC 116F[402E]FF9A[2051]FF9A[3283]
1AC7:0010 0001 0000[332C]FF5C 0002[15A8]0AE0 3B6F
1AC7:0020[4025]FF58[394B]FF50[158B]1E18 116F[2051]
1AC7:0030 FF9A[3283]0004 0000[332C]FF30 0002[15A8]
1AC7:0040 0AE0[3B6F 4025]FF2C[394B]FF24[158B]1E18
1AC7:0050 116F[2BA0]0026 0000[321B 468C 381D]0006
1AC7:0060 005C[3283]0005 0000[3555 1876 2090]FF50
1AC7:0070[3213]003C[1869 3631 2090]FF24[3585 1965]
1AC7:0080[46E4 33B2 220B]0004 FF58 FF2C[21F7]0004
1AC7:0090 FF5C FF30[148B]000C 161E 0004 06AC 3BE0

将上表整理,可得指针、指令和数据的关系如下(每一序号包含一至多节):

节序        ①      ②      ③      ④      ⑤
指针SI     2       C          1C         40        5C
指令入口[SI-2]    15A8     2051      15A8     15A8     468C
数据内容[SI]  0BCC     FF9A      0AE0     0AE0     ―
数据内容描述  函数地址偏移 数据地址偏移 函数地址偏移 函数地址偏移 ― 
该节功能    获取当前时间 传送时间   处理小时   处理分钟    判小时


节序        ⑥      ⑦      ⑧
指针SI     5E      82      84
指令入口[SI-2]    381D     46E4     33B2
数据内容[SI]  0006     ―      ―
数据内容描述  浮点处理参数 ―      ―
该节功能    进入浮点处理 判分钟        终判、置标志

节① SI=2
1A8F:158E CALL FAR [SI]  //SI指向函数RTCGETTIMEBSTR入口,获取当前时间
1A8F:1590 ADD  SI,BYTE +04
1A8F:1593 JMP  DI
1A8F:1595 MOV  DI,159A
1A8F:1598 JMP  SHORT 158E
1A8F:159A XOR  AH,AH
1A8F:159C PUSH AX
1A8F:159D ADD  SI,BYTE +02
1A8F:15A0 JMP  NEAR [SI-02]
1A8F:15A3 MOV  DI,15AE
1A8F:15A6 JMP  SHORT 158E
1A8F:15A8 MOV  DI,15AD   //该节入口
1A8F:15AB JMP  SHORT 158E
1A8F:15AD PUSH DX
1A8F:15AE PUSH AX
1A8F:15AF ADD  SI,BYTE +02  //指向下一节
1A8F:15B2 JMP  NEAR [SI-02] //跳到下一节入口

节② SI=C
1A8F:2051 MOV  DI,[SI]
1A8F:2053 PUSH WORD [BP+DI+02] //将指向当前时间的地址压入堆栈
1A8F:2056 PUSH WORD [BP+DI]
1A8F:2058 ADD  SI,BYTE +04   //指向下一节
1A8F:205B JMP  NEAR [SI-02]  //跳到下一节入口

节③ SI=1C
同节①,SI指向函数RTCMIDCHARBSTR入口,取小时值供后续处理。

节④ SI=40
同节③,SI指向函数RTCMIDCHARBSTR入口,取分钟值供后续处理。

节⑤ SI=5C
1A8F:468C POP  DX     //弹出参照标量
1A8F:468D POP  CX     //弹出小时处理结果
1A8F:468E CMP  CX,DX    //判断
1A8F:4690 MOV  AX,00    //清小时超时标志
1A8F:4693 JNZ  4696     //未超时,跳
1A8F:4695 DEC  AX     //超时,置小时超时标志FFFF
1A8F:4696 PUSH AX      //压入堆栈
1A8F:4697 ADD  SI,BYTE +02 //指向下一节
1A8F:469A JMP  NEAR [SI-02]//跳到下一节入口

节⑥ SI=5E
1A8F:381D MOV  DI,[SI]
1A8F:381F LES  DI,[BP+DI]
1A8F:3821 MOV  AX,ES
1A8F:3823 OR   AX,AX
1A8F:3825 JZ   3870
1A8F:3827 ADD  DI,[SI+02]
1A8F:382A PUSH WORD [ES:DI+02]  //将浮点处理参数压入堆栈
1A8F:382E PUSH WORD [ES:DI]   //供浮点系统处理
1A8F:3831 ADD  SI,BYTE +06
1A8F:3834 JMP  NEAR [SI-02]

节⑦ SI=82
3A7F:46E4 CALL C777    //在浮点系统中先将十六进制分钟数据转换为80位的数
3A7F:46E7 JMP  SHORT 46F6  //据,再判断是否超时,将结果送入AH,再将AH中的内
3A7F:46E9 CALL C785    //容送标志位。
3A7F:46EC JMP  SHORT 46F6
3A7F:46EE CALL C74C
3A7F:46F1 JMP  SHORT 46F6
3A7F:46F3 CALL C732
3A7F:46F6 SBB  AX,AX    //根据标志位置分钟超时标志,0为未超时,FFFF为超时。
3A7F:46F8 PUSH AX      //压入堆栈
3A7F:46F9 ADD  SI,BYTE +02 //指向下一节
3A7F:46FC JMP  NEAR [SI-02] //跳到下一节入口

节⑧ SI=84
31B7:33B2 POP  AX     //弹出小时超时标志
31B7:33B3 POP  CX     //弹出分钟超时标志
31B7:33B4 AND  AX,CX    //终判,其一为超时则判为超时
31B7:33B6 PUSH AX     //置终判标志于栈顶
31B7:33B7 ADD  SI,BYTE +02 //指向下一节
31B7:33BA JMP  NEAR [SI-02]//跳到下一节入口

  可见,只要在节⑧位置向栈顶压入标志字0,就可以不去理会浮点运算有多么复
杂,使程序始终处于未超时状态。
      
  但是,上面提到的全部数据传输和处理过程都是在vb40016.dll中完成的,无法将
33B6处改写为例如PUSH BYTE +00这样的指令(改写公共DLL文件是对用户极不负责
的表现).

  而指针表是程序在编译过程中生成的,是可以改写的。只要记住这样的规则,就
不怕改写VB程序了:不要指望改写语句,要设法改变调用。

改变调用的方法就是修改指针表。

在当前指令代码段中找了一下,有下面2节大约可用于新的调用:


31D7:1746 SBB  AX,AX
31D7:1748 PUSH AX
31D7:1749 ADD  SI,BYTE +02
31D7:174C JMP  NEAR [SI-02]


31D7:321B PUSH BYTE +00
31D7:321D ADD  SI,BYTE +02
31D7:3220 JMP  NEAR [SI-02]

试选⑵,做一个新的指针方案:

节序        ⑧
指针SI     84
指令入口[SI-2]    321B
数据内容[SI]  ―
数据内容描述  ―
该节功能    强制设置未超时标志0

  抄下指针表中指针84前后的十六进制码,使用Ultra Edit 32,按下面的方法做第
一步的修改:

46 B2 33 0B
― 1B 32 ―

下面来看另七个内建的以分钟为单位的5分钟计时。
B-1:

其指令引导表为:
346F:0F40 MOV CX,66
346F:0F43 CMP AX,C933
346F:0F46 MOV AX,370C
346F:0F49 MOV DX,346F
346F:0F4C JMP `VB40016!METHCALLENGINE`

下指令:G 3807 IF(SI==31F2),回车,来到:

1A8F:3807 MOV  DI,[SI]   //光标停在这里
1A8F:3809 LES  DI,[BP+DI]
1A8F:380B MOV  AX,ES
1A8F:380D OR   AX,AX
1A8F:380F JZ   3870
1A8F:3811 ADD  DI,[SI+02]
1A8F:3814 PUSH WORD [ES:DI]
1A8F:3817 ADD  SI,BYTE +06
1A8F:381A JMP  NEAR [SI-02]

下指令:D DS:31E0


得到指针列表(方扩号是作者加的。方扩号内是指令指针,方扩号外是数据指针):

346F:31E0[0F92]0004[0F92]0008[3D49]0512[0F92]0012
346F:31F0[3807]0006 0034[321B 47C5 148B]0018[0F92]
346F:3200 0014[3807]0006 0034[3223 359C 38BA]0006
346F:3210 0034[1474]04E4[0F92]0004[0F92]0034[321B]

将上表整理,可得指针、指令和数据的关系如下(每一序号包含一至多节):

节序        ①      ②     ③      ④  
指针SI     31F2     31F8    31FA     31FC 
指令入口[SI-2]    3807     321B     47C5     148B 
数据内容[SI]  0006     ―     ―      ―  
数据内容描述  数据地址偏移 ―     ―      ―  
该节功能    获取剩余分钟 给出参照值 比较、置标志 判断 

节序      ⑤      ⑥     ⑦     ⑧
指针SI     3204     320A    320C    320E
指令入口[SI-2]    3087     3223    359C    38BA
数据内容[SI]  0006     ―     ―     0006    
数据内容描述  数据地址偏移 ―     ―     非超时增跳节数
该节功能    获取剩余分钟 给出递减值 剩余分钟减1 回置存储单元

节① SI=31F2

1A8F:3807 MOV  DI,[SI]   //取数据地址偏移
1A8F:3809 LES  DI,[BP+DI]
1A8F:380B MOV  AX,ES
1A8F:380D OR   AX,AX    //校验地址有效性
1A8F:380F JZ   3870
1A8F:3811 ADD  DI,[SI+02] //取下一个数据地址偏移
1A8F:3814 PUSH WORD [ES:DI]//将剩余分钟压入堆栈
1A8F:3817 ADD  SI,BYTE +06 //指向下一节
1A8F:381A JMP  NEAR [SI-02]//跳到下一节入口

节② SI=31F8

1A8F:321B PUSH BYTE +00  //给出参照值,0为计时结束。
1A8F:321D ADD  SI,BYTE +02 //指向下一节
1A8F:3220 JMP  NEAR [SI-02]//跳到下一节入口

节③ SI=31FA

1A8F:47C5 POP  DX     //弹出参照值
1A8F:47C6 POP  CX     //弹出剩余分钟值
1A8F:47C7 XOR  AX,AX    //清超时标志
1A8F:47C9 CMP  CX,DX    //比较
1A8F:47CB JNG  47CE    //非超时,跳;标志为0
1A8F:47CD DEC  AX     //超时,不跳;标志为FFFF
1A8F:47CE PUSH AX     //保存标志
1A8F:47CF ADD  SI,BYTE +02 //指向下一节
1A8F:47D2 JMP  NEAR [SI-02]//跳到下一节入口

节④ SI=31FC

1A8F:148B POP CX      //弹出超时标志
1A8F:148C MOV AX,[SI]   //取非超时增跳节数
1A8F:148E OR  CX,CX    //判断
1A8F:1490 JNZ 1494     //超时,保持原节进程
1A8F:1492 ADD SI,AX    //非超时,增跳指定指令节数
1A8F:1494 ADD SI,BYTE +04 //指向下一节
1A8F:1497 JMP NEAR [SI-02] //跳到下一节入口

节⑤ SI=3204
同节①

节⑥ SI=320A

1A8F:3223 PUSH BYTE +01  //取递减值
1A8F:3225 ADD  SI,BYTE +02 //指向下一节
1A8F:3228 JMP  NEAR [SI-02]//跳到下一节入口

节⑦ SI=320C

1A8F:359C POP AX      //弹出递减值
1A8F:359D MOV BX,SP
1A8F:359F SUB [SS:BX],AX  //剩余分钟值减1
1A8F:35A2 JO  35BD
1A8F:35A4 ADD SI,BYTE +02 //指向下一节
1A8F:35A7 JMP NEAR [SI-02]//跳到下一节入口

节⑧ SI=320E

1A8F:38BA MOV DI,[SI]   //取数据地址偏移
1A8F:38BC LES DI,[BP+DI]
1A8F:38BE MOV AX,ES
1A8F:38C0 OR  AX,AX    //校验地址有效性
1A8F:38C2 JZ  3870
1A8F:38C4 ADD DI,[SI+02] //取下一个数据地址偏移
1A8F:38C7 POP WORD [ES:DI]//将更新的剩余分钟值回置原存储单元
1A8F:38CA ADD SI,BYTE +06 //指向下一节
1A8F:38CD JMP NEAR [SI-02]//跳到下一节入口

  从节④可以看出,在VB中,指令的跳转不是按指令字节数来跳转的,而是按指令
的节数来跳转的。

  从节⑦可以看出,若时间递减值为0,则剩余分钟值永不为0,程序就可以不受限
制地运行下去了。这可以通过改变节⑥的调用来实现。我们仍可以用前面用到过的321B
来替换节⑥。

新的调用:

31D7:321B PUSH BYTE +00
31D7:321D ADD  SI,BYTE +02
31D7:3220 JMP  NEAR [SI-02]

新的指针方案:

节序        ⑥
指针SI     320A
指令入口[SI-2]    321B
数据内容[SI]  ―
数据内容描述  ―
该节功能    强制设置时间递减值为0

另外6个计时器大同小异,但指针表的位置不一样,列表如下:

计时器号    B-1   B-2   B-3   B-4   B-5   B-6   B-7
入口引导表入口 F40   23BA  28F8  30B8  3560  389C  3A98
首节指针SI   31E2  56E   270A  374E  2C76  2    ADA
首节入口    F92   F92   F92   F92   F92   F92   F92
指令指针SI   31F8  57E   271A  375E  2C86  12   AEA
指令入口    3807  3807  3807  3807  3807  3807  3807
需要改值的指针 3208  594   2730  3774  2C9C  28   B00
UltraEdit32偏移 44440  45510  43970  449A0  43ED0  44F90  45A80

  抄下指针表中需要改值的指针前后的十六进制码(它们大致相同),使用Ultra
Edit 32,按下面的方法做最后的修改:

00 23 32 9C 35 BA 38
-- 1B -- -- -- -- --

  与此代码相同的不止7处,可参考上表最下面一行UltraEdit32偏移,它是一组行
号,需要改值的指针在此行内。

存盘。
试运行。哇,成功!
VB是以修改的!此帖在看雪论坛上的地址:[size=1.1]腾图影视'97
[size=1.75]Turbo Note+ V4.4注册机制分析 (19千字)_ 来自看雪论坛精华4发布者:Editor发布于:2001-11-07 09:28Turbo Note+ V4.4注册机制分析

作者: 囚童[FCG][BCG]
课题: Turbo Note+ V4.4注册机制分析
出品: South Pacific InformationServices Ltd
背景: PACKED WITH Thrink v3
平台: win95/98, winNT/2000
下载: http://turbopress.com/tnplus44.exe
尺寸: 769KB
工具: TRW 2000
      冲击波2000
    W32Dasm V8.93

关键字: 软件破解 注册码


TurboNote+是一个方便的“即时帖”软件,可以工作在Win95/98, WinNT 和 Win2000
环境下。它可以即时在自己或通过IP地址向其他人的屏幕上贴上一个可定义尺寸和颜色
的"留言条",也可以按预定的时间启动备忘提示功能。
通过"留言条",可以方便地启动可执行程序、互联网址、E-mail地址,也可以把它们作
为附件发送给指定的IP地址。它可以隐藏,也可以再现,甚至关机后信息也不会丢失。
使用十分方便。

TurboNote V4.4未注册版有30天的时间限制。过期后会随时出现延时的注册窗口,程序
仍能使用。

TurboNote+是一个被压缩了的可执行软件,用一般的方法无法修改。它的脱壳较简单,
用冲击波2000找到程序入口,在TRW2000下定位入口,再用MAKEPE命令很容易就脱壳成
功。

TurboNote+在注册时不出现明码,大多数情况下,输入了错误的注册码得不到提示,
因此用动态跟踪寻找注册入口较困难。相反,用静态分析却相当简单。

以下是对其注册机制的分析:

用W32Dasm打开TurboNote+主文件TBNOTE.EXE,以REGISTER为关键字搜索,定位在:

* Possible StringData Ref from Code Obj ->"There was a problem when saving "
                                        ->"the registry key Try again "
                                        ->"please."
                                  |
:00412BF4  push 00470968
:00412BF9  push eax

向上看,可以找到:

* Reference To: KERNEL32.lstrlenA, Ord:0000h
                                  |
:00412B4D Call dword ptr [00467128]
:00412B53 cmp  eax, 00000014               <==串长≥Ox14
:00412B56 jl   00412DD8
:00412B5C push 00000064
:00412B5E lea  ecx, dword ptr [ebp-44]
:00412B61 call 0042AA60
:00412B66 xor  ebx, ebx
:00412B68 push 00000019
:00412B6A lea  ecx, dword ptr [ebp-50]
:00412B6D mov  dword ptr [ebp-04], ebx
:00412B70 call 0042AA60

嗯,有点象,注册码长度可能大于20个字符。怪不得输错了注册码得不到提示,因为大
多数人一开始是不会输入那么长的一串码的。

启动TRW2000,点击OK使其最小化。

双击TurboNote+图标,TurboNote+在屏幕右下脚生成一个TurboNote+图标。
右击这个图标,会弹出一个右键菜单,选GENERAL SETTINGS,GENERAL SETTINGS窗口弹
出,点REGISTER TURBONOTE+选项卡,该卡被调到窗口最前面,在REGISTRATION CODE:
框中随便输入20个字母数字,我们后面称它串。注意,TurboNote+的注册码拒绝键盘上
的某些字符,例如[BCG]的方括号。

按CTRL+N,激活TRW。

下指令:BPX 412B53,按F5,TurboNote+再次被TRW截获。

按F10,一路走一路看,来到:

* Possible StringData Ref from Code Obj ->"SOFTWARE\SPIS Ltd\TurboNote\"
                    ->"Registration"
                                  |
:00412B86 push 004709B4
:00412B8B push 80000002
:00412B90 lea  ecx, dword ptr [ebp-6C]
:00412B93 mov  [ebp-04], 02
:00412B97 call 0044CA50
:00412B9C push 0000012C
:00412BA1 lea  ecx, dword ptr [ebp-20]
:00412BA4 mov  [ebp-04], 03
:00412BA8 call 0042AA60
:00412BAD push edi
:00412BAE lea  ecx, dword ptr [ebp-20]
:00412BB1 mov  [ebp-04], 04
:00412BB5 call 0042AF00
:00412BBA mov  eax, dword ptr [ebp-4C]
:00412BBD mov  ecx, dword ptr [ebp-40]
:00412BC0 mov  edx, dword ptr [ebp-1C]
:00412BC3 mov  eax, dword ptr [eax]
:00412BC5 mov  ecx, dword ptr [ecx]
:00412BC7 mov  edx, dword ptr [edx]
:00412BC9 push eax
:00412BCA push ecx
:00412BCB push edx
:00412BCC call 0044B470            <==注册模块入口,按F8进入
:00412BD1 add  esp, 0000000C
:00412BD4 test eax, eax
:00412BD6 je 0 0412D2A
:00412BDC mov  ecx, esi
:00412BDE call 00412DF0
:00412BE3 test eax, eax
:00412BE5 jne  00412C05
:00412BE7 mov  eax, dword ptr [esi+000001B0]
:00412BED push 00000010

412BCC是注册模块入口,按F8进入,来到:

* Referenced by a CALL at Addresses:
|:00412BCC, :0044AC60, :0044AEE5
|
:0044B470 sub  esp, 00000304
:0044B476 lea  eax, dword ptr [esp+00000080]
:0044B47D push ebx
:0044B47E push ebp
:0044B47F push esi
:0044B480 push edi

* Possible StringData Ref from Code Obj ->"ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"
                    ->"fghijklmnopqrst"
                                        ->"uvwxyz0123456789+/="
                                  |
:0044B481 push 00473000
:0044B486 push eax

* Reference To: KERNEL32.lstrcpyA, Ord:0000h
                                  |
:0044B487 Call dword ptr [0046712C]
:0044B48D mov  ecx, 00000040          <==从这里开始建密匙对照表
:0044B492 or e ax, FFFFFFFF
:0044B495 lea  edi, dword ptr [esp+000000D2]
:0044B49C repz
:0044B49D stosd
:0044B49E mov  eax, 00000041
        
        
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B513(C)
|
:0044B4FF mov  byte ptr [esp+eax+000001DC], 00
:0044B507 mov  byte ptr [esp+eax+00000241], 00
:0044B50F inc  eax
:0044B510 cmp  eax, 00000064
:0044B513 jl   0044B4FF
:0044B515 mov  esi, dword ptr [esp+00000318]
:0044B51C mov  dword ptr [esp+000002A8], 3F7FDEFF
:0044B527 push esi
:0044B528 mov  byte ptr [esp+000001DC], FF  <==第二遍运算时使用的密匙表
:0044B530 mov  byte ptr [esp+000001DD], DE
:0044B538 mov  byte ptr [esp+000001DE], 7F
:0044B540 mov  byte ptr [esp+000001DF], cl

:0044B547 Call  dword ptr [00467128]
:0044B54D mov  edx, eax
:0044B54F cmp  edx, 00000014
:0044B552 jl   0044B6D5
:0044B558 mov  dword ptr [esp+18], edi
:0044B55C mov  ecx, 00000019
:0044B561 xor  eax, eax
:0044B563 lea  edi, dword ptr [esp+28]
:0044B567 lea  ebp, dword ptr [edx+esi-04]
:0044B56B lea  ebx, dword ptr [edx+esi-03]
:0044B56F repz
:0044B570 stosd
:0044B571 mov  al, byte ptr [ebp+00]
:0044B574 lea  edi, dword ptr [edx+esi-02]
:0044B578 mov  byte ptr [esp+10], al
:0044B57C mov  cl, byte ptr [ebx]
:0044B57E mov  byte ptr [esp+11], cl
:0044B582 mov  al, byte ptr [edi]
:0044B584 lea  edx, dword ptr [edx+esi-01]
:0044B588 mov  byte ptr [esp+12], al
:0044B58C mov  dword ptr [esp+24], edx
:0044B590 push 0016EB35
:0044B595 mov  cl, byte ptr [edx]
:0044B597 lea  edx, dword ptr [esp+1C]
:0044B59B mov  byte ptr [esp+17], cl
:0044B59F push edx
:0044B5A0 lea  eax, dword ptr [esp+18]
:0044B5A4 push 00000004           <==先处理末4位
:0044B5A6 lea  ecx, dword ptr [esp+34]
:0044B5AA push eax
:0044B5AB push ecx
:0044B5AC lea  ecx, dword ptr [esp+000000A4]
:0044B5B3 mov  dword ptr [esp+34], edi
:0044B5B7 mov  [esp+28], 00
:0044B5BC call 00406F20            <==末4位处理模块,按F8进入
:0044B5C1 test eax, eax
:0044B5C3 jne  0044B5D8
:0044B5C5 mov  edx, dword ptr [esp+18]
:0044B5C9 pop  edi
:0044B5CA pop  esi
:0044B5CB pop  ebp
:0044B5CC mov  byte ptr [esp+edx+1C], al
:0044B5D0 pop  ebx
:0044B5D1 add  esp, 00000304
:0044B5D7 ret

通过后面对注册机制的分析,可以从上面建立的密匙对照表总结出,TurboNote+的注
册码只接受0-9、A-Z、a-z、“+”和“/”,其它为无效字符。

在44B5BC按F8进入,来到406F20,这是对串尾末4位的处理。我们可以看两种串尾的结
构,一种串尾为任意码,另一种串尾为"==",两种算法的效果基本是一样的,这里我
们来看第一种。

* Referenced by a CALL at Addresses:
|:004074D6, :0044B5BC
|
:00406F20 sub  esp, 000000D0
:00406F26 xor  eax, eax
:00406F28 push ebx
:00406F29 mov  ebx, dword ptr [esp+000000DC]
:00406F30 push ebp
:00406F31 push esi
:00406F32 mov  esi, dword ptr [esp+000000E8]
:00406F39 mov  ebp, ecx
:00406F3B push edi
:00406F3C mov  ecx, 00000019
:00406F41 lea  edi, dword ptr [esp+78]
:00406F45 repz
:00406F46 stosd
:00406F47 cmp  byte ptr [ebx+esi-01], 3D    <==注意这里,串尾一个"="号
:00406F4C je 0 0406FC9
:00406F4E mov  ecx, 00000019          <==串尾为任意码的处理
:00406F53 xor  eax, eax
:00406F55 lea  edi, dword ptr [esp+10]
:00406F59 push esi
:00406F5A repz
:00406F5B stosd
:00406F5C lea  eax, dword ptr [esi+2*esi]           <==串长x3
:00406F5F mov  edi, dword ptr [esp+000000F4]
:00406F66 shl  eax, 1                     <==结果x2
:00406F68 cdq
:00406F69 and  edx, 00000007
:00406F6C push ebx
:00406F6D add  eax, edx
:00406F6F mov  ecx, ebp
:00406F71 sar  eax, 03                     <==结果/8
:00406F74 mov  dword ptr [edi], eax      <==码长关键字,记下这个地址
:00406F76 lea  eax, dword ptr [esp+18]
:00406F7A push eax
:00406F7B call 00407220                <==对串尾进行处理
:00406F80 test eax, eax
:00406F82 jne  00406F91                <==成功则跳
:00406F84 pop  edi
:00406F85 pop  esi
:00406F86 pop  ebp
:00406F87 pop  ebx
:00406F88 add  esp, 000000D0
:00406F8E ret  0014

* Referenced by a CALL at Address:
|:00406F7B
|
:00407220  push ebx
:00407221  push ebp
:00407222  mov ebp, dword ptr [esp+14]
:00407226  push esi
:00407227  push edi
:00407228  xor edi, edi
:0040722A  xor edx, edx
:0040722C  test ebp, ebp
:0040722E  jle 004072D2

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004072CC(C)
|
:00407234  mov ebx, dword ptr [esp+18]
:00407238  lea esi, dword ptr [edx+01]
:0040723B  movsx eax, byte ptr [ebx+esi-01]   <==四位数一组,取第1位数
:00407240  mov al, byte ptr [eax+ecx+42]          <==查表取值
:00407244  test al, al
:00407246  jl 004072DE
:0040724C  and eax, 0000003F                <==3f内有效
:0040724F  shl eax, 06                   <==结果=值*Ox40
:00407252  cmp esi, ebp
:00407254  jge 0040726C
:00407256  movsx ebx, byte ptr [edx+ebx+01]         <==取下一位数
:0040725B  mov bl, byte ptr [ebx+ecx+42]          <==查表取值
:0040725F  test bl, bl
:00407261  jl 004072DE
:00407263  and ebx, 0000003F                <==3f内有效
:00407266  or eax, ebx                  <==加这个值到结果
:00407268  mov ebx, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407254(C)
|
:0040726C  lea ebp, dword ptr [esi+01]
:0040726F  shl eax, 06                   <==结果=值*Ox40
:00407272  cmp ebp, dword ptr [esp+1C]
:00407276  jge 0040728E
:00407278  movsx ebx, byte ptr [edx+ebx+02]        <==取下一位数
:0040727D  mov bl, byte ptr [ebx+ecx+42]         <==查表取值
:00407281  test bl, bl
:00407283  jl 004072DE
:00407285  and ebx, 0000003F               <==3f内有效
:00407288  or eax, ebx                  <==加这个值到结果
:0040728A  mov ebx, dword ptr [esp+18]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407276(C)
|
:0040728E  mov ebp, dword ptr [esp+1C]
:00407292  add esi, 00000002
:00407295  shl eax, 06                   <==结果=值*Ox40
:00407298  cmp esi, ebp
:0040729A  jge 004072AE
:0040729C  movsx esi, byte ptr [edx+ebx+03]        <==取最后一位数
:004072A1  mov bl, byte ptr [esi+ecx+42]          <==查表取值
:004072A5  test bl, bl
:004072A7  jl 004072DE
:004072A9  and ebx, 0000003F                <==3f内有效
:004072AC  or eax, ebx                   <==加这个值到结果

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040729A(C)
|
:004072AE  mov esi, dword ptr [esp+14]
:004072B2  add edx, 00000004
:004072B5  mov byte ptr [edi+esi+02], al      <==结果为三位,存为新串
:004072B9  add edi, 00000003
:004072BC  shr eax, 08               <==结果/Ox100
:004072BF  mov byte ptr [edi+esi-02], al      <==取余
:004072C3  shr eax, 08               <==结果/Ox100
:004072C6  mov byte ptr [edi+esi-03], al      <==取商
:004072CA  cmp edx, ebp
:004072CC  jl 00407234

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040722E(C)
|
:004072D2  pop edi
:004072D3  pop esi
:004072D4  pop ebp
:004072D5  mov eax, 00000001
:004072DA  pop ebx
:004072DB  ret 000C


406F7B的call若运算成功,退出后会跳到406F91:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406F82(C)
|
:00406F91  mov eax, dword ptr [edi]
:00406F93  xor ecx, ecx
:00406F95  test eax, eax
:00406F97  jle 004070F9
:00406F9D  mov eax, dword ptr [esp+000000E4]
:00406FA4  lea esi, dword ptr [esp+10]
:00406FA8  sub esi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406FB5(C)
|
:00406FAA  mov dl, byte ptr [esi+eax]   <==取第一遍的运算结果,存为新串
:00406FAD  inc ecx
:00406FAE  mov byte ptr [eax], dl     <==校验关键字,记下这个地址
:00406FB0  mov edx, dword ptr [edi]
:00406FB2  inc eax
:00406FB3  cmp ecx, edx
:00406FB5  jl 00406FAA
:00406FB7  pop edi
:00406FB8  pop esi
:00406FB9  pop ebp
:00406FBA  mov eax, 00000001
:00406FBF  pop ebx
:00406FC0  add esp, 000000D0
:00406FC6  ret 0014

校验关键字是由串的末四位运算而来的,它实际上是注册用户名累加和的尾数。

对串的前半部分,要做两遍运算处理,其第一遍运算同样调用的是上面的模块,这里
不再赘述。

第二遍运算,是在407553的调用中进行的,我们来看一下:

* Referenced by a CALL at Address:
|:00407553
|
:00407580 mov  eax, dword ptr [ecx+00000144] <==从串首取第一遍的运算结果
:00407586 mov  dl, byte ptr [ecx+eax+00000148]
:0040758D mov  al, byte ptr [esp+04]     <==取4个字的密匙表
:00407591 xor  dl, al             <==4位一组,做XOR运算
:00407593 mov  eax, dword ptr [esp+08]
:00407597 mov  byte ptr [eax], dl
:00407599 mov  edx, dword ptr [ecx+00000144]
:0040759F inc  edx
:004075A0 and  edx, 80000003
:004075A6 jns  004075AD
:004075A8 dec  edx
:004075A9 or  edx, FFFFFFFC
:004075AC inc  edx
           
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004075A6(C)
|
:004075AD mov dword ptr [ecx+00000144], edx
:004075B3 mov eax, 00000001
:004075B8 ret 0008

下面进行注册码效验:

* Referenced by a CALL at Address:
|:0040751C
|
:004075C0 sub  esp, 0000001C
:004075C3 mov  eax, 00000009
:004075C8 push ebp
:004075C9 push esi
:004075CA mov  esi, ecx
:004075CC xor  ebp, ebp
:004075CE mov  ecx, dword ptr [esp+2C]     <==取前面记下的码长关键字
:004075D2 push edi
:004075D3 mov  edi, dword ptr [esp+2C]   <==取第二遍运算结果的串首地址
:004075D7 add  ecx, FFFFFFFC          <==减4
:004075DA cmp  ecx, eax             <==大于等于9?
:004075DC jl  004075F0
:004075DE lea  ebp, dword ptr [ecx-08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004075EE(C)
|
:004075E1 mov dl, byte ptr [eax+edi]       <==从第9个数取值
:004075E4 mov byte ptr [esi+eax+00000143], dl   <==存入存储单元
:004075EB inc eax
:004075EC cmp eax, ecx            <==取N个,N=码长关键字-4-9
:004075EE jle 004075E1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004075DC(C)
|
:004075F0 mov  byte ptr [esi+ebp+0000014C], 00
:004075F8 mov  di, word ptr [edi+03]
:004075FC and  edi, 0000FFFF
:00407602 lea  eax, dword ptr [esp+0C]
:00407606 push edi

* Possible StringData Ref from Code Obj ->"N=%d"
                                  |
:00407607 push  0046F31C
:0040760C push  eax

* Reference To: USER32.wsprintfA, Ord:0000h
                                  |
:0040760D Call dword ptr [004672B4]
:00407613 add  esi, 000001B1
:00407619 push 0000000A
:0040761B push esi
:0040761C push edi
:0040761D call 004628BC
:00407622 add  esp, 00000018
:00407625 mov  dword ptr [004771BC], 00262D75
:0040762F mov  eax, 00000001
:00407634 pop  edi
:00407635 pop  esi
:00407636 pop  ebp
:00407637 add  esp, 0000001C
:0040763A ret  0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B633(C)
|
:0044B655 mov  ecx, dword ptr [esp+1C]
:0044B659 mov  byte ptr [esp+ecx+000002AC], 00
:0044B661 lea  ecx, dword ptr [esp+00000090]
:0044B668 call 00407640          <==在EAX中返回4075E4处存储的值
:0044B66D mov  edx, dword ptr [esp+28]   <==取406FAE处存储的校验关键字
:0044B671 and  edx, 000000FF
:0044B677 cmp  eax, edx         此帖在看雪论坛上的地址:Turbo Note+ V4.4
[size=1.75]ReGet Junior 2.0破解手记(一) (3千字)_ 来自看雪论坛精华6发布者:Editor发布于:2002-02-23 18:18ReGet Junior 2.0破解手记(一)

作者: 囚童[FCG][BCG]
课题: (一)解除ReGet Junior 2.0广告动画画面
背景: PACKED WITH ASProtect v1.2
下载: http://www.cn778.net/download/c_bexpress.zip
工具: TRW2000
    Ultra Edit 32
    FileMon V4.29

ReGet Junior 2.0支持HTTP与FTP续传,内建10种语言,可以按照需要来切换.可设置
/储存下传文件名单,万一FTP Server接不通,ReGet会一直会试下传文件直到完成为
止.它也可以下传整个目录,自定同时下传文件的数目,节省时间与省却不少麻烦。

ReGet Junior 2.0是一个免费软件,但在开始运行时会有一个一现而过的显示软件名
称和版本号的BANNER,程序主窗口的上方始终有一个动画广告BANNER窗口,没有注册入口。

先运行FileMon,然后安装ReGet Junior 2.0,从FileMon可以看到在安装过程中,向
C:\WINDOWS\SYSTEM目录中写入了一些文件,其中有.DLL文件和.GIF文件。

将安装后的ReGet Junior 2.0主文件regetjr.exe做一个备份.

运行regetjr.exe,从FileMon可以看到,regetjr会从C:\WINDOWS\SYSTEM中读取一些
文件,其中有cd_clint.dll、b_372800.GIF和b_372900.GIF.



解除ReGet Junior 2.0广告动画画面方法一:

用资源管理器打开C:\WINDOWS\SYSTEM,在AdCache子目录下找到图形动画文件b_372800
.GIF和b_372900.GIF,将其后缀改为G1F或干脆删除。

再次运行regetjr.exe,广告动画画面消失。



解除ReGet Junior 2.0广告动画画面方法二:

启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.

运行regetjr.exe,当显示软件名称和版本号的BANNER完整出现并稳定时,按下CTRL+N,
程序被TRW2000中断。

下指令: BPX GETPROCADDRESS
按F5,程序运行并被TRW截获.(若截获不到,可退出重来。)
下指令: BD* ;清中断.

下指令: PMODULE
回到regetjr域:

0167:00429207  PUSH  DWORD 0046D2B8
0167:0042920E  CALL  NEAR [004601F0]
0167:00429214  XOR  EDI,EDI
0167:00429214  XOR  EDI,EDI
0167:00429216  MOV  [ESI+28],EAX
0167:00429219  CMP  EAX,EDI
0167:0042921B  JZ    0042923B
0167:0042921D  MOV  EBX,[004600F0]
0167:00429223  PUSH  DWORD 0046D2AC
0167:00429228  PUSH  EAX
0167:00429229  CALL  EBX
0167:0042922B  PUSH  DWORD 0046D29C 〈== 光标停在这里
0167:00429230  MOV  [ESI+30],EAX 〈== EAX=10015792
0167:00429233  PUSH  DWORD [ESI+28]
0167:00429236  CALL  EBX
0167:00429238  MOV  [ESI+2C],EAX

向上看,在进入这个CALL之前,程序在429223处向堆栈压入一个数46D2AC,我们来看
一下里面是什么。

下指令: D DS:46D2AC
TRW给出:
0046D2AC 53 65 72 76 69 63 65 53-68 6F 77 00 43 44 5F 43 ServiceShow.CD_C
0046D2BC 6C 69 6E 74 2E 64 6C 6C-00 00 00 00 2E 45 58 45 lint.dll.....EXE

哈,正是我们在安装ReGet Junior 2.0时看到的cd_clint.dll。ServiceShow是它的一
个函数,EAX=10015792是函数的入口。

下指令: BPX ServiceShow
按F5,程序运行并被TRW截获.来到cd_clint域:

0167:10015792  MOV  EAX,10037056 〈== 光标停在这里
0167:10015797  CALL  10027CC8
0167:1001579C  SUB  ESP,BYTE +14
0167:1001579F  PUSH  EBX
0167:100157A0  PUSH  ESI
0167:100157A1  PUSH  EDI
0167:100157A2  MOV  EDI,[EBP+08] 〈==  EDI<=E5
0167:100157A5  LEA  ECX,[EBP-18]
0167:100157A8  MOV  [EBP-10],ESP
0167:100157AB  MOV  [1004DA30],EDI
0167:100157B1  CALL  10013BE6
0167:100157B6  MOV  EBX,[EBP+28]

下指令: BD* ;清中断.

按F10,一路走一路看,来到100157A2,此时EDI=E5。
试着下指令: REDI 0
按F5试一下。好,广告动画画面消失。

我们来动手改程序:

下指令: A 100157A2L

100157A2 XOR EDI EDIL
100157A4 NOPL
100157A5L

记下修改前后的十六进制码.
使用Ultra Edit 32,按下面的方法对cd_clint.dll做最后的修改:

578B7D088D4DE8
--31FF90------

将修改后的cd_clint.dll存放在与regetjr.exe同一个目录中。

解除ReGet Junior 2.0广告动画画面的任务到此完成。相关文章:ReGet Junior 2.0破解手记(一) ReGet Junior 2.0破解手记(二) ReGet Junior 2.0破解手记(三
此帖在看雪论坛上的地址:ReGet Junior 2.0(一)
[size=1.75]ReGet Junior 2.0破解手记(二) (4千字)_ 来自看雪论坛精华4发布者:Editor发布于:2015-11-15 16:30ReGet Junior 2.0破解手记(二)

作者: 囚童[FCG][BCG]
课题: (二)解除ReGet Junior 2.0显示软件名称和版本号的BANNER,做内存补丁
背景: PACKED WITH ASProtect v1.2
下载: http://www.cn778.net/download/c_bexpress.zip
工具: TRW2000
    Ultra Edit 32
    R!SC's Process Patcher v1.60

接ReGet Junior 2.0破解手记(一)

在破解手记(一)中,我们讲了解除ReGet Junior 2.0广告动画画面的方法两种。
为便于制作内存补丁,再来介绍一下第三种方法:

解除ReGet Junior 2.0广告动画画面方法三:


启动TRW2000,点OK,TRW2000在屏幕右下角生成一个小图标.


运行regetjr.exe,当显示软件名称和版本号的BANNER完整出现并稳定时,按下CTRL+N,
程序被TRW2000中断。

下指令: BPX GETPROCADDRESS
按F5,程序运行并被TRW截获.(若截获不到,可退出重来。)
下指令: BD* ;清中断.

下指令: PMODULE
回到regetjr域:

0167:00429207 PUSH DWORD 0046D2B8
0167:0042920E CALL NEAR [004601F0]
0167:00429214 XOR  EDI,EDI
0167:00429214 XOR  EDI,EDI
0167:00429216 MOV  [ESI+28],EAX
0167:00429219 CMP  EAX,EDI
0167:0042921B JZ   0042923B
0167:0042921D MOV  EBX,[004600F0]
0167:00429223 PUSH DWORD 0046D2AC
0167:00429228 PUSH EAX
0167:00429229 CALL EBX
0167:0042922B PUSH DWORD 0046D29C 〈== 光标停在这里
0167:00429230 MOV  [ESI+30],EAX
0167:00429233 PUSH DWORD [ESI+28]
0167:00429236 CALL EBX
0167:00429238 MOV  [ESI+2C],EAX


下指令: BD* ;清中断.


按F10,一路来到:

0167:004292DA PUSH EDI
0167:004292DB PUSH EDI
0167:004292DC PUSH BYTE +04
0167:004292DE PUSH DWORD [ESI+24]
0167:004292E1 PUSH DWORD [ESI+20]
0167:004292E4 PUSH EDI
0167:004292E5 PUSH EDI
0167:004292E6 PUSH DWORD [ESI+04]
0167:004292E9 PUSH EDI
0167:004292EA PUSH BYTE +01
0167:004292EC PUSH DWORD E5 〈== 注意这个值
0167:004292F1 CALL EAX
0167:004292F3 TEST EAX,EAX

下指令: CODE ON
记下这里的代码:
4292ED:E5

下指令: E CS:4292ED 0

按F5,程序运行,好,广告动画画面消失。


解除ReGet Junior 2.0显示软件名称和版本号的BANNER


重复上述过程①
显示软件名称和版本号的BANNER出现在屏幕上,并被TRW截获.(若截获不到,可退出
重来。)

按F12,直到显示软件名称和版本号的BANNER从屏幕上消失,我们来到:

0167:0042949F AND  DWORD [EBP-04],BYTE +00
0167:004294A3 MOV  ECX,EBX
0167:004294A5 CALL 0042D7FD  〈== 设断
0167:004294AA AND  DWORD [EDI],BYTE +00 〈== 光标停在这里
0167:004294AD JMP  0042957C


下指令: BPX 4294A5
按F5退出。

重新运行regetjr.exe,当显示软件名称和版本号的BANNER尚未出现时,按下CTRL+N。
反复按CTRL+F5,CTRL+N,直到上述代码出现在TRW代码窗口中。
此时光标停留在设断一行上。

按F8跟进,来到:

0167:0042D7FD PUSH EBP 〈== 光标停在这里
0167:0042D7FE MOV  EBP,ESP
0167:0042D800 SUB  ESP,EC
0167:0042D806 PUSH EBX
0167:0042D807 MOV  EBX,ECX
0167:0042D809 PUSH ESI
0167:0042D80A PUSH EDI
0167:0042D80B MOV  EAX,[EBX+04]
0167:0042D80E LEA  EDI,[EBX+04]
0167:0042D811 XOR  ESI,ESI
0167:0042D813 MOV  [004772B8],EAX
0167:0042D818 CMP  [004658B0],ESI
0167:0042D81E JNZ  0042D82B

按F10,一路来到:

0167:0042DB2A MOV  EAX,[EBP-10]
0167:0042DB2D PUSH DWORD 03E8
0167:0042DB32 PUSH EAX
0167:0042DB33 MOV  ECX,[EAX]
0167:0042DB35 CALL NEAR [ECX+64] 〈== 光标停在这里
0167:0042DB38 MOV  EAX,[EBP-08]
0167:0042DB3B CMP  EAX,ESI
0167:0042DB3D JZ   0042DB45

按F8跟进,来到:

0167:121A3DC0 SUB  ESP,BYTE +1C
0167:121A3DC3 PUSH ESI
0167:121A3DC4 PUSH EDI
0167:121A3DC5 MOV  EDI,[ESP+2C]
0167:121A3DC9 TEST EDI,EDI
0167:121A3DCB JNL  121A3DDA 〈== 注意这里
0167:121A3DCD POP  EDI
0167:121A3DCE MOV  EAX,80070057
0167:121A3DD3 POP  ESI
0167:121A3DD4 ADD  ESP,BYTE +1C
0167:121A3DD7 RET  08


下指令: CODE ON
记下这里的代码:
121A3DCB:7D 0D

下指令: E CS:121A3DCB 90 90

按F5,程序运行,好,显示软件名称和版本号的BANNER不再在屏幕上出现。


根据上面收集到的数据,我们可以利用R!SC's Process Patcher v1.60制作一个内存
补丁。

其脚本如下:


;ReGetJR补丁程序
;撤除广告动画画面及显示软件名称和版本号的BANNER
;loadregetjr.rpp
T=7000:        ;投放次数
F=REGETJR.EXE:       ;修补对象
O=loadregetjr.EXE:      ;输出文件
P=121A3DCB/7D,0D/90,90:      ;替换码
P=4292ED/E5/00:       ;替换码
$        ;终止


将脚本载入R!SC's Process Patcher v1.60中,按“SAVE AND BUILD SCRIPT"按钮。
输出文件loadregetjr.EXE自动生成。

将生成的输出文件loadregetjr.EXE存放在与regetjr.exe同一个目录中。

运行loadregetjr.EXE,程序启动较慢,但不再出现显示软件名称和版本号的BANNER,
广告动画画面也从窗口中消失。

解除ReGet Junior 2.0显示软件名称和版本号的BANNER,消除ReGet Junior 2.0广告
动画画面,补丁制作的任务到此完成。相关文章:ReGet Junior 2.0破解手记(一) ReGet Junior 2.0破解手记(二) ReGet Junior 2.0破解手记(三
此帖在看雪论坛上的地址:ReGet Junior 2.0(二)
[size=1.75]ReGet Junior 2.0破解手记(三) (1千字)_ 来自看雪论坛精华4发布者:Editor发布于:2015-11-15 17:36ReGet Junior 2.0破解手记(三)

作者: 囚童[FCG][BCG]
课题: (三)脱除ReGet Junior 2.0主程序文件regetjr.exe的壳
背景: PACKED WITH ASProtect v1.2
下载: http://www.cn778.net/download/c_bexpress.zip
工具: CASPR v1.012
    EditPlus 2
    language2000中文版v4.51
    FileInfo2.40
    TYP
    BTW2000

接ReGet Junior 2.0破解手记(一)、(二)

在破解手记(一)、(二)中,我们讲了如何解除ReGet Junior 2.0广告动画画面的方
法三种,解除显示软件名称和版本号的BANNER的方法,并制作了内存补丁。

这里,我们介绍如何给ReGet Junior 2.0主程序文件regetjr.exe脱壳。

regetjr.exe原有的尺寸为497K。


用language2000中文版v4.51、FileInfo2.40和TYP都没能查出regetjr.exe是否被压
缩过,但用BTW2000和TRW2000观察到的程序入口分别是440A2A和400040,据此可以判
断:regetjr.exe是被压缩过的,怀疑是ASProtect v1.2。


用EditPlus建立CASPR.ini文件如下:

[Options]
Import=0x00000001
Export=0x00000001
TLS=0x00000001
Resource=0x00000001
Relocation=0x00000000
Overlay=0x00000001

[RVAs]
;IMAGE_IMPORT_DESCRIPTOR
IID=0x00000000

;IMAGE_IMPORT_OriginalFirstThunk_DATAs
IIOFTD=0x00000000

;IMAGE_IMPORT_BY_NAMEs
IIBN=0x00000000

;IMAGE_IMPORT_DESCRIPTOR.DLLNAME
IIDDN=0x00000000

;IMAGE_EXPORT_DIRECTORY
IED=0x00000000

;IMAGE_TLS_DIRECTORY
ITLSD=0x00000000

;IMAGE_RESOURCE_DIRECTORY
IRD=0x00000000

;IMAGE_RESOURCE_DATA
IRData=0x00000000

;IMAGE_RELOCATION
IR=0x00000000



用EditPlus建立批文件Un-pack.BAT如下:

CASPR -L regetjr.exe -P Output



建立一个工作目录Un-pack。将下列文件拷入这个目录:

Caspr.exe
Caspr.ini
Caspr1.dll
Caspr2.dll
regetjr.exe
Un-pack.BAT


在Un-pack目录下再建一个子目录Output。


运行Un-pack.BAT
Caspr在Output目录中生成一个新文件regetjr.ex_
没有异常提示出现。


将新文件regetjr.ex_以后缀EXE更名后,覆盖原有的regetjr.exe


用BTW2000复查程序入口点为440A2A。


试运行新的regetjr.exe,没有异常提示出现,检验各项功能齐全。

新的regetjr.exe尺寸为982K。

脱壳成功。相关文章:ReGet Junior 2.0破解手记(一) ReGet Junior 2.0破解手记(二) ReGet Junior 2.0破解手记(三
此帖在看雪论坛上的地址:ReGet Junior 2.0(三)
[size=1.75]如何将按钮变为灰色(应网友要求修改稿) (3千字)_ 来自看雪论坛精华5发布者:Editor发布于:2002-08-07 12:50如何将按钮变为灰色(应网友要求修改稿)

作者:囚童
工具:TRW2000
   ULTRAEDIT

1、运行TRW2000,将其最小化。

2、运行应用程序,调出要修改的按钮所在窗口。
  如图:
  
  此例中要改注册按钮为灰色,注意:注册两字后面的(R)。

3、按CTRL+N调出TRW2000。

4、下PMODULE指令,返回WINDOWS窗口。

5、点要修改的按钮,被TRW2000拦截,光标停留在应用程序域。

6、在光标所在行上面的那个CALL上下断。

7、重新运行应用程序,再次调出要修改的按钮所在窗口,被所下断点拦截。

8、清中断并下指令:
  S DS:400000 L100000 28 26 52 29 (回车)
  或
  S DS:400000 L100000 '(&R)' (回车)
  
  其中:40000是应用程序的基地址,100000是程序装入内存的总长度(可根据实际情况灵
  活掌握),搜索码28 26 52 29是(&R)的ASCII码。之所以用(&R),而不用“注册”搜索,
  是因为(R)较容易观察到,不用翻译中文机器码。

  回车后TRW2000返回下面的信息:

  409BA5 IN XXXXXX!.RSRC+EBA5

  说明TRW2000找到该按钮菜单的相关信息在.RSRC段的+EBA5,
  此时数据窗口也显示409BA5开始的数据。

9、按ALT+↑,使数据的内存映象从409B95开始显示

  490B80 65 6C 70 43 6C 69 63 6B-00 00 09 54 4D 65 6E 75 elpClick...TMenu
  490B90 49 74 65 6D 02 52 31 07-43 61 70 74 69 6F 6E 06 Item.R1.Caption.
  490BA0 08 D7 A2 B2 E1 28 26 52-29 0A 49 6D 61 67 65 49 .注册(&R).ImageI
  490BB0 6E 64 65 78 02 02 07 4F-6E 43 6C 69 63 6B 07 0B ndex...OnClick..
  490BC0 62 74 6E 52 65 67 43 6C-69 63 6B 00 00 09 54 4D btnRegClick...TM

  可以看出,将07 OnClick 07 0B btnRegClick改为07 Enabled 08,并补足其余的空间,
  即可使注册按钮变为灰色,且被禁止激活。

10、用以下数据制作LOADER,或用ULTRAEDIT作如下修改:
  
  409BA9:
  0A 49 6D 61 67 65 49 6E 64 65 78 02 02 07 4F 6E 43 6C 69 63 6B 07 0B 62 74 6E 52 65 67 43 6C 69 63 6B
  20 20 20 20 20 20 20 20 20 20 20 20 0A 49 6D 61 67 65 49 6E 64 65 78 02 02 07,45 6E 61 62 6C 65 64 08

  其中:12个空格是因为OnClick 07 0B btnRegClick去掉后,Enabled 08比它少12个字
  符,因此用空格补足。空格只能补在可显示的字符串后面,其他参数项的位置向后顺延。

11、用以下数据制作LOADER,或用ULTRAEDIT作如下修改:
  
  409BA0:
  08
  14

  串长度增加0Ch。

12、存盘,重新运行应用程序,注册按钮变为灰色,且被禁止激活。

  改后内存映象:
  490B80 65 6C 70 43 6C 69 63 6B-00 00 09 54 4D 65 6E 75 elpClick...TMenu
  490B90 49 74 65 6D 02 52 31 07-43 61 70 74 69 6F 6E 06 Item.R1.Caption.
  490BA0 14 D7 A2 B2 E1 28 26 52-29 20 20 20 20 20 20 20 .注册(&R)     
  490BB0 20 20 20 20 20 0A 49 6D-61 67 65 49 6E 64 65 78      .ImageIndex
  490BC0 02 02 07 45 6E 61 62 6C-65 64 08 00 00 09 54 4D ...Enabled....TM

改前后图象对比:
  [url=][/url]


说明:

①、该按钮菜单项的资源可以用下面的方式来表达:

  object R1: TMenuItem            ;菜单项
   Caption = '注册(&R)'          ;可显示的字符串
   ImageIndex = 2                ;图标
   OnClick = btnRegClick        ;键响应
  end
  
  它在内存中有一个固定的长度,
  其中ImageIndex、OnClick等参数所占用的内存空间是可用空间。

  修改后:

  object R1: TMenuItem
   Caption = '注册(&R)            '
   ImageIndex = 2
   Enabled = False
  end

②、修改内存后,原有空间内的所有内容都必须是合法的资源表达,否则WINDOWS会认为资源
  找不到而报错。无法表达的空间可以填写合法而无意义的参数或用空格来填充。空格只能
  补在可显示的字符串后面。

③、内存中字串前面的一字节十六进制数,指示字串的长度,若字串长度被修改,该数值也应
  做相应的修改。

④、上面的示例若改为使用ImageIndex参数所占用的内存空间,修改的字节数会大大减少,
  适合制作LOADER,但图标将消失。此帖在看雪论坛上的地址:将按钮变为灰色
[size=1.75]解除DLSupCBT的NAG窗和KEY文件制作(一)_ 来自看雪论坛精华6发布者:Editor发布于:2003-07-06 03:09解除DLSupCBT的NAG窗和KEY文件制作(一)OllyDbg初级教程,给初学者作者:囚童[FCG][BCG]
课题:解除DLSupCBT的NAG窗和30天时间限制,制作KEY文件
对象:DLSuperCBT - Byte Compare Differences 2.1e
平台:win95/98/ME, winNT/2000/XP
尺寸:743,936
作者:Don Ludlow
背景:Borland's Delphi 5,无壳
下载:http://www.dlsuperc.com/dlsupcbtni.zip
工具:OllyDbg v1.09 修正汉化版
   Ultraedit-32通过这篇文章我们将向你介绍在OllyDbg中:●如何设置/取消断点
●如何设置/取消硬件断点
●如何修改和永久保存代码
●如何用“回溯法”来跟踪数据源。
●如何修改主窗口标题栏
●如何查找KEY文件的关键项在示例中我们还用到了一种颇有新意的演示跟踪过程的表达方法[首创]。DLSupCBT 是一个按字节进行再同步比较的文件处理工具。它比较二进制文件之间的不同,在
不匹配的字节中进行再同步。在相邻行中以ASCII方式报告十六进制代码的不同。允许使用偏
移值在两个文件中进行局部比较。两个文件之间的变化可以添加到新的文件或从旧的文件删
除。在文件之间出现数据移位时,它具有与大多数其它按字节进行比较的文件处理工具不同的
特色,它显示具有指导意义的结果。换句话说,当字节数增加或减少时,大多数其它按字节进
行比较的文件处理工具不能够使自己再同步,而DLSupCBT可以再同步这种变化。个人和非盈利组织在作者网站上可以免费注册。但我注册后,收到作者两封回信,声称:
“Attached is your registered package containing the DLSuperCBT program.”实际什
么也没有。即便这样,我们在研究它时也不再有什么担心了。下面的内容按由浅入深分层次来讲:如果你是一个初学者,你只需要看**一楼**里的内容.如果你是一个有心的初学者,你可以看一下**二楼**里的内容.如果你是一个有耐心的初学者,你最好看一下**三楼**里的内容.我们开始。解除NAG窗先试运行下载来的DLSupCBT,显示是一个30天试用版本。调整一下时间,只有一个NAG窗,好
象没有什么时间制。时间限制版本的意思是讲,超过时间限制,继续拥有时间限制版本将是违
法的。但有可能作者并没有采取技术措施来限制。**一楼(入门)**
启动OLLYDBG,点菜单“文件/打开(或按F3)”将DLSupCBT装入OLLYDBG,按F9运行。等到NAG窗出现,点OLLYDBG,使OLLYDBG成为活动窗口。
按F12暂停,按CTRL+F9(执行到返回),OLLYDBG将停留在返回指令RETN处,连续按CTRL+F9,
直到OLLYDBG不再响应。
点DLSupCBT,使DLSupCBT成为活动窗口。点“YES USE”按钮,此时OLLYDBG被激活,我们来
到OLLYDBG的CPU窗口:00449A59  |. CALL DLSupCBT.004497D8
00449A5E  \. RETN                        //光标停在这里,按F8单步跳过
00449A5F   .^JMP DLSupCBT.0040372C
00449A64   .^JMP SHORT DLSupCBT.00449A56
00449A66   . XOR EAX,EAX                 //上面按F8后,光标停在这里
00449A68   . POP EDX
00449A69   . POP ECX向上看,没有发现可疑的条件跳转。
继续按CTRL+F9,来到:00449AED   > MOV EAX,DWORD PTR SS:[EBP-10]
00449AF0   . MOV DWORD PTR DS:[480950],EAX
00449AF5   . MOV EAX,DWORD PTR SS:[EBP-4]
00449AF8   . AND BYTE PTR DS:[EAX+2CC],0F7
00449AFF   . RETN                        //光标停在这里,按F8
00449B00   .^JMP DLSupCBT.0040372C
00449B05   .^JMP DLSupCBT.00449A73
00449B0A   . XOR EAX,EAX                 //上面按F8后,光标停在这里。
00449B0C   . POP EDX                     //向上看,没有发现可疑的条件跳转,
00449B0D   . POP ECX                     //继续按CTRL+F9
00449B0E   . POP ECX
00449B0F   . MOV DWORD PTR FS:[EAX],EDX
00449B12   . PUSH DLSupCBT.00449B27
00449B17   > LEA EAX,DWORD PTR SS:[EBP-20]
00449B1A   . CALL DLSupCBT.00403C94
00449B1F   . RETN                        //光标停在这里,按F8
00449B20   .^JMP DLSupCBT.0040372C
00449B25   .^JMP SHORT DLSupCBT.00449B17
00449B27   . MOV EAX,DWORD PTR SS:[EBP-8]//上面按F8后,光标停在这里。
00449B2A   . POP ESI               //向上看,没有发现可疑的条件跳转,继续按CTRL+F9
00449B2B   . POP EBX
00449B2C   . MOV ESP,EBP
00449B2E   . POP EBP
00449B2F   . RETN                        //光标停在这里,按F8按F8后,来到:00478357   > MOV EAX,DWORD PTR SS:[EBP-4]
0047835A   . CMP BYTE PTR DS:[EAX+6AF],0       //可疑的条件跳转,双击设断
00478361     JE DLSupCBT.004783EE
00478367   . MOV EAX,DWORD PTR DS:[5A2F8C]
0047836C   . MOV EAX,DWORD PTR DS:[EAX+2E0]
00478372   . MOV EDX,DLSupCBT.00478B40  ;  ASCII "DLSuperCBT 30 Day Trial Version"
                .
                .
                .
004783D3   . MOV EAX,DWORD PTR DS:[4813CC]
004783D8   . MOV EAX,DWORD PTR DS:[EAX]
004783DA   . MOV EDX,DWORD PTR DS:[EAX]
004783DC   . CALL DWORD PTR DS:[EDX+D8]         //这是显示NAG的CALL
004783E2   . MOV EAX,DWORD PTR DS:[4813CC]      //光标停在这里,向上看
004783E7   . MOV EAX,DWORD PTR DS:[EAX]
004783E9   . CALL DLSupCBT.00449874向上看47835A处是一个可疑的条件跳转,双击47835A左边第二栏设断(或按F2),0047835A将
变为红色,表示这里是一个断点。仔细看下面的程序,4783DC是显示NAG的CALL,如果47835A处跳,显然NAG不会再显示。强制跳转的方法很简单:重启后按F9运行,OLLYDBG将中断在47835A。将光标指向478361,按
空格键,OLLYDBG弹出一个汇编窗口,先把“用NOP填充”打上勾,然后将编辑框中的JE改写为
JMP,点“汇编”,看到什么?JE DLSupCBT.004783EE变成了红色的JMP DLSupCBT.004783EE,
后面不足的部分还自动补上了NOP。试着按一下F9运行,NAG窗不见了,DLSupCBT主窗口左下角
的一行字“DLSuperCBT 30 Day Trial Version”也不见了。如果改好了以后,右键选“复制到可执行文件”,可以将改变永久保存。我们已经知道,可以通过直接修改代码来解除NAG窗。**一楼(结束)****二楼(更上一层楼)**但我们不这样做,因为解除软件的限制可能要修改多处代码。重新运行DLSupCBT,OLLYDBG将中断在47835A。
看OLLYDBG左边反汇编窗和DUMP窗中间夹着的部分,显示:DS:[00E72143]=01。
这是什么?这是告诉你[EAX+6AF]中的具体值为1,怪不得不跳呢。如果你将光标指向这一行,按右键并选“修改数据”,你可以在修改数据窗口将01改为00,
再运行下去,NAG窗同样消失。但我们不这样改。我们要找到它的根。在OLLYDBG的CPU窗口的左下方是DUMP窗口,在DUMP窗口点一下HEX跟随栏,然后按CTL+G,在弹
出的转存跟随窗口中输入E72143,点“确定”。下面的DUMP窗将显示E72143起始的数据段。
用光标将DUMP窗口字符串第一个十六进制字“01”加亮,右击,在右键菜单上选“断点/硬件
写入/BYTE”,这样,我们就在E72143设置了一个硬件断点。本来我们也可以设置内存写入断点来完成同样的工作,但它有很多缺点:
①该段数据处于非活动状态时,无法设置断点。
②为了观察数据段的活动状态,必须单独开启一个数据转存窗口。
③程序重启时断点自动清除,无法长时间保存。
④无法浏览内存断点列表。顺手在上面CPU窗47835A处双击左边第二栏(或按F2),0047835A将变回原来的颜色,表示断
点已清除。按CTRL+F2,重新开始DLSuperCBT。
按F9,OLLYDBG中断在按F9运行,OLLYDBG第一次中断在:0040302A   . REP STOS DWORD PTR ES:[EDI]  //EDI=E72140
                                         //EAX=0这是一个清空内存操作,不理它。按F9运行,OLLYDBG第二次中断在:004780EA   > MOV EAX,DWORD PTR DS:[4815C0]          //=408D01
004780EF   . MOV AL,BYTE PTR DS:[EAX]               //试用版标志来自这里,双击设断
004780F1   . MOV EDX,DWORD PTR SS:[EBP-4]           //
004780F4   . MOV BYTE PTR DS:[EDX+6AF],AL           //光标停在这里,向上看  
004780FA   . MOV EBX,1B原来E72143中的值01来自[4815C0],这是一个常量,可以在4780EF设断来验证,得知来源地
址为481310,初始值为408D01。验证的方法算作一道作业,你自己去做。按ALT+B(或在工具栏上点蓝色的方形“B”按钮)调出断点窗口,将光标指向00478336处,按
右键并选“DISABLE”(或直接按空格键)使断点处于非激活状态。事实上,408D01是未注册版标志,408D00是注册版标志。用ULTRAEDIT很容易将408D01改为
408D00(在7FB10),NAG窗消失。我们不这样做。
或许你要问:DLSupCBT主窗口左下角的一行字“DLSuperCBT 30 Day Trial Version”不见
了,但原地还留有一个“a”,是不是没有解干净?问得好。我们来查验一下。当光标指向这个“a”时,出现“Registered User for Program”的黄色提示。就是说,有了这个'a',恰恰意味着当前是正版。不过,当光标指向“DLSuperCBT 30 Day Trial Version”时,也同样会出现“Registered
User for Program”的黄色提示。这与“DLSuperCBT 30 Day Trial Version”实际并没有时
间限制一样自相矛盾。我们现在知道了从注册标志着手,比简单地改跳转要可靠,而且可能有较少的工作量。剩下的问题是主窗口的标题栏还有"(UnRegistered) DLSuperCBT Resynchronizing Byte
Compare Program"的字样。它与'a'显得格格不入。尝试了一些办法,比如内存搜索、资源分析,都没有找到上面的字符串。也没有发现有从文件
或注册表之类的地方读出。或许是拼接?有道理。上面字符串的片断确实存在。试着在内存中搜索"(UnRegistered)",倒是有一个,但跟踪下去就没有了结果。"DLSuperCBT"
也有不少,也没跟出什么结果。好,我们盯上" Resynchronizing Byte Compare Program"了。按CTRL+F2,重新开始DLSuperCBT。
按CTL+B,调出二进制搜索窗口,先将“整个段块”勾上,
在ASCII栏内键入“ Resynchronizing”,点“确定”,来到:00478984   . 20 52 65 73 79>ASCII " Resynchronizing"
00478994   . 20 42 79 74 65>ASCII " Byte Compare Pr"
004789A4   . 6F 67 72 61 6D>ASCII "ogram",0用光标将478984这一行加亮,右键选“在转存中跟随数值”,在OLLYDBG的CPU窗口的左下方的DUMP
窗将显示478984起始的代码段。用光标将DUMP窗口字符串第一个十六进制字“20”加亮,右击,在右键菜单上选“断点/硬件
访问/BYTE”。按F9,OLLYDBG中断在:00402990  |. FD             STD
00402991  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
00402993  |. 89C1           MOV ECX,EAX
00402995  |. 83E1 03        AND ECX,3
00402998  |. 83C6 03        ADD ESI,3
0040299B  |. 83C7 03        ADD EDI,3
0040299E  |. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
004029A0  |. FC             CLD                                         //光标停在这里REP MOVS是一个数据传送指令,按指定的长度将数据由DS:ESI传送到DS:EDI。STD意味着从
后向前传送。看看右面寄存器窗中的EDI,它指向字符串" Resynchronizing Byte Compare Program"前面的
一个值"T"。这个"T"隐含着什么?我们来看一下。用光标将右面寄存器窗中的EDI的值00E8EE71加亮,右键选“在转存中跟随数值”,下面的
DUMP窗将显示E8EE71起始的数据段。向上调整DUMP窗的滑块,我们看见什么?00E8EE51                       20
00E8EE59  28 55 6E 52 65 67 69 73  (UnRegis
00E8EE61  74 65 72 65 64 29 20 44  tered) D
00E8EE69  4C 53 75 70 65 72 43 42  LSuperCB
00E8EE71  54 20 52 65 73 79 6E 63  T Resync
00E8EE79  68 72 6F 6E 69 7A 69 6E  hronizin
00E8EE81  67 20 42 79 74 65 20 43  g Byte C
00E8EE89  6F 6D 70 61 72 65 20 50  ompare P
00E8EE91  72 6F 67 72 61 6D        rogram哈,刚拼接出来的窗口标题!那么,标题的前半部分又是从哪里来的呢?仔细看一下右面寄存器窗中的EBX,它指向字符串" (UnRegistered) DLSuperCBT",恰恰就是
那前半部分。用光标将右面寄存器窗中的EBX的值00E8EBA0加亮,右键选“在转存中跟随数值”,下面的
DUMP窗将显示E8EBA0起始的数据段。
我们尝试使用“回溯法”来找到它的来源。用我们前面用过的老办法,用光标将DUMP窗口字符串第一个十六进制字“20”加亮,右击,在
右键菜单上选“断点/硬件写入/BYTE”。点菜单“调试/硬件断点”调出“硬件断点”窗,可以看到已经有了两个硬件断点。将478984
的断点删除。按CTRL+F2,重新开始DLSuperCBT。按F9,OLLYDBG产生一个中断。我们看到右面寄存器窗中ECX的值为E8EBA0,这表明E8EBA0所在的段
已经是活动段,我们可以跟随了。如果它是非活动的,可以继续按F9,直到它处于活动状态。用光标将右面寄存器窗中的ECX的值00E8EBA0加亮,右键选“在转存中跟随数值”,下面的
DUMP窗将显示E8EBA0起始的数据段。盯着CPU窗口左下方的DUMP窗口,连续按动F9,直到DUMP窗口中出现" Resynchronizing Byte
Compare Program"。从CPU窗口可以看出,当前仍然是REP MOVS数据传送指令,看一下ESI-1的值,是0012FA8C,处
于堆栈中。堆栈的使用是相当频繁的,继续用原来的方法回溯,耗时费力。我们可以这样:点菜单“调试/硬件断点”调出“硬件断点”窗。将E8EBA0的断点删除。连续按两下CTRL+F9,再按一下F8,来到:00478165   . 8D55 81        LEA EDX,DWORD PTR SS:[EBP-7F]
00478168   . 8D85 74FCFFFF  LEA EAX,DWORD PTR SS:[EBP-38C]
0047816E   . E8 E9A9F8FF    CALL DLSupCBT.00402B5C
00478173   . BA 508A4700    MOV EDX,DLSupCBT.00478A50           ;  ASCII 0B," DLSuperCBT"
00478178   . 8D85 74FCFFFF  LEA EAX,DWORD PTR SS:[EBP-38C]
0047817E   . B1 65          MOV CL,65
00478180   . E8 A7A9F8FF    CALL DLSupCBT.00402B2C
00478185   . 8D95 74FCFFFF  LEA EDX,DWORD PTR SS:[EBP-38C]        //在这里设断
0047818B   . 8D85 DCFCFFFF  LEA EAX,DWORD PTR SS:[EBP-324]
00478191   . E8 22BDF8FF    CALL DLSupCBT.00403EB8
00478196   . 8B95 DCFCFFFF  MOV EDX,DWORD PTR SS:[EBP-324]         //光标停在这里我们将这称作“向上回溯两级”。本来我们想把将新的断点设在478185。但向上一看,478173
引用了" DLSuperCBT",这种字符串前面加空格的做法显然是为了拼接。于是我们根据478191
的CALL的处理结果,推断478173之前,内存中应该已经有了“(UnRegistered)”。于是我们尝
试将新的断点设在478165。重启DLSuperCBT,OLLYDBG中断在478165。看OLLYDBG左边CPU窗和DUMP窗中间夹着的部分,显示:Stack Address=0012FD99, (ASCII 0F, " (UnRegistered)")如果再向上回溯,我们会发现,12FD99中的字符串" (UnRegistered)",是由另一个串
")XdXe8rXe2t4sXiXgXe2R4n6U8("(怎么样?似曾见过?在跟E8EBA0时?)经过4780E8至
478165的程序解密而来的。此时只要将12FD99改为ASCII 0D, " (Registered)",标题栏将显示:"(Registered) DLSuperCBT Resynchronizing Byte Compare Program"
由于我们的指导思想是:“不打菩萨”--不改动原作。所以我们另外编了一个小小的
LOADER(“再塑金身”),在入口处将4815C0的值408D01改为408D00,在4780E8将12FD99的值
ASCII 0F," (UnRegistered)"改为ASCII 0D, " (Registered)",然后直接跳到478165,不再
运行中间那一段解密程序。编写LOADER不是本文要讨论的内容,不再赘述。大功告成,俨然一个正版。此帖在看雪论坛上的地址:DLSupCBT
[size=1.1]解除DLSupCBT的NAG窗和KEY文件制作(二)解除DLSupCBT的NAG窗和KEY文件制作[原创] OLLYDBG初级教程,给初学者 (13千字)
发布者:Editor发布于:2015-11-15 17:08

OLLYDBG初级教程,给初学者

作者:囚童[FCG][BCG]
课题:解除DLSupCBT的NAG窗和30天时间限制,制作KEY文件
对象:DLSuperCBT - Byte Compare Differences 2.1e
平台:win95/98/ME, winNT/2000/XP
尺寸:743,936
KEY文件制作根据我们的“不打菩萨”的指导思想,能不能在主程序之外找到解决问题的办法呢?
有,甚至都可以不“再塑金身”。那就是KEY文件。分析一下我们走过的路:因为在47835A有DS:[EAX+6AF]=1才出现了NAG。我们人为地使DS:[EAX+6AF]=0成功地消除了
NAG。那注册版本一定在47835A之前有行动使DS:[EAX+6AF]=0。顺着这个思路我们从47835A
向上看,哇,这里似曾相识:0047830F   > MOV EAX,DWORD PTR DS:[48146C]          //=408D00
00478314   . MOV AL,BYTE PTR DS:[EAX]
00478316   . MOV EDX,DWORD PTR SS:[EBP-4]
00478319   . MOV BYTE PTR DS:[EDX+6AF],AL是不是长得与4780EA那一段象一对双胞胎?哪里不同呢?哈,第一行的地址常量不同,一个是
[4815C0]=01,一个是[48146C]=00(做过作业了么?)。显然,[48146C]里放的是正版标志。那么,程序是怎样启动这个正版标志的呢?下面我们给出启动这个正版标志的一段程序示例:我们认为你是已经具有相应能力的读者,所以没有给出具体是怎样跟踪的,注释也不完整,相
信通过你自己的努力,完全可以看懂。*******************************************************************示例中用到的表达方法[首创]:=>:跟进当前CALL<=(XXXXXX):从XXXXXX的CALL中返回<= 寄存器=值:从上一行的CALL返回的寄存器的值行地址前面的0的个数和缩进可以区分该行所在的调用层次********************************************************************=>000445CE9   . CALL DWORD PTR DS:[EBX+2B8]=00476C38/004780EA   > MOV EAX,DWORD PTR DS:[4815C0]
|004780EF   . MOV AL,BYTE PTR DS:[EAX]
|004780F1   . MOV EDX,DWORD PTR SS:[EBP-4]
|004780F4   . MOV BYTE PTR DS:[EDX+6AF],AL//=01,来自[481310]=01
|                 .                           00E72143 00//置未注册版标志
|                 .
|                 .
|                 .
|0047812E   . MOV EDX,DLSupCBT.00481384 //=")XdXe8rXe2t4sX"
|                      ||                              // "iXgXe2R4n6U8("
|                     \||/    解密窗口标题
|                      \/
|00478189   . LEA EDX,DWORD PTR SS:[EBP-7F]=" (UnRegistered)"
|
|=>004781F9   . CALL DLSupCBT.00408934   0408934  /$ PUSH EBX
   0408935  |. MOV EBX,EAX
   0408937  |. MOV EAX,EBX
   =>0408939  |. CALL DLSupCBT.004088CC

      4088D8  |. LEA EAX,DWORD PTR SS:[EBP-14C][0012F8F8]=00E917F4
      4088DE  |. PUSH EAX                                          //DLSupCBT.lic
      4088DF  |. MOV EAX,EBX
      4088E1  |. CALL DLSupCBT.004040D8
      4088E6  |. PUSH EAX                           ; |FileName
      4088E7  |. CALL <JMP.&kernel32.FindFirstFileA>; \FindFirstFileA
      4088EC  |. CMP EAX,-1             <= ax=0013E240(A4)(REG) ax=ffffffff(2.1E)
      4088EF  |. JE SHORT DLSupCBT.00408925//跳(UNREG)
      4088F1  |. PUSH EAX                      ; /hSearch//不跳(REG)
      4088F2  |. CALL <JMP.&kernel32.FindClose>; \FindClose
      4088F7  |. TEST BYTE PTR SS:[EBP-14C],10               //[0012F8F0]=20(REG)
      4088FE  |. JNZ SHORT DLSupCBT.00408925
      408900  |. LEA EAX,DWORD PTR SS:[EBP-C]              //[12FA30]=E711EC(REG)
      408903  |. PUSH EAX                      ;/pLocalFileTime
      408904  |. LEA EAX,DWORD PTR SS:[EBP-138];|[12F904]=36FBD300(REG)
      40890A  |. PUSH EAX                      ;|pFileTime
      40890B  |. CALL <JMP.&kernel32.FileTimeT>;\FileTimeToLocalFileTime
      408910  |. LEA EAX,DWORD PTR SS:[EBP-4]            //[12FA38]=00476FA4(REG)
      408913  |. PUSH EAX                    ;/pDOSTime
      408914  |. LEA EAX,DWORD PTR SS:[EBP-2];|[12FA3A]=FE180047(REG)
      408917  |. PUSH EAX                    ;|pDOSDate
      408918  |. LEA EAX,DWORD PTR SS:[EBP-C];|[12FA30]=451F1300(REG)
      40891B  |. PUSH EAX                    ;|pFileTime
      40891C  |. CALL <JMP.&kernel32.FileTim>;\FileTimeToDosDateTime
      408921  |. TEST EAX,EAX <=EAX=01 [12FA38]=2ED6887D(REG)
      408923  |. JNZ SHORT DLSupCBT.0040892C
      408925  |> MOV DWORD PTR SS:[EBP-4],-1        //[0012FA44]<=FFFFFFFF(UNREG)
      40892C  \> MOV EAX,DWORD PTR SS:[EBP-4]       //[12FA38]=2ED6887D(REG)
   <=(408939) eax=ffffffff(UNREG无DLSupCBT.lic) eax=2ED6887D(REG 有DLSupCBT.lic)
   
  040893E  |. INC EAX                 //eax=0 Zf=1(UNREG) eax=2ED6887E(REG) Zf=0
  040893F  |. SETNE AL                //ZF取反 AL=0(UNREG) AL=01(REG)
|<=(4781F9) AL=0(UNREG) AL=1(REG)
|   
|004781FE   . TEST AL,AL  《 AL=01(REG)<= AL=00(UNREG)
|00478200   . JE DLSupCBT.00478357
|   
|=>0047825F   . CALL DWORD PTR DS:[EBX+40]           ;  DLSupCBT.00453114
  =>0453167  |. CALL DWORD PTR DS:[EBX+38]           ;  DLSupCBT.0045300C     453067  |. MOV EAX,DWORD PTR DS:[EBX+4][E91AF4]            //="DLSupCBT.lic"
     45306A  |. CALL DLSupCBT.004040D8
     45306F  |. PUSH EAX                           //<= EAX=E91AF4 "DLSupCBT.lic"
     453070  |. PUSH 4000                          //允许字符串值的最大长度
     453075  |. MOV EAX,DWORD PTR SS:[EBP-8]
     453078  |. PUSH EAX                           //ReturnBuffer=00E935C8
     453079  |. PUSH 0                             //出错返回默认值
     45307B  |. PUSH 0                             //读取的的键 (Key) 名称
     45307D  |. MOV EAX,ESI
     45307F  |. CALL DLSupCBT.004040D8
     453084  |. PUSH EAX                             ; |读取Section="DLSupCBT"
     453085  |. CALL <JMP.&kernel32.GetPrivateProfil>; \GetPrivateProfileStringA
             |.                                //读取私有文件DLSupCBT.lic中的信息
     45308A  |. TEST EAX,EAX                              <= eax=d读到字节数(REG)
     45308C  |. JE SHORT DLSupCBT.004530B7
     45308E  |. MOV EBX,DWORD PTR SS:[EBP-8]
     453091  |. JMP SHORT DLSupCBT.004530B2
     453093  |> /LEA EAX,DWORD PTR SS:[EBP-C]
     453096  |. |MOV EDX,EBX
     453098  |. |CALL DLSupCBT.00403E4C
     45309D  |. |MOV EDX,DWORD PTR SS:[EBP-C]
     4530A0  |. |MOV EAX,DWORD PTR SS:[EBP-4]
     4530A3  |. |MOV ECX,DWORD PTR DS:[
    =>4530A5  |. |CALL DWORD PTR DS:[ECX+34]=4117FA
      =>411844   . CALL DLSupCBT.00411B24//调用2次        411B7C  |. INC DWORD PTR DS:[EBX+10]//执行2次,为45318B不跳做准备
                                   ++E91B58(REG)
      <=(411844)
    <=(4530A5)
  <=(0453167)  =>0453185  |. CALL DWORD PTR DS:[EDX+14]        ;  DLSupCBT.00411A44 //++E91B58     411A44   . MOV EAX,DWORD PTR DS:[EAX+10]
                                      E91B58 02(REG)
  <=(0453185) eax=0(UNREG) EAX=2(REG)
0453188  |. MOV ESI,EAX
045318A  |. DEC ESI
045318B  |. TEST ESI,ESI ESI                      //=FFFFFFFF(UNREG)
045318D  |. JL SHORT DLSupCBT.004531D3            //跳(UNREG)
045318F  |. INC ESI                               //不跳(REG) EAX=2  =>04531CA  |. |CALL DLSupCBT.00411678            //调用2次
    =>4116B6  |. FF51 34        CALL DWORD PTR DS:[ECX+34]   ;  DLSupCBT.004117FC
      =>411844   . CALL DLSupCBT.00411B24          //调用2次        411B7C  |. INC DWORD PTR DS:[EBX+10]       //执行2次,为47829F不跳做准备
                                   ++E8F1CC
      <=(411844)
    <=(4116B6)
  <=(4531CA)调用2次EAX=12F9F4(REG)
|<=(47825F) [E8F1CC]=2|
|00478262   . MOV EAX,DWORD PTR SS:[EBP-1C]
|00478265   . PUSH EAX
|00478266   . LEA EAX,DWORD PTR SS:[EBP-398]
|0047826C   . PUSH EAX
|0047826D   . MOV ECX,DLSupCBT.00478A98          ;  ASCII "PgmId"
|00478272   . MOV EDX,DLSupCBT.00478690          ;  ASCII "DLSupCBT"
|00478277   . MOV EAX,DWORD PTR SS:[EBP-10]
|0047827A   . MOV EBX,DWORD PTR DS:[EAX]
|=>0047827C   . CALL DWORD PTR DS:[EBX]            ;  DLSupCBT.00452E40
   
   0452E5A  |. PUSH EAX                                //[E91AF4]="DLSupCBT.lic"
   0452E5B  |. PUSH 800
   0452E60  |. LEA EAX,DWORD PTR SS:[EBP-800]
   0452E66  |. PUSH EAX
   0452E67  |. MOV EAX,DWORD PTR SS:[EBP+C]
   0452E6A  |. CALL DLSupCBT.004040D8
   0452E6F  |. PUSH EAX                          ; EAX=0
   0452E70  |. MOV EAX,EDI
   0452E72  |. CALL DLSupCBT.004040D8
   0452E77  |. PUSH EAX                          ; EAX=00478A98,KEY指向"PgmId"
   0452E78  |. MOV EAX,ESI
   0452E7A  |. CALL DLSupCBT.004040D8
   0452E7F  |. PUSH EAX                           ; |Section = "DLSupCBT"
   0452E80  |. CALL <JMP.&kernel32.GetPrivateProf>; \GetPrivateProfileStringA
                                                    //读KEY
   0452E85  |. MOV ECX,EAX
   0452E87  |. LEA EDX,DWORD PTR SS:[EBP-800]
   0452E8D  |. MOV EAX,DWORD PTR SS:[EBP+8]
   0452E90  |. CALL DLSupCBT.00403D7C|<=(47827C)
|0047827E   . MOV EDX,DWORD PTR SS:[EBP-398]
|00478284   . LEA EAX,DWORD PTR SS:[EBP-1C]
|00478287   . CALL DLSupCBT.00403D2C
|0047828C   . XOR EAX,EAX
|0047828E   . PUSH EBP
|0047828F   . PUSH DLSupCBT.0047834D
|00478294   . PUSH DWORD PTR FS:[EAX]
|00478297   . MOV DWORD PTR FS:[EAX],ESP
|0047829A   . MOV EAX,DWORD PTR SS:[EBP-14]
|0047829D   . MOV EDX,DWORD PTR DS:[EAX]
|0047829F   . CALL DWORD PTR DS:[EDX+14]
|0047829F   . CALL DWORD PTR DS:[EDX+14][E8F1CC]=2
|004782A2   . CMP EAX,2  <= EAX=02(REG) <= EAX=00(UNREG)
|004782A5   . JNZ DLSupCBT.00478343               //跳(UNREG)
|
|004782AB   . LEA EAX,DWORD PTR SS:[EBP-39C]
|004782B1   . MOV EDX,DLSupCBT.004813A0       ; 指向"(D4DCE3E0D3E2E6)攒汔逾?"
|004782B6   . MOV ECX,7
|004782BB   . CALL DLSupCBT.00403EC4
|004782C0   . MOV EDX,DWORD PTR SS:[EBP-39C]//[4813A0]=(D4DCE3E0D3E2E6)攒汔逾?
|004782C6   . MOV EAX,DWORD PTR SS:[EBP-1C]
|004782C9   . CALL DLSupCBT.00404024
|004782CE   . JNZ SHORT DLSupCBT.00478343                         <= FZ=1(REG)
|004782D0   . 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
|004782D3   . 50             PUSH EAX
|004782D4   . 8D85 60FCFFFF  LEA EAX,DWORD PTR SS:[EBP-3A0]
|004782DA   . 50             PUSH EAX
|004782DB   . B9 A88A4700    MOV ECX,DLSupCBT.00478AA8         ;  ASCII "UserId"
|004782E0   . BA 90864700    MOV EDX,DLSupCBT.00478690         ;  ASCII "DLSupCBT"
|004782E5   . 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
|004782E8   . 8B18           MOV EBX,DWORD PTR DS:[EAX]
|004782EA   . FF13           CALL DWORD PTR DS:[EBX]    ;  DLSupCBT.00452E40 读KEY
|
|00478333   > MOV EAX,DWORD PTR DS:[48146C]                  //[00481314]=00408D00
|00478338   . MOV AL,BYTE PTR DS:[EAX]
|0047833A   . MOV EDX,DWORD PTR SS:[EBP-4]
|0047833D   . MOV BYTE PTR DS:[EDX+6AF],AL=0                 //置注册版标志
\                              00E72143     01
<=(000445CE9)这个示例展示了REG和UNREG的两条路线:REG:置未注册版标志/解密窗口标题/在当前目录查找DLSupCBT.lic文件+转换文件的时间格式
  /两者都成功,退出4781F9时置成功标志AL=01/执行47825F以保证在执行47829F时返回
  EAX=02+执行4782C9时返回FZ=1/置注册版标志/到478357去判断是否显示NAG窗(不显示)UNREG:置未注册版标志/解密窗口标题/在当前目录查找DLSupCBT.lic文件+转换文件的时间格
   式/其中一项不成功,退出4781F9时置失败标志AL=0/带着未注册版标志到478357去判断
   是否显示NAG窗(当然是显示NAG窗喽)看起来是KEY文件DLSupCBT.lic在决定是否启动注册版标志的。
如果你什么也没有做,程序将按UNREG的路线走。如果你在当前目录中生成一个长度为0的文件,将它命名为DLSupCBT.lic,你就可以沿着REG的
路线走到47829F。如果你在SupCBT.lic文件中加入以下内容:[DLSupCBT]              //在453084你可以看到Section="DLSupCBT"
User=囚童               //随便写的
Password=8765432        //随便写的你就可以沿着REG的路线走到4782C9。或许你要问:你怎么知道DLSupCBT要加方括号呢?
我们只能告诉你:积累。在ini文件中,Section是用方括号括起来的段名。那为什么随便写的KEY写了两条,而不是三条,比如还有COMPANY=呢?
因为在4782A2的条件是2。因为你还无法走到478333,结果还是和UNREG一样。不过不要气馁,毕竟你已经看到了希望。我们现在停在4782C9,我们是不是无事可做了呢?来看一下SS:[EBP-39C]指向哪里?
[4813A0]="(D4DCE3E0D3E2E6)攒汔逾?"这是一堆什么东西?老外在什么情况下才用这样的
码?怎么?还是个常量?不会就是PASSWORD吧?好,不妨试一试。到ULTRAEDIT-32中搜索一下"D4DCE3E0D3E2E6",把它拷贝到.lic文件的
PASSWORD=后面,代替随便写的“8765432”。如果你跟进了47827C,你会发现Section(DLSupCBT)的两个KEY中,有一个是"PgmId",我们随
便写的KEY中,哪一个会是"PgmId"呢,应该是"PASSWORD"。好,把它换成"PgmId"。那么,由于4782EA调用的是相同的CALL(452E40),在调用前引用的字符串变量"UserId"就一定
是另一个KEY了。好,把"User"换成"UserId"。试运行。哈,NAG窗不见了,主窗口标题变成了"(Registered) DLSuperCBT Resynchronizing
Byte Compare Program"。主窗口左下角的一行字“DLSuperCBT 30 Day Trial Version”不见
了,代替它的是“囚童”。怎么样?不错吧。只是“囚童”显得单调了些。来,我们动手把
KEY文件DLSuperCBT.lic再润色一下:[DLSupCBT]
UserId=This copy of DLSupCBT is licensed to : 囚童
PgmId=攒汔逾?                                         //D4DCE3E0D3E2E6再运行一次,好多了。
啊哈,这篇文章刚刚写上最后的句号,收到作者的来信:Sorry. I forgot the attachment.Don Ludlow随信附来已注册版本。文件尺寸为743,936,与未注册版本大小相同,只是文件包中多了一个
文件DLSuperCBT.lic。打开来看一下:[DLSupCBT]
UserId=Registered to 囚童
PgmId=攒汔逾?哈,作者到底比我强,表达得即精炼又不单调,佩服。此帖在看雪论坛上的地址:Byte Compare Differences 2.1e,即:解除DLSupCBT的NAG窗和KEY文件制作(二)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2024-12-30 12:18
请在看雪论坛给hmilywen发一条短消息确认这是你自己发布的申请,然后这里回复我审核。
吾爱游客  发表于 2025-1-2 07:33
Hmily 发表于 2024-12-30 12:18
请在看雪论坛给hmilywen发一条短消息确认这是你自己发布的申请,然后这里回复我审核。

短消息已发,请查收。

点评

I D:囚童 邮箱: 申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码! 登陆后请在一周内在此帖报道,否则将删除ID信息。  详情 回复 发表于 2025-1-2 11:36
Hmily 发表于 2025-1-2 11:36
游客 124.64.122.x 发表于 2025-1-2 07:33
短消息已发,请查收。

I D:囚童
邮箱:1298174881@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。
囚童 发表于 2025-1-5 16:35
我来报到!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-10 08:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表