某國產字型的破解兼最土的檢視UniCode編碼漢字方法兼壓縮資源釋放。 (7千字)

看雪資料發表於2015-11-15

某某某某字型破解
Passion慢慢研究
2002-09-27

淘垃圾郵件的時候發現眾多廣告信中的一封是一款字型。去看了看,某某某某(國產,隱去名稱)的確比較美觀,奇怪的是作者居然將字型做成了限制時間執行需要註冊的形式。本人的印象中字型就是一個ttf檔案,哪還談得上什麼註冊可言?現在見到這東西,馬上來了興趣。於是動手。

某某某某.exe檔案必須先執行後,字型列表中才會出現這一款字型,因此必須從EXE檔案下手。直接反一下亂得很,看來加了殼,FI以及GTW看一看是ASPACK,而ASPACKDIE直接脫不太成功。於是用TRW2000載入,PNEWSEC後到Code段入口中斷,然後--倒黴的是TRW2000忽然沒有PEDUMP命令了!用MAKEPE提示輸入表重建錯誤,看來什麼都得手工來。
PNEWSEC到入口452F3C,將入口的PUSH EBP等改成JMP 452F3C作死迴圈狀,退出TRW,啟動Procdump,Full Dump該“某某某某.exe”,Rebuild PE,再修改其入口為52F3C,儲存後用UltraEdit開啟,查剛才改的“E9 FB FF FF FF”,改回原來的“55 8B EC 83 C4”,儲存後正常執行,脫殼成功。

GTW已經說它是用Delphi編的了。用DeDe反,有倆Form,一個是主視窗,另外一個卻不是註冊視窗,而是一個含有系統托盤區PopupMenu的隱藏視窗。另外該程式八成是用Delphi 6寫的,因為窗體的dfm資源儲存的是UNICODE的形式,漢字全是#38544#34255#31383#21475的形式,沒法子,想了個歪主意,利用網頁來看它。

題外話:用網頁來看#21475形式的UNICODE內容的辦法如下:

*******************************************************

<html>
<head>
<title>NewPage1</title> <meta http-equiv="Content-Type"
content="text/html; charset=UTF-16"> 關鍵是UTF-16
</HEAD>
<body>
<p>&#38544;&#34255;&#31383;&#21475;
<p>&#20351;&#29992;&#24517;&#35835;'(&S)
<p>&#27880;&#20876;&#36719;&#20214;'[&R]'
<P>&#36864;&#20986;'(&X)'
</body>
</HTML>

*******************************************************

把上面的#38544#34255#31383#21475等貼進來,#號前加上&數字後加上;就基本行了,該網頁在IE中顯示出正確的漢字如下:

隱藏視窗

使用必讀'(&S)

註冊軟體'[&R]'

退出'(&X)'

--這是手頭沒工具時的應急法子。
好了,回到DFM檔案, 

    object Regist: TMenuItem
      Caption = #27880#20876#36719#20214'[&R]'
      OnClick = RegistClick
    end

這是“註冊軟體”選單,點選會彈出註冊視窗。對應的452C6C處的RegistClick程式碼如下:

00452C6C  53                    push    ebx
00452C6D  8BD8                  mov    ebx, eax

* Reference to pointer to GlobalVar_00454C70
|
00452C6F  A14C3F4500            mov    eax, dword ptr [$00453F4C] { 註冊標誌;  }
00452C74  833800                cmp    dword ptr [eax], +$00
00452C77  750C                  jnz    00452C85        // 非0則表示未註冊。

* Possible String Reference to: '軟體已註冊.版權歸xx字業 '
|
00452C79  B8082D4500            mov    eax, $00452D08

* Reference to : TMessageForm._PROC_0042B3BC()        // 已經註冊的話,彈出提示並Exit。
|
00452C7E  E83987FDFF            call    0042B3BC
00452C83  5B                    pop    ebx
00452C84  C3                    ret

00452C85  6A01                  push    $01
00452C87  A1944C4500            mov    eax, dword ptr [$00454C94]
00452C8C  50                    push    eax
00452C8D  6A0F                  push    $0F

* Reference to: Forms.Proc_00452174
|
00452C8F  E8E0F4FFFF            call    00452174    

// 這裡會呼叫一個DLL的函式,動態跟蹤的時候才能看到。

* Reference to pointer to GlobalVar_00454C70    
|
00452C94  8B154C3F4500          mov    edx, [$00453F4C] { 註冊標誌;  }
00452C9A  8902                  mov    [edx], eax
00452C9C  33D2                  xor    edx, edx

* Reference to pointer to GlobalVar_00454C48
|
00452C9E  A1103E4500            mov    eax, dword ptr [$00453E10]
00452CA3  8B0D944C4500          mov    ecx, [$00454C94]
00452CA9  0FB60C11              movzx  ecx, byte ptr [ecx+edx]
00452CAD  8908                  mov    [eax], ecx
00452CAF  42                    inc    edx
00452CB0  83C004                add    eax, +$04
00452CB3  83FA0A                cmp    edx, +$0A
00452CB6  75EB                  jnz    00452CA3

