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/函数