go-noss icon indicating copy to clipboard operation
go-noss copied to clipboard

请求头内应该要计算一个参数

Open little-zhong opened this issue 1 year ago • 6 comments

image

little-zhong avatar Jan 05 '24 06:01 little-zhong

https://emscripten.org/docs/api_reference/preamble.js.html

little-zhong avatar Jan 05 '24 06:01 little-zhong

有没有可能直接通过hook js来实现这个方法

little-zhong avatar Jan 05 '24 06:01 little-zhong

`(function() { 'use strict'; function SekiroClient(wsURL) { this.wsURL = wsURL; this.handlers = {}; this.socket = {}; // check if (!wsURL) { throw new Error('wsURL can not be empty!!') } this.webSocketFactory = this.resolveWebSocketFactory(); this.connect() }

        SekiroClient.prototype.resolveWebSocketFactory = function() {
            if (typeof window === 'object') {
                var theWebSocket = window.WebSocket ? window.WebSocket : window.MozWebSocket;
                return function(wsURL) {

                    function WindowWebSocketWrapper(wsURL) {
                        this.mSocket = new theWebSocket(wsURL);
                    }

                    WindowWebSocketWrapper.prototype.close = function() {
                        this.mSocket.close();
                    }
                    ;

                    WindowWebSocketWrapper.prototype.onmessage = function(onMessageFunction) {
                        this.mSocket.onmessage = onMessageFunction;
                    }
                    ;

                    WindowWebSocketWrapper.prototype.onopen = function(onOpenFunction) {
                        this.mSocket.onopen = onOpenFunction;
                    }
                    ;
                    WindowWebSocketWrapper.prototype.onclose = function(onCloseFunction) {
                        this.mSocket.onclose = onCloseFunction;
                    }
                    ;

                    WindowWebSocketWrapper.prototype.send = function(message) {
                        this.mSocket.send(message);
                    }
                    ;

                    return new WindowWebSocketWrapper(wsURL);
                }
            }
            if (typeof weex === 'object') {
                // this is weex env : https://weex.apache.org/zh/docs/modules/websockets.html
                try {
                    console.log("test webSocket for weex");
                    var ws = weex.requireModule('webSocket');
                    console.log("find webSocket for weex:" + ws);
                    return function(wsURL) {
                        try {
                            ws.close();
                        } catch (e) {}
                        ws.WebSocket(wsURL, '');
                        return ws;
                    }
                } catch (e) {
                    console.log(e);
                    //ignore
                }
            }
            //TODO support ReactNative
            if (typeof WebSocket === 'object') {
                return function(wsURL) {
                    return new theWebSocket(wsURL);
                }
            }
            // weex 和 PC环境的websocket API不完全一致,所以做了抽象兼容
            throw new Error("the js environment do not support websocket");
        }
        ;

        SekiroClient.prototype.connect = function() {
            console.log('sekiro: begin of connect to wsURL: ' + this.wsURL);
            var _this = this;
            // 不check close,让
            // if (this.socket && this.socket.readyState === 1) {
            //     this.socket.close();
            // }
            try {
                this.socket = this.webSocketFactory(this.wsURL);
            } catch (e) {
                console.log("sekiro: create connection failed,reconnect after 2s");
                setTimeout(function() {
                    _this.connect()
                }, 2000)
            }

            this.socket.onmessage(function(event) {
                _this.handleSekiroRequest(event.data)
            });

            this.socket.onopen(function(event) {
                console.log('sekiro: open a sekiro client connection')
            });

            this.socket.onclose(function(event) {
                console.log('sekiro: disconnected ,reconnection after 2s');
                setTimeout(function() {
                    _this.connect()
                }, 2000)
            });
        }
        ;

        SekiroClient.prototype.handleSekiroRequest = function(requestJson) {
            // console.log("receive sekiro request: " + requestJson);
            var request = JSON.parse(requestJson);
            var seq = request['__sekiro_seq__'];

            if (!request['action']) {
                this.sendFailed(seq, 'need request param {action}');
                return
            }
            var action = request['action'];
            if (!this.handlers[action]) {
                this.sendFailed(seq, 'no action handler: ' + action + ' defined');
                return
            }

            var theHandler = this.handlers[action];
            var _this = this;
            try {
                theHandler(request, function(response) {
                    try {
                        _this.sendSuccess(seq, response)
                    } catch (e) {
                        _this.sendFailed(seq, "e:" + e);
                    }
                }, function(errorMessage) {
                    _this.sendFailed(seq, errorMessage)
                })
            } catch (e) {
                console.log("error: " + e);
                _this.sendFailed(seq, ":" + e);
            }
        }
        ;

        SekiroClient.prototype.sendSuccess = function(seq, response) {
            var responseJson;
            if (typeof response == 'string') {
                try {
                    responseJson = JSON.parse(response);
                } catch (e) {
                    responseJson = {};
                    responseJson['data'] = response;
                }
            } else if (typeof response == 'object') {
                responseJson = response;
            } else {
                responseJson = {};
                responseJson['data'] = response;
            }

            if (Array.isArray(responseJson)) {
                responseJson = {
                    data: responseJson,
                    code: 0
                }
            }

            if (responseJson['code']) {
                responseJson['code'] = 0;
            } else if (responseJson['status']) {
                responseJson['status'] = 0;
            } else {
                responseJson['status'] = 0;
            }
            responseJson['__sekiro_seq__'] = seq;
            var responseText = JSON.stringify(responseJson);
            console.log("response :" + responseText);
            this.socket.send(responseText);
        }
        ;

        SekiroClient.prototype.sendFailed = function(seq, errorMessage) {
            if (typeof errorMessage != 'string') {
                errorMessage = JSON.stringify(errorMessage);
            }
            var responseJson = {};
            responseJson['message'] = errorMessage;
            responseJson['status'] = -1;
            responseJson['__sekiro_seq__'] = seq;
            var responseText = JSON.stringify(responseJson);
            // console.log("sekiro: response :" + responseText);
            this.socket.send(responseText)
        }
        ;

        SekiroClient.prototype.registerAction = function(action, handler) {
            if (typeof action !== 'string') {
                throw new Error("an action must be string");
            }
            if (typeof handler !== 'function') {
                throw new Error("a handler must be function");
            }
            console.log("sekiro: register action: " + action);
            this.handlers[action] = handler;
            return this;
        }
        ;

        function guid() {
            function S4() {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            }

            return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
        }

        var client = new SekiroClient("ws://127.0.0.1:5612/business-demo/register?group=rpc-test2&clientId=" + guid());

        client.registerAction("get_token", function(request, resolve, reject) {
            let sign_token = eT.sign(request["id"])
            // t = request["t"];
            // n = request["n"];
            // let toke = (new window.abc).z(t, parseInt(n) + 60 * (480 + (new Date).getTimezoneOffset()) * 1e3);
            console.log(sign_token);
            resolve(sign_token);
        })

    })();`

