网络分析专家论坛 netexpert's Archiver

Vader 发表于 2005-2-24 21:26

[小工具]针对MSN和中文解码问题的小工具

看到了好几个关于中文解码的问题和MSN解码的问题。
涉及的问题有两个,一是大多数网络分析工具并不能很好支持中文decode/hex view。二是,诸如MSN等通讯里会包含UTF8的编码/解码。

刚才想了想,花了半个多小时做了个小工具,欢迎大家排砖

------------------
3-23更新了2000字节的长度限制至6000字节

蠕虫 发表于 2005-2-24 21:33

做的!!
工具也有原创啊,走召 弓虽
佩服

Vader 发表于 2005-2-24 21:40

操作说明一

先启动 smartconvert.exe

Vader 发表于 2005-2-24 21:41

例一、然后在Omni里选择相应的包
点中hex部分,激活(蓝色状态),鼠标右键,选择 "Copy"

Vader 发表于 2005-2-24 21:42

例2、Sniffer里,选择相应的包,
点中hex部分,鼠标右键,在这里Sniffer比Omni操作简单,即使之前没选中,
鼠标右键后也会选中目标hex code。选择Copy Heilighted.

Vader 发表于 2005-2-24 21:43

切换/激活刚才打开的smartconvert
可以看到原文复制在上部的那个memobox
convert好的文字在下面那个memobox

Vader 发表于 2005-2-24 21:45

但是是乱码,难道这个小工具不能解析MSN?

旁边有个UTF8Decode flat button,
按一下

Vader 发表于 2005-2-24 21:47

为了避免一些意外,这个小工具一旦发现copy的长度超过2000字节,就不会接受输入。

如果要连续察看若干个包,不想切来切去,可以选中smartconvert中的always on top按钮。

在Raw中,可以用来查看中文的解码。
在UTF8中,可以支持对MSN UTF8类型的包进行察看

That's all. Thanks

1259 发表于 2005-2-24 21:58

实在佩服Vader。。。。真是高手。。。

jingshne 发表于 2005-2-24 22:22

有点感觉崇拜两字含义~~

半个小时写个工具~

除了崇拜还能说什么呢?!!

lipman_boss 发表于 2005-2-25 08:17

高手你好,看了你的文章后有个问题想请教您一下,用sniffer或etherpeek抓的udp包的内容能看到吗?信息没有加过密.谢谢

小宝 发表于 2005-2-25 08:21

你太牛b了

dahliawoo 发表于 2005-2-25 09:11

期待好久,找了好久,终于等到了,太感谢了!

DragonGo 发表于 2005-2-25 09:30

[quote]Originally posted by [i]lipman_boss[/i] at 2005-2-25 08:17 AM:
高手你好,看了你的文章后有个问题想请教您一下,用sniffer或etherpeek抓的udp包的内容能看到吗?信息没有加过密.谢谢 [/quote]
没加密当然能够看到!

DragonGo 发表于 2005-2-25 09:30

还是Vader兄厉害!

。。。。

lipman_boss 发表于 2005-2-25 09:54

怎么看呀?教教我行吗?是绿色聊天软件,我用snifeer 和etherpeek都抓过包,怎么看明文?谢谢帮忙

5icisco 发表于 2005-2-25 10:44

楼上的老兄,应该是编码的问题吧,你的先了解这个聊天软件的编码吧

lipman_boss 发表于 2005-2-25 11:35

我把这个软件发出来吧,高手们帮忙看看,是一个很小的绿色软件

Vader 发表于 2005-2-25 15:24

[quote]Originally posted by [i]lipman_boss[/i] at 2005-2-25 09:54:
怎么看呀?教教我行吗?是绿色聊天软件,我用snifeer 和etherpeek都抓过包,怎么看明文?谢谢帮忙 [/quote]


我大致看了看ipmsg这个软件,
首先,通讯是加密的,或者是经过某种特有序列编码的。两者对比,更像是加密。
其次,软件是日本人写的

所以,基于以上原因,我停止了分析.

lipman_boss 发表于 2005-2-25 15:52

应该是台湾人写的呀,那有办法吗?谢谢答复

如果是日本人我也hate,不过只是对人不对事,是吗?那有办法吗?这么小的软件也用加密?如果那破解,气死小日本。说明我们中国人强大。

[[i] Last edited by lipman_boss on 2005-2-25 at 16:10 [/i]]

smlq 发表于 2005-2-25 16:42

我用ethreal抓了包,但是分析不出来啊,什么内容也没有

Vader 发表于 2005-2-25 16:57

[quote]Originally posted by [i]smlq[/i] at 2005-2-25 16:42:
我用ethreal抓了包,但是分析不出来啊,什么内容也没有 [/quote]
It does not support  Ethereal.

wuhanzhou 发表于 2005-2-25 16:58

[quote]Originally posted by [i]Vader[/i] at 2005-2-25 16:57:

It does not support  Ethereal. [/quote]
我就说嘛?!

smlq 发表于 2005-2-25 17:01

啊,我倒
原本想着放弃sniffer,改用ethereal呢
现在看来,再捡起来吧

