Make your own free website on Tripod.com



ASCII 字串無法翻譯之修改法 - 偏移量轉換

此處所謂無法翻譯,是指修改後程式不正常,而不是指防改保護。

有時是否將某些句子翻譯成中文後,程式功能就怪怪的呢 ? 可能不小心修改到程式調用的 code 之類的吧。那又很奇怪了,明明字串是該訊息呀,而且修改後的確顯示中文了,怎會如此呢。

其實是程式運作調用的相關字串與訊息共用了同一個字串的關係。可以解決嗎 ? 大多數是可以的,只要它是 RVA 型態字串,而且 code 與訊息的確是可個自指定的 (不是硬式指定)。

以 WinHex 為例,左上角 Offset 字沒辦法翻譯成中文,一旦翻譯,右側細節面板區就出現錯誤,當然不止這裡啦。

翻譯前:

翻譯後:

修正手法,利用修改偏移量的方法,找出調用此字串的 RVA 標示處,通常應該會有多處。然後隨便改一下該標示的值,逐一測試,看實際輸出有沒有變動,有變動通常就是該處了。確定後,再將實際調用訊息的 RVA 標示值指向別處,並將新的位置翻成中文即可。

〔首先測試〕

先將程式還原成未翻譯前。用 UltraEdit 找出 Offset 所在位置,如下圖位於 58BDC

執行 [點睛偏移量轉換器],按 # 載入 WinHex.exe,然後 [實偏移] 輸入 58BDC,便可算出 RVA 代碼 DCA14500

接著用 UltraEdit 找出含有 RVA 代碼 DCA14500 的位置。

找到時,逐一測試。將該處的 DCA14500 改為 DDA14500 (指標往後挪 1 Bytes,詳 [備註])

備註: RVA 代碼是 16 進位,低位元組在前,高位元組在後,也就是反過來看。所以 DC A1 45 00  代表 00 45 A1 DC。將其中 DC 改為 DD,16 進位指標即 DDA14500,如此就是訊息往後挪 1 Bytes。

改好後,啟動 WinHex 看看,是不是畫面馬上變了呢 ? 若由原本 Offset 變成 ffset (少一個字),就可以肯定該指標就是,否則將上面修改的還原,然後繼續試下一個含有 DCA14500 的位置。

 

 

此範例中,經多次測試後找到實際位置如下圖,位於 3201B。請記下此位置,待會需修正。

3201B 此處的 DCA14500 改為 DDA14500 後的執行畫面如下。所以可以確定為此處沒錯。

確定位置後,就進入正式修改階段。

我們另外找一處用來擺放 [偏移(Offset)] 的位置,頭尾連續空白都可以。預計放於 90 處,所以輸入後,切換到 [點睛偏移量轉換器],然後 [實偏移] 輸入 90,便可算出 RVA 代碼 90004000

最後將剛剛 3201B 處的 DDA14500 (原 DCA14500) 改為 90004000 即大功告成。

〔成品〕

實際修改兩處如下。上圖,90 處補上 [偏移]。下圖,將 3201B 處指向 [偏移] 對應的 90 00 40 00

實際測試畫面:

 

∼如塵∼

回索引