int _tmain(int argc, _TCHAR* argv[])
{
printf("%s","我是中國人");
return 0;
}
這個幾句代碼編譯的程序,在IDA6.4 Demo的字符串窗口還能識別出來
但是到了IDA6.6,就顯示亂碼了
BUG呀,弄起我IDA6.4一直不敢刪除,算了忍忍,覺得到了後面的版本出來了,會修復,每天看看雪,等啊等,終於等到IDA6.8出來了,一開程序,發現MD仍是這樣,情何以堪,
不曉得官方,是否是由於上次是中國區泄露了他們的軟件,特別不照顧中國客戶,仍是怎麼的,沒辦法了,仍是本身動手吧,本身動手豐衣足食。
逆向IDA,尋尋覓覓,倒騰到字符串列表管理的幾個函數
get_strlist_item refresh_strlist get_strlist_qty
get_ascii_contents2 ea2str str2user print_ascii_string_type areacb_t_get_area,
調試跟蹤仍是無果。
次日休息好,繼續調試,猜想,調試,
想是否是QT版本的問題,替換成IDA6.4用的4.8.3,仍是不行,差個函數沒有,試了幾回,很差替換,會報錯,只好放棄這個方案。繼續打開IDA逆向IDA,漫無目的的想從代碼中,尋找其餘線索,可是內心仍是沒底的,幾回想放棄,又不捨
搜索字符串嘛Strings,Strings window,String仍是無果,
試了試Ansi,Asc
真的是靈感只青睞于思考着的人們啊。老天把我引導了這個地方
感受好像發現了契機,另外開個IDA,依然逆向這個示例程序,按Alt+A,這個窗口出現了
encording,對這就是encording,編碼問題,F1結合IDA的幫助文檔,知道了IDA關於ANSI編碼問題的操做使用,如何添加一個編碼名,更改默認編碼, 首先測試默認已有的編碼名<default>,<no conversion>,UTF-16LE,UTF-8,都是沒法使ANSI中文識別出來的,接着嘗試添加簡體中文編碼GBK,成功了,能夠添加的(IDA還支持添加‘CP+代碼頁整數’,‘代碼頁整數’的形式的編碼名),而後應用到"8位和多字節字符串"。
再次打開Strings Windows,OH, YES!終於正確了,熟悉的中文出現了
最後思考,爲何IDA6.4和IDA6.8都是Default(<no conversion>)
卻顯示結果不一樣呢,可是他們的幫助文檔中關於<default> 和<no conversion>的描述都是相同的,Default(<no conversion>)這句的意思是Default(默認)就是<no conversion>,
,如上圖,編碼可選列表中也沒有<default>這項,足以見得<default>就是<no conversion>
而幫助文檔中顯示
<default> - the default encoding for this string type (8-bit or 16-bit)
<no conversion> - the string bytes are printed using the current system encoding (after translating with XlatAsciiOutput array in the configuration file).
<no conversion>是the current system encoding(當前系統編碼),那麼理論上應該簡體中文的系統就是簡體中文爲<no conversion>的表明了。但是IDA6.8中卻默認顯示亂碼,沒法正確顯示。
足以見得這是一個BUG。
修復方式是:
1.每次新逆向一個程序時,去'Options'->'ASCII string style'中將ANSI字符串設置成簡體中文。
2.上面的方案,太麻煩了,要用戶留心一個事情,不符合程序設計的初衷,寫程序的初衷就是讓機器自動去完成那些咱們不想記住,不想完成,繁瑣機械的任務,提升生產效率。因此接着我寫了一個IDA插件,會在IDB初始化時,自動幫你添加一個當前代碼頁的編碼名,並將當前"8位和多字節字符串"設置到這個編碼名上。
下面是本插件的程序及源碼,請解壓後把bin目錄下的兩個文件放到IDA6.8的插件目錄(plugins)中。其餘IDA版本的用戶可能須要本身編譯源碼。
AutoSetToLocalAnsiCodePage.7z
最後說一句,仍是請你們支持正版,若是你們都等着使用盜版,hex-rays就沒資金繼續開發完善這麼優秀的軟件,給咱們繼續使用,這樣就是一個惡性循環了,很差。有錢的就買正版,在公司單位上班的須要用到IDA做爲工做工具就要求公司買正版。
20160514:
本插件升級到第二版,如今已添加對各類形式的Unicode字符串及各國ANSI編碼字符集的字符串的自動識別功能,如UTF8,UTF16LE,UTF16BE等。依然開源,以方便用戶定製修改,目前只測試了PE文件,其餘平臺的二進制可執行文件也應該大體支持吧。
識別功能使用了notepad2-mod中的幾個函數,微軟視窗系統的MLang接口及IBM的ICU函數庫。
參考地址:
http://xhmikosr.io/notepad2-mod/
https://msdn.microsoft.com/en-us/library/aa741220(v=vs.85).aspx#Code_Page_Detection
http://site.icu-project.org/函數