?? win3.txt
字號:
u8016028@cc.nctu.edu.tw 是誰我不知道, 不過他曾讓我感動的久久不能自已. 我曾承
諾當我在破解 windows 軟體有心得時要 post 上來. 最近我相信有些突破, 能破解
dos 軟體的高手嘛, 在不懂 windows SDK 時, 也可以輕松破掉. 感謝很多人幫我 post
上來的東西做貝塔測試, 雖然經(jīng)常有點小問題, 但整個架構(gòu)應(yīng)該讓大家輕松很多. 不過
這方法需要 soft-ice for windows.
型態(tài)一--可注冊 windows 軟體.
特徵是當未注冊時, 一進去會有延遲畫面, 可能有時效限制(30天後不能用之類),
在某個地方有個注冊功能, 打開之後是個對話框, 要求輸入密碼, 有時還有姓名和公司
名稱.
程式如何判斷注冊與否?
通常兩種方式:
1. 在程式碼的某一處, 藏有 "注冊印記". 如00表未注冊, 01為已注冊. 當然也有
很奇怪的數(shù)字, 如 f8 03 表已注冊.
2. install 時程式開 *.ini, 或?qū)懭?win.ini, 把資料存在那里.
程式如何保護:
最通常是用你的name當作key, 經(jīng)過復雜演算法, 算出密碼.
程式流程:
...
...
...
get register data /* 可能從*.ini 念出, 或從程式某一段讀出某一byte */
if registered /* registered 判斷可能是一行指令, 也可以是副程式 */
main_program;
else
if date_expired
end_program;
else
show_unregistered_screen;
main_program;
...
...
main_program()
...
...
注冊處理:
1. 當輸入name, company, password 後, 立即比對, 正確的話立即做注冊處理, 以後
再也不判斷, 不正確要求再輸入. 不輸入 name 的話, 保持 shareware 版.
2. 同1, 但以後一執(zhí)行程式還是會判斷.
3. 輸入時不比對, 只寫入資料於 *.ini, 程式執(zhí)行時再比對.
如何判斷追蹤時我們身在何處:
在dos程式, 進入debuger 後, 只要我們不進入 int 一定留在程式里. 在 windows
call back 方式下, cpu 在程式和系統(tǒng)里跑來跑去, 關(guān)於這點我曾post 過, 或請參閱
相關(guān)書籍. 我們?nèi)绾沃垃F(xiàn)在在系統(tǒng)還是程式中呢? winice 在下面3/4處有一條橫線,
中間有 ***.1, ***.10 之類的東西, 以程式為 abc.exe 為例, 如果是 abc.5, 表示在
abc.exe 里的第5個模組(或副程式中), 系統(tǒng)主要有三個模組 user, kernel, gdi, 所以
看到 user.119 這是在系統(tǒng)中, 別被 user 這個字騙了. 如果你不能肯定, 可用 bc4
所附 tdump.exe 來看 (這是dos程式), export 的就是非系統(tǒng)模組.
如何破解:
在 dos版輸入字串時, 程式可能呼叫 int 21, int 16, int 9. 通常我們攔 int 16.
但如果程式呼叫 int 21, 我們攔 int 16 會不會不妥當呢? 不會! 我們多 P 幾次, 直
到 iret 就從系統(tǒng)回到程式了. 記得這一點, 多P 幾次到 iret 就從系統(tǒng)回來了.
在講破解捷徑前, 我們先作個小實驗. 請先進任一程式(這里以abc.exe為例)的注冊
畫面, 輸入密碼為 121345, ^D 叫出 winice, 看看我們在那里, 如是 user, kernel, gd
s ds:0000 l ffffff '121345' /* 6 個 f 比較穩(wěn) */
通常會在 30:????? 找到, 我們當作是 30:7777 好了.
打入,
bpm 30:7777 rw
按 ^d 回來, 再按下注冊畫面的 <ok>. winice 會因這個中斷點的設(shè)置而停住一個mov
指令, 看一下, 你會發(fā)現(xiàn)在 user.??? 中. 我們多 P幾次, 經(jīng)過幾個retf 會回到
abc.??? 中. 再以 dos 程式為例, vmm 猶如 int 16, user 是 int 21, 經(jīng)過幾個 retf
回到 abc.exe 即為經(jīng)過 iret 回到dos程式. 在dos 里回來之後上一行一定是 int 21,
在 windows 下是什麼呢? 我履試不爽-------GetDlgItemText.
~~~~~~~~~~~~~~
GetDlgItemText 的用法請用 bc4 的 API help 查詢. 前面幾個 push 就是參數(shù)位址,
取回來的就是我們輸入的 '121345'.
通常程式寫法如下:
...
...
push ****
GetDlgItemText /* 取回密碼 */
...
...
push
GetDlgItemText /* 取回名字 */
...
...
push
GetDlgItemText /* 取回公司 */
call **** /* 絕大部份是短程呼叫 */
cmp ax,00
jnz ****
...
...
眼尖的人一定看懂了, call **** 就是比對程式, 只要把 jnz 改掉就 OK. 當然也會有變
型, call **** 只是看看name, company 是不是空白, 空白的話保持 shareware, 非空白
才跑去比對, 所以後面還會有另一個
call ****
cmp ax,00
jnz ****
如果你能解 dos 程式, 這些都難不倒才對.
所以捷徑如下:
1.打開注冊畫面.
2.^D 到 winice, 打上 bpx getdlgitemtext
3. ^d 回來, 輸入每一欄 name , company, password, 按<OK>.
4.winice 會停在 getdlgitem 的第一行, 多 p 幾次, 經(jīng)過 retf 回到程式.
5.把jnz 改掉.
上面方法適合注冊程序1.的情形. 至於2, 在運氣好一點, 你可追進 call **** 中, 把
最後ax 值改掉, 因為一進程式的比對可能也是叫這里. 運氣不好或是3的情形, 則再看
一次程式流程
get register data
if registered
...
...
get register data 通常從 *.ini 念入, 如是寫上注冊印記的, 在上面注冊畫面後,
我們就已經(jīng)破掉. ini 是從那個指令讀入呢? 試試看
bpx getprivateprofileint 和 /* 用bc4 API reference 看一下用法 */
bpx getprivateprofilestring
程式通常如下:
push
getprivateprofileint /* 取得 *.ini number= 這一欄 */
...
...
push
getprivateprofilestring /* 取得 *.ini name= 這一欄 */
...
...
push
getprivateprofilestring /* 取得 *.ini company - 這一欄 */
call ****
cmp ax, 00
jnz
還有一個更穩(wěn)的方法, 因為未注冊一定有干擾畫面, 所謂干擾畫面其實是一個對話框,
windows 開對話框的方法有7,8種, 請把 bc4 api reference dialog boxes 打開來看
有 dialogbox, createdialogbox, createdialogindirect......
bpx dialogbox 不行, 再
pbx createdialogbox 不行, 再
...
...
一路卯下, 總會命中. 然後一路 p 下來, 經(jīng)過retf 回到程式, 比較一下前後 cmp 指令
, 兩三下就解掉.
效果:
破解後任何人都可輸入自己名字再隨便輸個密碼成為注冊版. 壞處是檢查點多幾來
經(jīng)常有小問題.
型態(tài)二--不能注冊 windows 軟體.
我們能做的只是跳過干擾畫面和日期比對, 用上述 bpx dialogbox 方式, 可以解掉.
基本上, 這些都是原則, 程式設(shè)計師經(jīng)常弄些小陷阱, 不過無傷大礙, 當別人告訴你這破
解法這個不能用, 那個不能用時, 再看一次, 多改幾碼, 照樣解掉.
如果那位大哥想和我討論這個破解法, 是不是能請你動手試之後, 拿特定程式來討論比
較好. 另外, 敝人想趁 win95 流行前, 弄些 os2 破解, 不知有沒有人能教我:)
-- ellery
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -