首页
社区
课程
招聘
[原创]wss协议分析(SSL加密的WebSocket)
发表于: 2018-4-24 20:31 26587

[原创]wss协议分析(SSL加密的WebSocket)

2018-4-24 20:31
26587

前几天抓包分析数据的时候抓包抓不到,最后发现是wss,之前没有见过,特此记录。

 

首先打开 Charles android手机设好代理打开apk
能直接抓到包

 

因为我只想抓点击按钮以后的数据:

 

 

按照国际惯例清除之前抓到的,重新抓一次,可是按了搜索按钮
界面的数据是刷新了,可是Charles里面却没有数据。怎么回事呢,不是http,难道是 sokect。那直接看代码吧。

 

先通过神器ddms搜索这个按钮的id

 

然后可以看到 搜索按钮的 id为 layout_home_search_main
继续打开jadx
图片描述

 

搜索到这个view RelativeLayout 然后找到他的点击事件看看怎么实现的

显而易见代码肯定是这里
图片描述
最后跟到这里,看函数名和参数确定了就是sokect实现的。继续跟吧
图片描述
一直跟到了这里,瞬间豁然开朗
图片描述

 

看到了 open。connect,send ,close
这不就是 协议通用的几个函数吗!然后我反编译apk加入了log
看到 send函数就是传入的值。而onMessage里面就是返回的值。
你以为这就完了吗,没有!找到地方了。我还得模拟协议啊。ip是多少啊。继续看构造函数
图片描述
构造函数果然有uri,继续加入log重新编译。打印结果
看到了
图片描述
看到了他不是http协议。而是wss。百度一下
图片描述
大概懂了。就是连接一次可以永久互发消息
图片描述
然后找了wesocket在线测试。完美连接。可是我发送的消息他不能正确返回。
重新跑了一下我加入日志的apk,看到他在发送请求的之前还发送一条认证的串。
而认证的串是固定的。到此分析完毕。模拟java代码

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.InputStreamReader;  
import java.net.URI;  
import java.security.KeyStore;  
import javax.net.ssl.KeyManagerFactory;  
import javax.net.ssl.SSLContext;  
import javax.net.ssl.TrustManagerFactory;  
import org.java_websocket.WebSocket;  
import org.java_websocket.client.DefaultSSLWebSocketClientFactory;  
import org.java_websocket.client.WebSocketClient;  
import org.java_websocket.handshake.ServerHandshake;  

class WebSocketChatClient extends WebSocketClient {  

public WebSocketChatClient( URI serverUri ) {  
    super( serverUri );  
}  

@Override  
public void onOpen( ServerHandshake handshakedata ) {  
    System.out.println( "Connected" );  
}  

@Override  
public void onMessage( String message ) {  
    System.out.println( "got: " + message );  
}  

@Override  
public void onClose( int code, String reason, boolean remote ) {  
    System.out.println( "Disconnected" );  
    System.exit( 0 );  
}  

@Override  
public void onError( Exception ex ) {  
    ex.printStackTrace();  
}    
}  

public class SSLClientExample {  
// always verify the host - dont check for certificate  
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {  
    public boolean verify(String hostname, SSLSession session) {  
        return true;  
    }  
};  


/** 
 * Trust every server - dont check for any certificate 
 */  
private static void trustAllHosts(AppWebSocketClient appClient) {  
    // Create a trust manager that does not validate certificate chains  
    TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {  
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
            return new java.security.cert.X509Certificate[]{};  
        }  


        public void checkClientTrusted(X509Certificate[] chain,  
                                       String authType) throws CertificateException {  
        }  


        public void checkServerTrusted(X509Certificate[] chain,  
                                       String authType) throws CertificateException {  
        }  
    }};  


    // Install the all-trusting trust manager  
    try {  
        SSLContext sc = SSLContext.getInstance("TLS");  
        sc.init(null, trustAllCerts, new java.security.SecureRandom());  
        appClient.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sc));  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
}  


public static void main( String[] args ) throws Exception {  
    WebSocket.DEBUG = true;  

    WebSocketChatClient chatclient = new WebSocketChatClient( new URI( "wss://localhost:8887" ) );  
   trustAllHosts(appClient);
    chatclient.connectBlocking();  

    BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );  
    while ( true ) {  
        String line = reader.readLine();  
        if( line.equals( "close" ) ) {  
            chatclient.close();  
        } else {  
            chatclient.send( line );  
        }  
    }  
}  

}


[课程]Linux pwn 探索篇!

最后于 2018-4-24 20:35 被skyun编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (18)
雪    币: 392
活跃值: (205)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
很好的学习资料
2018-4-24 23:30
0
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
KingZd 很好的学习资料
您的支持是我发帖的最大动力,谢谢
2018-4-24 23:54
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
思路严谨,逻辑清楚,膜拜大佬
2018-4-24 23:57
0
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
wx_张文利 思路严谨,逻辑清楚,膜拜大佬
谢谢
2018-4-25 00:15
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我怎么没看到认证的串是什么呀?
2018-4-25 09:58
0
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
7
大约在冬季 我怎么没看到认证的串是什么呀?
认证的串其实没有什么特别的,没有加密,每次都是固定。照模照样发过去就行了
2018-4-25 10:22
0
雪    币: 4443
活跃值: (2066)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
看到包名了
2018-4-25 10:49
0
雪    币: 2443
活跃值: (464)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
好文,学习~
2018-4-25 10:56
0
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
10
cqzhou 看到包名了
好仔细。好可怕!
2018-4-25 11:20
0
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
飘云 好文,学习~
谢谢
2018-4-25 11:20
0
雪    币: 75
活跃值: (587)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢
2018-4-25 11:21
0
雪    币: 224
活跃值: (374)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
厉害厉害,学到了
2018-4-25 18:02
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2018-4-25 20:21
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2018-4-25 21:15
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
2018-4-25 21:30
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
非常有用得思路,感谢分享 
2018-4-28 22:12
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
思路清晰
2018-5-27 15:55
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
请问您的这一步在ddms里  是查看哪里查看到的?  我搞别的APP学习,没有找到
然后可以看到  搜索按钮的  id为  layout_home_search_main
继续打开jadx
2018-6-9 00:26
0
游客
登录 | 注册 方可回帖
返回
//