* Reference to pointer to GlobalVar_00454C70
|
00452CB8  A14C3F4500            mov    eax, dword ptr [$00453F4C] { 註冊標誌;  }
00452CBD  833800                cmp    dword ptr [eax], +$00
00452CC0  750F                  jnz    00452CD1

* Possible String Reference to: 'heng.dll'
|
00452CC2  68242D4500            push    $00452D24

* Reference to: Unit_00406678.Proc_00406848
|
00452CC7  E87C3BFBFF            call    00406848

* Reference to GlobalVar_00454C90
|
00452CCC  A3904C4500            mov    dword ptr [$00454C90], eax
00452CD1  B201                  mov    dl, $01
00452CD3  8BC3                  mov    eax, ebx

* Reference to: Unit1.Proc_00452864
|
00452CD5  E88AFBFFFF            call    00452864

* Reference to control Regist : TMenuItem
|
00452CDA  8B83FC020000          mov    eax, [ebx+$02FC]

* Possible String Reference to: '註冊資訊'
|
00452CE0  BA382D4500            mov    edx, $00452D38

* Reference to: Menus.Proc_004427EC
|
00452CE5  E802FBFEFF            call    004427EC

* Reference to pointer to GlobalVar_00454C70
|
00452CEA  A14C3F4500            mov    eax, dword ptr [$00453F4C] { 註冊標誌;  }
00452CEF  8338FF                cmp    dword ptr [eax], -$01
00452CF2  7509                  jnz    00452CFD
00452CF4  33D2                  xor    edx, edx
00452CF6  8BC3                  mov    eax, ebx

* Reference to: Unit1.Proc_00452864
|
00452CF8  E867FBFFFF            call    00452864
00452CFD  5B                    pop    ebx
00452CFE  C3                    ret

中間看不見什麼敏感資訊,倒是有個神秘的CALL,經動態跟蹤看看,原來是Call LIUYS!HblKey306

* Reference to: Forms.Proc_00452174
|
00452C8F  E8E0F4FFFF            call    00452174    

看來作者也有些防DeDe全反而採取的呼叫DLL來進行註冊的措施。看看SYSTEM目錄下,果然有個LIUYS,也有個輸出函式是HblKey306,要命的是又加了殼。--我對脫DLL的殼不太在行。抱著Try一Try的心態用ProcDump來一下,嘿嘿,脫出一個比原大79K大不少的150多K的DLL來,反反看,沒問題,運氣好又脫成了。

反一把,發現裡頭實在太長太複雜了。而且脫殼後的DLL連輸入函式也看不見,看來這步分析演算法不容易走通。

於是轉到從外邊動手。FormCreate事件裡呼叫了這個DLL中的HblKey306函式,並把返回值EAX放入[$00453F4C],如果這裡把返回值改作0,那麼這個軟體就註冊了。

***************************************

FormCreate事件如下:
00452A78  53                    push    ebx

…………

00452A9D  6A0F                  push    $0F

* Reference to: Forms.Proc_00452174
|
00452A9F  E8D0F6FFFF            call    00452174 { LIUYS!KBLKEY306 } 看返回值是否註冊

* Reference to pointer to GlobalVar_00454C70
|
00452AA4  8B154C3F4500          mov    edx, [$00453F4C] { 註冊標誌;  } 
00452AAA  8902                  mov    [edx], eax    // EAX會返回是否註冊,0代表已經註冊。

    // 改成              mov    [edx], 0    就什麼事都沒了。

…………

00452BAA  C3                    ret

好了,暴力破解透過。但還是不夠爽。想想看,要用一種字型,居然還得啟動一個可執行的程式?要是能從裡頭淘出一個fon檔案就好了。下面來玩這個……

看看該字型的安裝目錄,並沒有什麼特殊的東西,連個DLL也不見一個(除了uninstall的)。回想ProcDump脫殼的時候,該exe檔案使用了兩個名字不太眼熟的DLL,一個是處理註冊問題的LIUYS.dll,那麼理論上另外一個就應該是包含字型資訊的DLL了,而且字型資訊差不多就是以資源的形式放在該DLL中的。
在SYSTEM目錄下找到這個HENG.DLL,一看一M多,八成加了殼(因為漢字字型檔案都是兩三M的)複製出來,用ExeScope一看,有個FONTDA他的資源,看來就是了,不過不能檢視。看來軟體作者比較偏好ASPack,所有的可執行的全部用這個壓縮加殼。

對付這個DLL不像上面的Procdump,光Dump一下用Exescope一看,資源仍然無法檢視,似乎還是沒有解壓縮。正沒法子的時候,想起了有個資源解壓縮的工具freeres,用它開啟,提示資源已經壓縮,是否解壓?解壓後儲存為xxxx.fon檔案,複製進Windows/Font目錄,開啟寫字板敲幾個字選選字型看看,嘿嘿,行了。

相關文章