smlq 发表于 2005-2-25 17:07

不过又试了一下Dragon的方法,现在倒是可以看到内容了
不过干扰字符太多,几句话得翻腾着找半天才能看到原文
一个字:累
话说回来了,能看内容就8错了,多谢Vader和Dragon!

wuhanzhou 发表于 2005-2-25 17:12

[quote]Originally posted by [i]smlq[/i] at 2005-2-25 17:01:
啊,我倒
原本想着放弃sniffer,改用ethereal呢
现在看来,再捡起来吧 [/quote]
Ethereal很多方面还是不能和Sniffer OmniPeek比的!
目前来说Ethereal,可以放弃,Sniffer和OmniPeek不能!

[[i] Last edited by wuhanzhou on 2005-2-25 at 17:13 [/i]]

Vader 发表于 2005-2-25 17:41

[quote]Originally posted by [i]wuhanzhou[/i] at 2005-2-25 17:12:

Ethereal很多方面还是不能和Sniffer OmniPeek比的!
目前来说Ethereal,可以放弃,Sniffer和OmniPeek不能!

[[i] Last edited by wuhanzhou on 2005-2-25 at 17:13 [/i]] [/quote]

Ethereal 的copy mode会把所有hex code /ascii都复制出来,如果要支持ethereal就要特定写些代码...

lipman_boss 发表于 2005-2-25 19:17

通讯数据采用 RSA/Blofish 加密。

网上查过了,是中国开发的, ipmsg是用RSA/Blofish加密的,vader有办法吗?

[[i] Last edited by lipman_boss on 2005-2-25 at 19:20 [/i]]

Vader 发表于 2005-2-25 19:48

[quote]Originally posted by [i]lipman_boss[/i] at 2005-2-25 19:17:
网上查过了,是中国开发的, ipmsg是用RSA/Blofish加密的,vader有办法吗?

[[i] Last edited by lipman_boss on 2005-2-25 at 19:20 [/i]] [/quote]

查阅 [url]http://www.ipmsg.org[/url]

这位同学,中国人只是汉化了版本而已.

