修改指標法破解VB程式-Fast PC Linker-III (8千字)

看雪資料發表於2001-06-29

修改指標法破解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一行的前面加上一個分號";",然後存檔,就萬事大吉了.

相關文章