行業乾貨-如何逆向解決QT程式漢化亂碼問題

逆向驛站發表於2019-01-18

原創宣告

本人是【逆向驛站】公眾號作者,會釋出網路安全、滲透測試、逆向破解、病毒分析等教程原創文章和視訊,你可以關注我的微信公眾號,可以加QQ群:971488972 交流學習,文章都是自己寫的,只有一個要求轉載請註明出處

公眾號二維碼

行業乾貨-如何逆向解決QT程式漢化亂碼問題

逆向驛站公眾號原文連結

行業乾貨-如何逆向解決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了!

行業乾貨-如何逆向解決QT程式漢化亂碼問題

實戰圖文

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

QT開發的國外軟體

不論怎麼搞,都是亂碼

例如漢化下圖中的標題registration

行業乾貨-如何逆向解決QT程式漢化亂碼問題
亂碼

行業乾貨-如何逆向解決QT程式漢化亂碼問題

二.逆向分析尋找原因

1.OD中定位標題字串

程式載入OD,定位"registration",並檢視,程式中都有那些位置會呼叫這個字串,如圖

行業乾貨-如何逆向解決QT程式漢化亂碼問題
發現有三個地方呼叫了這個字串地址,全部下斷點

行業乾貨-如何逆向解決QT程式漢化亂碼問題

2.執行觀察

斷點下好後,執行程式,觀察呼叫字串的邏輯流程,發現下的三個斷點中有兩個在程式啟動會被呼叫,呼叫的目的分別是作為兩個QT庫函式的引數,如下圖

行業乾貨-如何逆向解決QT程式漢化亂碼問題
行業乾貨-如何逆向解決QT程式漢化亂碼問題

3.正向查閱相關函式原始碼

這裡多說一句,玩逆向不只光玩逆向,一直強調逆向是一種思維,逆向破解的逆向就是開發,活用開發資料,逆向破解中往往事半功倍。

安裝QT後就可以看QT各種庫函式的原始碼和資料,如果你想更深入的瞭解,給吃透的話,最好的方式莫過於自己開發,自己逆向分析。 開始尋找目標函式原始碼,everything搜兩個函式類命,QCoreApplication和QMetaObject,如下圖

行業乾貨-如何逆向解決QT程式漢化亂碼問題
行業乾貨-如何逆向解決QT程式漢化亂碼問題
開啟原始碼,閱讀相關函式,原始碼如下
行業乾貨-如何逆向解決QT程式漢化亂碼問題
QCoreApplication::translate函式定義,發現核心引數就是這個列舉型別,當列舉型別為0的時候中文是亂碼,當是1的時候中文沒問題
行業乾貨-如何逆向解決QT程式漢化亂碼問題
QMetaObjcet::tr函式實現,發現這個函式的實質其實是以列舉型別引數為0去呼叫QCoreApplication::translate

4.逆向中驗證上面的正向原始碼 從新載入OD,重新執行,根據上面正向查閱的原始碼資料觀察相應的兩個庫函式在逆向中的體現,如下圖

行業乾貨-如何逆向解決QT程式漢化亂碼問題

行業乾貨-如何逆向解決QT程式漢化亂碼問題

可見,兩個函式其實最終呼叫的都是第一個函式,而核心關鍵點就是列舉型別引數的值,那麼我們在第一個庫函式入口【6A2B5818】下斷點動態執行一下,堆疊中觀察引數的變化,如下動圖

行業乾貨-如何逆向解決QT程式漢化亂碼問題

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

行業乾貨-如何逆向解決QT程式漢化亂碼問題

方法2

行業乾貨-如何逆向解決QT程式漢化亂碼問題

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

notepad++寫入內容,轉碼

行業乾貨-如何逆向解決QT程式漢化亂碼問題

010editor檢視16進位制內容

行業乾貨-如何逆向解決QT程式漢化亂碼問題

OD改字串

行業乾貨-如何逆向解決QT程式漢化亂碼問題

亂碼解決

行業乾貨-如何逆向解決QT程式漢化亂碼問題

四.福利

本期福利就是視訊片源,光相關資料都是目前很多人想找卻找不到的,更不用說視訊片源了,放出來儘可以去傳播,但是不要幹那種修改我版權說是自己視訊的事,那就low了!

網盤動圖展示

行業乾貨-如何逆向解決QT程式漢化亂碼問題


涉及的所有軟體、工具、課件、教程等的網盤連結

  • 關注公眾號:逆向驛站

  • 回覆:網盤

  • 即可獲得

  • 文章頭部有二維碼,也可以直接搜


相關文章

相關文章