czvv 发表于 2016-7-12 09:50:14

改善IDA6.8对中文等非英语国家的ANSI字符串显示支持不佳的问题

改善IDA6.8对中文等非英语国家的ANSI字符串显示支持不佳的问题
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>
而帮助文档中显示
点击图片以查看大图


页: [1]
查看完整版本: 改善IDA6.8对中文等非英语国家的ANSI字符串显示支持不佳的问题