通过hook后正常得到,但是需要写一个自动修改js的中间件,他的init key会变动

little-zhong avatar Jan 05 '24 07:01 little-zhong

`(function() { 'use strict'; function SekiroClient(wsURL) { this.wsURL = wsURL; this.handlers = {}; this.socket = {}; // check if (!wsURL) { throw new Error('wsURL can not be empty!!') } this.webSocketFactory = this.resolveWebSocketFactory(); this.connect() }

        SekiroClient.prototype.resolveWebSocketFactory = function() {
            if (typeof window === 'object') {
                var theWebSocket = window.WebSocket ? window.WebSocket : window.MozWebSocket;
                return function(wsURL) {

                    function WindowWebSocketWrapper(wsURL) {
                        this.mSocket = new theWebSocket(wsURL);
                    }

                    WindowWebSocketWrapper.prototype.close = function() {
                        this.mSocket.close();
                    }
                    ;

                    WindowWebSocketWrapper.prototype.onmessage = function(onMessageFunction) {
                        this.mSocket.onmessage = onMessageFunction;
                    }
                    ;

                    WindowWebSocketWrapper.prototype.onopen = function(onOpenFunction) {
                        this.mSocket.onopen = onOpenFunction;
                    }
                    ;
                    WindowWebSocketWrapper.prototype.onclose = function(onCloseFunction) {
                        this.mSocket.onclose = onCloseFunction;
                    }
                    ;

                    WindowWebSocketWrapper.prototype.send = function(message) {
                        this.mSocket.send(message);
                    }
                    ;

                    return new WindowWebSocketWrapper(wsURL);
                }
            }
            if (typeof weex === 'object') {
                // this is weex env : https://weex.apache.org/zh/docs/modules/websockets.html
                try {
                    console.log("test webSocket for weex");
                    var ws = weex.requireModule('webSocket');
                    console.log("find webSocket for weex:" + ws);
                    return function(wsURL) {
                        try {
                            ws.close();
                        } catch (e) {}
                        ws.WebSocket(wsURL, '');
                        return ws;
                    }
                } catch (e) {
                    console.log(e);
                    //ignore
                }
            }
            //TODO support ReactNative
            if (typeof WebSocket === 'object') {
                return function(wsURL) {
                    return new theWebSocket(wsURL);
                }
            }
            // weex 和 PC环境的websocket API不完全一致,所以做了抽象兼容
            throw new Error("the js environment do not support websocket");
        }
        ;

        SekiroClient.prototype.connect = function() {
            console.log('sekiro: begin of connect to wsURL: ' + this.wsURL);
            var _this = this;
            // 不check close,让
            // if (this.socket && this.socket.readyState === 1) {
            //     this.socket.close();
            // }
            try {
                this.socket = this.webSocketFactory(this.wsURL);
            } catch (e) {
                console.log("sekiro: create connection failed,reconnect after 2s");
                setTimeout(function() {
                    _this.connect()
                }, 2000)
            }

            this.socket.onmessage(function(event) {
                _this.handleSekiroRequest(event.data)
            });

            this.socket.onopen(function(event) {
                console.log('sekiro: open a sekiro client connection')
            });

            this.socket.onclose(function(event) {
                console.log('sekiro: disconnected ,reconnection after 2s');
                setTimeout(function() {
                    _this.connect()
                }, 2000)
            });
        }
        ;

        SekiroClient.prototype.handleSekiroRequest = function(requestJson) {
            // console.log("receive sekiro request: " + requestJson);
            var request = JSON.parse(requestJson);
            var seq = request['__sekiro_seq__'];

            if (!request['action']) {
                this.sendFailed(seq, 'need request param {action}');
                return
            }
            var action = request['action'];
            if (!this.handlers[action]) {
                this.sendFailed(seq, 'no action handler: ' + action + ' defined');
                return
            }

            var theHandler = this.handlers[action];
            var _this = this;
            try {
                theHandler(request, function(response) {
                    try {
                        _this.sendSuccess(seq, response)
                    } catch (e) {
                        _this.sendFailed(seq, "e:" + e);
                    }
                }, function(errorMessage) {
                    _this.sendFailed(seq, errorMessage)
                })
            } catch (e) {
                console.log("error: " + e);
                _this.sendFailed(seq, ":" + e);
            }
        }
        ;

        SekiroClient.prototype.sendSuccess = function(seq, response) {
            var responseJson;
            if (typeof response == 'string') {
                try {
                    responseJson = JSON.parse(response);
                } catch (e) {
                    responseJson = {};
                    responseJson['data'] = response;
                }
            } else if (typeof response == 'object') {
                responseJson = response;
            } else {
                responseJson = {};
                responseJson['data'] = response;
            }

            if (Array.isArray(responseJson)) {
                responseJson = {
                    data: responseJson,
                    code: 0
                }
            }

            if (responseJson['code']) {
                responseJson['code'] = 0;
            } else if (responseJson['status']) {
                responseJson['status'] = 0;
            } else {
                responseJson['status'] = 0;
            }
            responseJson['__sekiro_seq__'] = seq;
            var responseText = JSON.stringify(responseJson);
            console.log("response :" + responseText);
            this.socket.send(responseText);
        }
        ;

        SekiroClient.prototype.sendFailed = function(seq, errorMessage) {
            if (typeof errorMessage != 'string') {
                errorMessage = JSON.stringify(errorMessage);
            }
            var responseJson = {};
            responseJson['message'] = errorMessage;
            responseJson['status'] = -1;
            responseJson['__sekiro_seq__'] = seq;
            var responseText = JSON.stringify(responseJson);
            // console.log("sekiro: response :" + responseText);
            this.socket.send(responseText)
        }
        ;

        SekiroClient.prototype.registerAction = function(action, handler) {
            if (typeof action !== 'string') {
                throw new Error("an action must be string");
            }
            if (typeof handler !== 'function') {
                throw new Error("a handler must be function");
            }
            console.log("sekiro: register action: " + action);
            this.handlers[action] = handler;
            return this;
        }
        ;

        function guid() {
            function S4() {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            }

            return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
        }

        var client = new SekiroClient("ws://127.0.0.1:5612/business-demo/register?group=rpc-test2&clientId=" + guid());

        client.registerAction("get_token", function(request, resolve, reject) {
            let sign_token = eT.sign(request["id"])
            // t = request["t"];
            // n = request["n"];
            // let toke = (new window.abc).z(t, parseInt(n) + 60 * (480 + (new Date).getTimezoneOffset()) * 1e3);
            console.log(sign_token);
            resolve(sign_token);
        })

    })();`

通过hook后正常得到,但是需要写一个自动修改js的中间件,他的init key会变动

加了加密头之后 你能成功挖到吗

735946969 avatar Jan 05 '24 16:01 735946969

中心化的东西变动起来太容易了,不挖了 卧槽 调的累

728443778 avatar Jan 06 '24 00:01 728443778

这段代码怎么和项目结合起来呢

skyyangpeng avatar Jan 09 '24 08:01 skyyangpeng