我说的日本人开发的不是因为我有民族偏见,而是日文版的文档我看不懂 :(

RSA/Blowfish 加密的东西如果能够轻易破解,我觉得最需要这样人才的是总参X处

当然,如果在加密体系里进行网络分析也是我最近一直在思索的问题.

lipman_boss 发表于 2005-2-25 22:44

谢谢答复,那msn也不是外国人发明的,中国人不是也能搞定它吗?难道就搞不定小日本了,你看不懂日文,要不我去请一个日语系的来翻译吧.不过我看过ipmsg.org网了,可以转英文的.

[[i] Last edited by lipman_boss on 2005-2-25 at 22:50 [/i]]

flyingking 发表于 2005-2-25 23:45

高手!!!!!
以后多多请教@_@_@_@_@_@_@_@

allback 发表于 2005-2-26 00:56

很历害,这都可以搞定

铁钉 发表于 2005-3-15 16:01

高老庄的高

fanjx 发表于 2005-3-16 13:16

我用iris抓下来的包也无法接出来
iris自己的decode能出一堆乱码

stardust 发表于 2005-3-16 14:53

MSN协议除认证外的控制和消息数据都是明文的,消息部分也就是UTF-8编码,MS虽然没有公开协议细节,但就象ICQ协议一样,只要用得广泛就会有人去研究,协议细节方面早就分析透了,网上随便google一下就能找到资料。许多网络监控软件基本上都带了解码MSN协议查看消息的功能,贴一个以前写的验证自己对协议了解程度的非常简单粗糙的MSN Perl解码模块,字符集转换用一下Text::Iconv模块就可以了:

#
# NetPacket::MSN - Decode MSN packets
#
#
# $Id: MSN.pm,v 1.16 2004/06/18  10:57:15 stardust Exp $
#

use Text::Iconv;

package NetPacket::MSN;

#
# Copyright (c) 2004 stardust.
#
# This package is free software and is provided "as is" without express
# or implied warranty.  It may be used, redistributed and/or modified
# under the terms of the Perl Artistic License (see
# [url]http://www.perl.com/perl/misc/Artistic.html)[/url]
#
#

use strict;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
use NetPacket;

my $myclass;

# MSN flags

BEGIN {
    $myclass = __PACKAGE__;
    $VERSION = "0.01";
}
sub Version () { "$myclass v$VERSION" }

BEGIN {
    @ISA = qw(Exporter NetPacket);

# Items to export into callers namespace by default
# (move infrequently used names to @EXPORT_OK below)

    @EXPORT = qw(
    );

# Other items we are prepared to export if requested

    @EXPORT_OK = qw(msn_strip
    );

# Tags:

    %EXPORT_TAGS = (
    ALL         => [@EXPORT, @EXPORT_OK],
    strip       => [qw(msn_strip)],
);

}

#
# Strip header from packet and return the data contained in it
#

undef &msn_strip;
*msn_strip = \&strip;

sub strip {
    my ($data) = @_;

    my $msn_obj = NetPacket::MSN->decode($data);
    return $msn_obj->{data};
}   

#
# Decode the packet
#

sub decode {
    my $class = shift;
    my($data) = @_;
    my $self = {};
    my $data_len = 0;

    $data_len = length ($data);
    if ($data_len < 5) {

        $self->{valid} = 0;

    } else {

        my $cmdhead = 0;
        my $cmdtail = 0;

        $self->{cmd_count} = 0;
        while ($cmdtail < $data_len-1 ) {

                my $carriagepos = index ($data,"\r\n",$cmdhead);
                if ($carriagepos < 0) {
                        $cmdtail = $data_len - 1;
                } else {
                        $cmdtail = $carriagepos;
                }

                   my $msn_cmd = substr ($data,$cmdhead,4);
   
                if ($msn_cmd =~ /([A-Z]{3,3}) /) {

                            $self->{valid} = 1;

                            # Decode MSN packet
                   
                        my $msn_cmd_index = "msn_cmd".$self->{cmd_count};
                        $self->{$msn_cmd_index} = $1;
                            if ($1 eq "MSG") {
                                my @cmd_msg_para = split (" ",substr($data,$cmdhead,$cmdtail-$cmdhead+1));
                                my $msg_para_block = substr($data,$cmdtail+2,$cmd_msg_para[3]);
                                my @cmd_data = split ("\r\n",$msg_para_block);
                                my %msg_header = ();
                                for (my $i=1;$i<$#cmd_data;$i++) {
                                        my @items = split (": ",$cmd_data[$i]);
                                        $msg_header{$items[0]} = $items[1];
                                }
                                my $msg_text = substr($msg_para_block,index($msg_para_block,"\r\n\r\n")+4);
                                $msg_text = textdecode ($msg_text);
                                if ((!($msg_header{"Content-Type"} =~ /x-msmsgscontrol/)) && (!($msg_header{"Content-Type"} =~ /x-msnmsgrp2p/)) && (!($msg_header{"Content-Type"} =~ /x-msnmsgr-sessionclosebody/)) && (!($msg_header{"Content-Type"} =~ /x-msmsgsemailnotification/)) && (length($msg_text) > 0)) {
                                        my $has_msg_index = "has_msg".$self->{cmd_count};
                                        $self->{$has_msg_index} = 1;
                                        my $msg_index = "msg_text".$self->{cmd_count};
                                        $self->{$msg_index} = $msg_text;
                                        my $msg_status_index = "msg_status".$self->{cmd_count};
                                        if ($cmd_msg_para[1] =~ /^\d+$/) {
                                                $self->{$msg_status_index} = 1;
#                                                print $self->{$msg_status_index}."\n".$self->{$msg_index}."\n";
                                        } else {
                                                $self->{$msg_status_index} = 0;
                                                $self->{msg_sender} = $cmd_msg_para[1];
                                                $self->{msg_sender_nick} = $cmd_msg_para[2];
#                                                print $self->{$msg_status_index}."\n".$self->{$msg_index}."\n".$self->{msg_sender}."\n".$self->{msg_sender_nick}."\n";
                                        }
                                }
                                $cmdhead = $cmdtail + $cmd_msg_para[3] + 2;
                        } elsif ($1 eq "USR") {
                                my @cmd_msg_para = split (" ",substr($data,$cmdhead,$cmdtail-$cmdhead+1));
                                if ($cmd_msg_para[2] eq "OK") {
                                        $self->{auth} = 1;
                                        $self->{auth_user} = $cmd_msg_para[3];
                                        $self->{auth_nick} = $cmd_msg_para[4];
                                }
                                $cmdhead = $cmdtail + 2;
                        } else {
                                $cmdhead = $cmdtail + 2;
                        }
                       
                        $self->{cmd_count}++;

                    } else {
                                $cmdhead = $cmdtail + 2;
                }

            }
    }

    # Return a blessed object

    bless($self, $class);
    return $self;
}


sub textdecode {
        my ($str) = @_;

        $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        my $converter = Text::Iconv->new("UTF-8", "GB2312");
        $str = $converter->convert($str);

        return $str;
}


#
# Module initialisation
#

1;

# autoloaded methods go after the END token (&& pod) below

__END__

21cnlxz 发表于 2005-3-22 10:52

原来,还有原创工具!

老兄,你真神了,学是刚看了个原创工具,佩服佩服!

mzwa 发表于 2005-3-22 13:58

为什么有的包拷贝不进去

Vader 发表于 2005-3-22 19:45

[quote]Originally posted by [i]mzwa[/i] at 2005-3-22 13:58:
为什么有的包拷贝不进去 [/quote]

太长了的缘故吧,发现限制2000字节限小了,实际2000字节对应hex code + space也只有700来个字节长度。

reader_xzq 发表于 2005-3-23 10:54

怕怕,以后我要简单加密

以后随便写个啥子,我都要简单加密,哎,怕怕

hengshu 发表于 2005-3-23 13:06

看看先!
:)

页: [1] 2

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.