發新話題

[分享] 調整ASCII 字串的長度

調整ASCII 字串的長度

在修改 ASCII 字串時,如果要置換上去的文字比較短時,通常都是直接置換上去,並將多餘的字元,以 ASCII 字元 0x0 補上就可以了。這是因為大部份程式及函式操作 ASCII 字串時,都預期它是一個 ASCIIZ 字串,而 ASCIIZ 字串是以 0x0 做為字串終結字元,所以原始字串長度較長,通常並不會有影響。(也有例外情形 )

如果要換上的字串較長,祇要還有空格,並且填上新的字串後,還能保持與下個字串間至少有一個 0x0 字元做間隔,就不會問題。

比較麻煩的是如果要換上的字串太長時,就會面臨欄位不足( 通常兩字串間最大間矩祇有 4 位元組 ),字串無法置入的窘境了。一般遇到這種情形,都會縮減文字,使其能夠置入。但有時太短的文字,並無法完整表達意思,那就是非常頭大的問題了。

這個問題其實並非無解,不過很麻煩,因為私雖然找出方法,可是迄今尚未找到任何合用的工具,如果要使用,祇好採用16進位編輯器,土法鍊鋼手工打造了。

一般說來在程式中的字串,有兩種記錄類型。會使用那一種並不一定,得視程式如何撰寫而定。

第一種是長度字串表 ( 不是指資源中的字串表 ),這一類的字串是一個接一個的排在程式中,而每個字串的開頭,都會有一個前置欄位,用來記錄字串的長度。其結構看起來就如同下圖:

字串 1 長度字串 1 實際內容字串 2 長度字串 2 實際內容
字串 3 長度字串 3 實際內容字串 4 長度字串 4 實際內容

通常這類字串當您要增加長度時,祇要維持整個結構的完整就行了,例如要將 "字串 2" 增加 4 個位元,祇要在 "字串 2 實際內容" 與 "字串 3 長度" 間插入 4 個位元組,並將 "字串 2 長度" 那一欄的值加 4。最後為保持 PE 結構的完整,您要在整個表的後面不使用的部份,刪除去多出的 4 個位元組。這樣就大功告成了。同理,如果您想將之調短,祇要逆向操作即可。

第二種則是 RVA 字串表 ( 這個詞是為區分硬掰的,事實上沒有這種東西,真實的內容通常是程式的變數表或常數表,所以實際情形可能會有變數或常數混在表中 ),其內容可分為兩個部份。訪客無法瀏覽此圖片或連結,請先 註冊登入會員 表及字串表。

RVA表 ( 固定長度,每一欄 4 位元組 )

字串 1 RVA字串 2 RVA字串 3 RVA字串 4 RVA

字串表 ( 長度不定,每一欄固定 4 的倍數 )

字串 1 內容字串 2 內容字串 3 內容字串 4 內容

由於這兩個部份,並沒有規定一定要放在一起 (不過通常都放在一起或距離很近),使得這個工作更形困難。有時您可以肉眼判斷出 RVA 表,但有時您得靠正確的計算來找出它。現在以修改 "字串 2 內容" 為例。

首先您當然是得找到字串在檔案中的位置,接著您要將檔案位置轉換成 RVA 。要轉換它您得從檔案的訪客無法瀏覽此圖片或連結,請先 註冊登入會員 中,查出目前檔案位置是處於那個區段之中,接著可以依下列公式算出字串的 RVA。( 有部份檔案的 RVA 值會剛好等於檔案位置,這跟區段表中 RVA 值及檔案位置是否相同有關,而並非必然相等,其間關係可由下列公式看出。 )

RVA = 區段 RVA + ( 目前檔案位置 - 區段檔案位置 )

有了 RVA 值,自然您就可以利用搜尋的方法,來找出 RVA 表了。要驗證您找到的地方對不對的方法也很簡單,"字串 1 內容" 及 "字串 2 內容" 檔案位置差多少,"字串 1 RVA" 及 "字串 2 RVA" 的值就該差多少,其餘類推。( 特別注意,PC 中大部份值的存放是倒置的,包括 RVA 值,也就是低位元組在前,高位元組在後。)

現在您可以在 "字串 2 內容" 及 "字串 3 內容" 間,插入您需要的位元組數。但不是任何數目都可以,您必需將其調整為 4 的倍數,多出的字元則填以 0x0 字元。這有兩個規則您必須遵守,1. 任兩個字串之間至少必須有一個 0x0 字元做為區隔。2. 任一字串開始的檔案位置, 必須是 4 的倍數。所以若字串位元組數剛好是 4 的倍數,您得用四個 0x0 字元做區隔。

由於從 "字串 3 內容" 開始的那些欄位,其檔案位置全被您插入的位元組推擠到後面去了,所以 RVA 表中從 "字串 3 RVA" 開始及之後的欄位,值當然也全都不對了,所以全得改寫成新值才行。新 RVA = 舊 RVA + 插入位元組數。

最後同樣地為維持 PE 結構的完整,您要在整個表的後面不使用的部份,刪除去多的新增的位元組數目。如果您打算縮短字串一樣可以逆向操作。而如果有的您打算調長,有的打算調短,自然也可以擷長補短,祇要維持兩個表都正確,及兩個表之後的資料在檔案中的位置不變就可以了。

這些操作稍有不慎,就會造成檔案格式的錯誤,所以在編輯之前最好先行備份。


TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。