那些年幹過的事(五)—無源碼程序反編譯修改文字

背景:

一同事提到某客戶要求修改產品程序中的一段文字,正常情況下這是很簡單的事情,不需要我這業餘人員參與,但問題在於該客戶使用的是舊版本產品,而舊版本產品的代碼已遺失,這種情況下修改文字就成了一個棘手的工作。幾經輾轉這個事情就找到了我這裏,受不了同事再三託付,我答應其試試。

該程序使用.net 2.0開發。

目的:

需要修改的爲一C/S客戶端界面,在界面中某個label處(假設原文字爲“服務器123!”)增加一段文字描述(假設爲“新增服務器”),使程序可正常運行,兼顧美觀性。

工具手段:

google、UE、.Net Reflector8.1、ildasm、.net framework2.0、自編漢字轉碼工具(javascript)

準備工作:

利用google下載上面提到的幾個工具,並掌握各個工具的使用方法,我這裏大概說說各個工具的用途:

.Net Reflector8.1很有用的工具,可以查看.net編譯程序的源碼格式,用於瞭解程序的編制思路及尋找修改方式;

ildasm.exe可以將.net編譯的可執行程序(dll、exe)反彙編爲il中間格式,該格式可使用ue進行編輯修改;

UE我喜愛的工具,全稱ultraedit,超好用的文本編輯工具,支持hex格式編輯;

.net framework2.0我們修改後的il文件需要依託.net framework2.0進行再次編譯,才能形成可執行文件,其實主要使用ilasm.exe;

自編漢字轉碼工具,這個是我爲了方便自己寫的轉換工具,做得事情不復雜,主要是將字符尤其是中文轉換爲unicode編碼,再將unicode編碼轉換爲il文件中的中文編碼(去掉\u、將雙字節的高低位互換);大家也可以手工轉,在網上搜索unicode在線編碼轉換將字符轉換unicode編碼,手工去掉\u,再將雙字節高低位互換。(我會單獨寫文章把這個工具與大家共享的)。

因爲不確定客戶使用的哪個小版本產品,所以我讓同事從客戶處把程序直接拷貝給我了。

修改步驟

相關準備工作做完後就要開戰了。

1、首先出場的當然是.Net Reflector8.1了

將需要修改的程序文件(如果有多個文件不確定是哪個的話就需要都託付給reflector反編譯先),通過Reflector查找文字“服務器123!”,這樣可快速定位這個界面的源碼位置,通過讀源碼我們知道了這個界面上有哪些控件,哪些控件與我們待修改的內容有關。

2、輪到二號人物出場了ildasm.exe

打開ildasm.exe,將待修改的程序文件拖放到該程序,選擇轉存爲123.il文件,轉存時注意選擇utf-8編碼,關鍵人物的出場都是短暫的,短暫但確很重要。

3、三號人物UE出場

使用UE打開123.il,這個地方我走了我彎路,在UE中直接找中文“服務器123!”,找了N遍都沒有,後來google了很久,找到有專家說要轉成unicode編碼,到網上找工具將服務器123!轉成了unicode編碼,直接按照轉換的16進制搜索,還是找不到,當時俺那個崩潰呀,心想難道不在123.il,後來又查找123.res(也是ildasm.exe的產物),但都是徒勞無貨。後來在UE和reflector中反覆走查代碼,俺終於發現了規律。原來il文件中又對unicode編碼進行了雙字節高低位互換,這個折磨人的編碼問題呀。還是給同學們展示個實例吧:

中文:服務器 unicode編碼:\u670D\u52A1\u5668 il編碼:0D 67 A1 52 68 56

4、編寫漢字轉換工具

我比較懶或者說不喜歡做重複工作,我一想到要一個一個漢字的轉編碼、調順序,而且客戶要加的文字還不少,那個頭疼啊。一怒之下爲配合三號人物完成工作俺連夜編寫了一個html頁面(使用javascrip腳本)用於轉換漢字編碼,好久不寫代碼了,N多生疏,心裏默默感激google與大衆的分享,讓俺能完成這個小小工具。

5、UE繼續出場

工具有了就好辦多了,首先通過工具將原始文字“服務器123!”轉換爲il編碼(暫且這麼叫吧),在UE中查找,OK一查即中,鼠標停留在字符串結束位置,將待增加文字“新增服務器”轉換爲il編碼,直接在UE中粘貼即可(服務器123!之後),這樣文字修改就可以了。

6、.net framework2.0出場

第五步我們只是把程序中間格式文件修改好了,但還不是可執行程序,要編譯出.net 2.0的程序當然還得使用它本身了,但il的編譯需要使用的是ilasm.exe。

該命令需要在cmd窗口中執行,打開cmd,切換到il文件所在目錄下,執行如下命令:c:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe 123.il /output=123.exe /res:123.res /exe

其中c:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe爲ilasm.exe的路徑;123.il爲我們修改後的il文件;/output=123.exe指我們要輸出的文件名稱;/res:123.res表示要將對應的資源文件也編譯到程序中;/exe爲輸出的文件格式爲exe,如果原始文件dll的,則需要使用/dll

這一步俺也走了彎路,大家不要走呀,我第一次運行命令的時候,沒有帶/res參數,導致編譯出來的exe文件沒有應用程序圖標.

編譯成功後,目錄下會生成123.exe文件

7、測試

對於編譯的123.exe,打開運行觀察是否是期望的結果。如果你幸運修改的文字較少不影響控件美觀性,那麼本次任務就圓滿結束了。但我很不幸運,增加的文字較多,導致在lable中文字顯示不全。所以俺還需要附帶贈送如下步驟。

8、調整控件位置及大小

在reflector中找到對應控件,找到其location、size設置的大小,還發現該控件的autosize爲true,這是不行的,需要修改爲false,我們才能調整他的大小。

在UE中查找對應位置,可按照控件方法名定位,數字可能涉及16進制轉換,在修改時要注意。

IL_025a: ldc.i4.1 //需要修改爲ldc.i4.0,表示false

IL_025b: callvirt instance void [System.Windows.Forms]System.Windows.Forms.Control::set_AutoSize(bool) //設置autosize

修改控件size大小

IL_02be: ldc.i4 0xdb //長度 按照需要修改吧

IL_02c0: ldc.i4.s 30 //高度 按照需要修改吧

IL_02c2: newobj instance void [System.Drawing]System.Drawing.Size::.ctor(int32,

int32)

修改完成後,重複6、7步驟,直到控件位置調整正常。

9、完工

將程序發給客戶驗證,OK!

此次任務完工。

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