首页
社区
课程
招聘
[原创][201605014已更新,支持了Unicode及各国字符集编码识别]改善IDA6.8对中文等非英语国家的ANSI字符串显示支持不佳的问题
发表于: 2015-12-9 22:21 9969

[原创][201605014已更新,支持了Unicode及各国字符集编码识别]改善IDA6.8对中文等非英语国家的ANSI字符串显示支持不佳的问题

2015-12-9 22:21
9969
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/

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (41)
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
占位。。
2015-12-9 22:22
0
雪    币: 10672
活跃值: (3579)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不错的思路,收藏一个,谢谢楼主分享。
2015-12-9 22:35
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
4
好东东,前天还琢摸这问题呢,,谢谢楼主的东风
2015-12-9 22:55
0
雪    币: 3279
活跃值: (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=sonyps;1405471]int _tmain(int argc, _TCHAR* argv[])
{
        printf("%s","我是中国人");
        return 0;
}
这个几句代码编译的程序,在IDA6.4 Demo的字符串窗口还能识别出来
101736
可是到了IDA6.6,就显示乱码了
10173...[/QUOTE]

好像还不行,你试一下将豪迪QQ群发器加载到IDA,然后用打过你补丁的方法搜索一下字符串,看看能不能全面支持中文显示。
2015-12-10 08:18
0
雪    币: 14371
活跃值: (3949)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错的方法,啊看看。
2015-12-10 08:28
0
雪    币: 8859
活跃值: (3098)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
收藏备用,好东西中国造
2015-12-10 08:35
0
雪    币: 25105
活跃值: (1028)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
打补丁的程序不能全面支持,但手工是可以的.里面有源码,不行自己改改得了.
2015-12-10 08:56
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好东西,思路不错
2015-12-10 08:59
0
雪    币: 229
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
多谢楼主分享。先试一下
2015-12-10 09:29
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
会在IDB初始化时,自动帮你添加一个当前代码页的编码名

有问,当程序使用ASCII编码时,插件会不会强制设置编码 而成为“乱码” ?
2015-12-10 09:58
0
雪    币: 3279
活跃值: (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问具体怎么用?
2015-12-10 10:07
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
可以识别啊
使用插件前

使用插件后

你可能说的为什么他这些字符串为什么不能识别

研究发现他们都是经过加密或者说软件特殊二次编码的


他们使用前都有这个解码过程,所以当然显示的原文是无法识别的,因为是"加密"的,要解密或者说软件二次解码后才能让人识别,不属于ANSI编码的讨论范畴。

至于你后面问怎么使用,把bin下的两个二进制文件放到IDA的插件目录就行了,插件会自动工作。
上传的附件:
2015-12-10 11:34
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
分析Borland系程序时,打开字符串窗口设置的允许显示pascal字符串类型,有助于显示更多字符串,但是好像他们都是英文的,对中文识别应该影响不大。
上传的附件:
2015-12-10 11:45
0
雪    币: 218
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
15
这个插件跟老师介绍的手动添加的GBK显示的字符串功能是一样的,老师还写了一个插件功能是一样的。
2015-12-10 11:52
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
16
当你使用一个非英文文字地区的操作系统(如简体中文)分析其他非英文文字地区作者的程序可能会出现这种情况。
这时你需要手动设置ANSI编码(Alt+A),就和你使用记事本等文本编辑工具打开其他文字地区的文本文件一样,如果软件不能自动识别,需要自己手动指定编码,设置之后显示就更新了,没影响,IDA的输出窗口也有提示:“本插件已经帮你将默认代码页设置到哪个编码页上。”
上传的附件:
2015-12-10 11:52
0
雪    币: 1485
活跃值: (884)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
请问手动添加GBK提示没有找到,使用插件的话会有和你图中的现实

AutoSetToLocalAnsiCodePage has helped you to set default code page to CP936.

这种编码是GBK?
2015-12-10 12:15
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢楼主分享。
2015-12-10 12:19
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
哈哈,说明你们老师也还是蛮有慧根的。
2015-12-10 12:21
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
20
基本等同吧,GBK有很多版本,不同年代的Windows版本实现的版本也不一样,新版本Windows实现的GBK版本比较高。IDA可能使用的libiconv的转码功能,当然也是版本越高实现的标准越高。
本插件获取本机默认代码页的方式是调用windows API:GetACP()得到的,简体中文正好是936。
2015-12-10 12:24
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
21
《加密与解密三》上的方法不管用了?
2015-12-10 12:28
0
雪    币: 4522
活跃值: (5154)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
22
没看过,不知道是什么方法
2015-12-10 12:31
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主辛苦了,谢谢分享
2015-12-10 14:17
0
雪    币: 197
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢楼主分享。
2015-12-10 19:29
0
雪    币: 222
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
UNCOIDE版本的还是不行
2015-12-10 21:19
0
游客
登录 | 注册 方可回帖
返回
//