乾貨 - 如何逆向解決QT程序漢化中的亂碼問題

作者:逆向驛站
微信公衆號:逆向驛站
知乎:逆向驛站
圖片描述

一款QT開發的國外軟件,大概率是沒有做中文支持的,所以你漢化中,不論怎麼設置編碼都一定是亂碼。面對這個問題,你去互聯網上找答案,答案卻大多是複製粘貼的開發中解決亂碼的文章,可是我們是要逆向中解決,於是吾愛破解、漢化新世紀等找過來,盤搜搜個遍,發現基本不是資源過期就是驢脣不對馬嘴的抄襲貼,所以我來發一篇乾貨

準備

【環境和工具】

  • win7/xp虛擬機環境
  • pdf2any原版安裝程序(qt開發的國外程序,不支持中文,無源碼)
  • ollydbg
  • Radialix 3
  • 010editor
  • qt-win-opensource-4.8.2-mingw.exe(相當於QT庫支持,核心部件)
  • qt-creator-opensource-windows-x86-3.3.0.exe(相當於編輯器而已)
  • MinGW.rar(編譯調試環境)
  • 最後三個是QT開發環境,搭建起來有利於學習,當然如果你不想玩QT開發那其實只用裝第一個就行了,裏面有QT各種庫函數的源碼,遇到相應程序瀏覽源碼即可

【學習層次】

  • 生搬硬套,能解決大部分QT漢化中亂碼問題
  • 搞懂搞透,舉一反三

詳解視頻

乾貨視頻,放出來儘可以去傳播,但是不要幹那種修改我版權說是自己視頻的事,那就low了!

https://v.qq.com/x/page/o0825...


實戰圖文

一.某QT程序漢化中遇亂碼

QT開發的國外軟件,若是沒有特意做中文支持,不論怎麼搞,都是亂碼
例如漢化下圖中的標題registration

圖片描述

亂碼
圖片描述

二.逆向分析尋找原因

1.OD中定位標題字符串

程序載入OD,定位"registration",並查看,程序中都有那些位置會調用這個字符串,如圖
圖片描述

發現有三個地方調用了這個字符串地址,全部下斷點
圖片描述

2.運行觀察

斷點下好後,運行程序,觀察調用字符串的邏輯流程,發現下的三個斷點中有兩個在程序啓動會被調用,調用的目的分別是作爲兩個QT庫函數的參數,如下圖

圖片描述

圖片描述

3.正向查閱相關函數源碼

這裏多說一句,玩逆向不只光玩逆向,一直強調逆向是一種思維,逆向破解的逆向就是開發,活用開發資料,逆向破解中往往事半功倍。
安裝QT後就可以看QT各種庫函數的源碼和資料,如果你想更深入的瞭解,給吃透的話,最好的方式莫過於自己開發,自己逆向分析。
開始尋找目標函數源碼,everything搜兩個函數類命,QCoreApplication和QMetaObject,如下圖
圖片描述

圖片描述

打開源碼,閱讀相關函數,源碼如下

QCoreApplication::translate函數定義,發現核心參數就是這個枚舉類型,當枚舉類型爲0的時候中文是亂碼,當是1的時候中文沒問題

圖片描述

QMetaObjcet::tr函數實現,發現這個函數的實質其實是以枚舉類型參數爲0去調用QCoreApplication::translate

圖片描述

4.逆向中驗證上面的正向源碼

從新載入OD,重新運行,根據上面正向查閱的源碼資料觀察相應的兩個庫函數在逆向中的體現,如下圖

圖片描述
圖片描述

可見,兩個函數其實最終調用的都是第一個函數,而核心關鍵點就是枚舉類型參數的值,那麼我們在第一個庫函數入口【6A2B5818】下斷點動態運行一下,堆棧中觀察參數的變化,如下動圖

圖片描述

5.總結所有線索

  • 標題字符串Registration被函數QCoreApplication::translate作爲參數
  • 標題字符串Registration被函數QMetaObeject::tr作爲參數
  • 兩個函數核心都是QCoreApplication函數
  • QCoreApplication控制中文亂碼核心參數是枚舉類型,值0亂碼,1是utf-8支持中文
  • QMetaObeject::tr調用的QCoreApplication::translate關鍵枚舉類型是0,所以標題最後是不支持中文的,導致一漢化產生亂碼

三、修改QT庫QTCore4.dll解決問題

其實上面的分析如果已經完全搞懂了,其實就已經知道怎麼解決了,而且解決方法有很多,但是都並不能保證所有程序的通用性,畢竟一個開發一個樣,這次他用這個庫函數,沒準下次他用另外一個,所以吃透後,具體問題具體分析纔是任何武功中的“無招勝有招”!針對於這個案例,解決的思路就至少有以下三種

  • 程序領空修改,讓其調用的QMetaObeject::tr更換爲QMetaObeject::trUtf8(閱讀源碼就會發現有這個函數,爲什麼此案例他沒調用這個,因爲是國外軟件,他壓根沒想支持中文,所以他用的是tr而不是trutf8),這樣修改的好處,可以相對保證漢化者的勞動成果,畢竟修改的地方可能會多,而且只在程序領空修改,但通用性差,換個程序百分百沒用
  • 修改庫函數QMetaObeject::tr,讓他調用QCoreApplication::translate時,枚舉參數設置成1,也就是壓根用逆向的方式把QMetaObeject::tr函數改成了QMetaObeject::trUtf8,好處通用性較強。
  • 修改QCoreApplication::translate內部邏輯,讓枚舉類型爲0時,也按爲1的流程邏輯走(最常見的爆破套路),有點通用性很強,極大程度適用很多QT程序漢化亂碼問題

後兩種方法都是修改QT庫函數,所以最終體現是修改了QTcore4.dll這個文件,方法分別如下

方法1

圖片描述

方法2
圖片描述

修改後,生成新的qtcore4.dll文件,替換原版qtcore4.dll就會發現,再去漢化此軟件,亂碼問題已經解決了。我們依然以漢化題目爲示例,OD中修改數據(如果你是大量漢化工作就別用OD了否則累死哦),注意要是utf-8的內存編碼形式,關於編碼常識可以在公衆號內回覆“編碼”閱讀,也可以點此鏈接 編碼常識 ,修改標題registration爲“測試”,“測試”的utf-8內存編碼模式16進制數據是E6 B5 8B E8 AF 95 ,轉換方法如下,有興趣的也可以自己寫工具

notepad++寫入內容,轉碼

圖片描述

010editor查看16進制內容

圖片描述

OD改字符串
圖片描述

亂碼解決
圖片描述


文章中涉及軟件、課件、源碼等均在網盤,爲避免網盤鏈接失效,公衆號中回覆:網盤

歡迎關注微信公衆號:逆向驛站
圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章