⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debugger.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        tiParse = new ToolItem(tb, SWT.NONE);
        tiParse.setText("Parse as Packet");
        tiParse.setEnabled(main != null);
        tiParse.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                byte[] b = Util.convertHexStringToByte(textInput.getText());
                if(b == null) {
                    showError("Parse packet error!");
                } else {
                    ByteBuffer buf = ByteBuffer.wrap(b);
                    try {
                        if(PacketHelper.process(buf, user, true) == null)
                            showError("Parse packet error!");                            
                    } catch (PacketParseException e1) {
                        showError("Parse packet error!");
                    }
                }
            }
        });
        // 做md5
        ToolItem tiMd5 = new ToolItem(tb, SWT.PUSH);
        tiMd5.setText("MD5");
        tiMd5.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                byte[] b = Util.convertHexStringToByte(textInput.getText());
                b = Util.doMD5(b);
                textInput.append(IStrings.CRLF);
                textInput.append(Util.convertByteToHexString(b));
            }
        });
        // 解密
        tiDecrypt = new ToolItem(tb, SWT.DROP_DOWN);
        tiDecrypt.setText("Decrypt");
        tiDecrypt.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if(e.detail == SWT.ARROW) {
                    Rectangle rect = tiDecrypt.getBounds();
                    Point p = tb.toDisplay(rect.x, rect.y);
                    p.y += rect.height;
                    decryptMenu.setLocation(p);
                    decryptMenu.setVisible(true);
                }
            }
        });
        inputForm.setTopLeft(tb);
        // 选择
        final Label lblInputSelection = new Label(inputForm, SWT.RIGHT);
        lblInputSelection.setText("Selection: null, Length: 0, Hex: 0");
        inputForm.setTopRight(lblInputSelection);
        textInput = new StyledText(inputForm, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);    
        textInput.setFont(font);
        textInput.addModifyListener(new ModifyListener() {
            public void modifyText(ModifyEvent e) {
                Point selection = textInput.getSelection();
                int start = 0;
                int end = textInput.getText().length() / 3;
                lblInputSelection.setText("Length: " + (end - start) + " Hex: " + Integer.toHexString(end - start).toUpperCase());
            }
        });
        textInput.addMouseListener(new MouseAdapter() {
            public void mouseUp(MouseEvent e) {
                if(e.button == 3) {
                    textMenu.setLocation(textInput.toDisplay(e.x, e.y));
                    textMenu.setVisible(true);
                }
            }
        });
        inputForm.setContent(textInput);
        inputTab.setControl(inputForm);
        
        // 发送窗口
        if(!individual) {
	        CTabItem sendTab = new CTabItem(viewFolder, SWT.NONE);
	        sendTab.setText("Send");
	        sendTab.setImage(icons.getImage(IconHolder.icoDebugSend));
	        ViewForm sendForm = new ViewForm(viewFolder, SWT.FLAT);
	        sendTab.setControl(sendForm);
	        viewFolder.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if(viewFolder.getSelectionIndex() == 2)
                        textDesc.setText(IStrings.COMMANDS);
                }
	        });
	        
	        ToolBar sendBar = new ToolBar(sendForm, SWT.FLAT);
	        ToolItem tiSend = new ToolItem(sendBar, SWT.PUSH);
	        tiSend.setText("Send...");
	        tiSend.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    if(textSend.getText().trim().equals(""))
                        showWarning("You should input something to send");
                    else {
                        String s = getInput("Input the packet command in Hex");
                        char command;
                        try {
                            command = (char)Integer.parseInt(s, 16);
                        } catch (NumberFormatException e1) {
                            showWarning("The command you inputed isn't correct");
                            return;
                        }
                        byte[] b = Util.convertHexStringToByte(textSend.getText().trim());
                        if(b == null)
                            showWarning("The content you input can't parsed as a byte array");
                        else {
	                        DebugPacket packet = new DebugPacket(command, user);
	                        packet.setBody(b);
	                        main.getClient().sendPacket(packet);                            
                        }
                    }
                }
	        });	        
	        sendForm.setTopLeft(sendBar);
	        
	        textSend = new Text(sendForm, SWT.MULTI | SWT.V_SCROLL | SWT.WRAP);
	        textSend.setFont(font);
	        sendForm.setContent(textSend);
        }
        
        viewFolder.setSelection(0);
        
        vSash.setWeights(new int[] { 70, 30} );
        hSash.setWeights(new int[] { 30, 70} );
        
        initMenu();
        return control;
    }
    
    /**
     * 输入Agent参数
     */
    protected void onAgent() {
        if(user == null)
            return;
        
        InputDialog dialog = new InputDialog(getShell(), 
                "Agent Key", 
                "Input File Agent Key",
                null, 
                null);
        if(dialog.open() == IDialogConstants.OK_ID) {
            byte[] key = Util.convertHexStringToByte(dialog.getValue());
            user.setFileAgentKey(key);
        } else
            return;
        
        dialog = new InputDialog(getShell(),
                "Agent Token",
                "Input File Agent Token",
                null,
                null);
        if(dialog.open() == IDialogConstants.OK_ID) {
            byte[] token = Util.convertHexStringToByte(dialog.getValue());
            user.setFileAgentToken(token);
        }
    }

    /**
     * start标签按下时
     */
    protected void onStart() {
        if(main == null) {
            if(!debug) {
                InitialArgument arg = openDialog();
                if(arg != null) {
                    if(initIndividualMode(arg)) {
                        lblStart.setText("Debugger for User " + user.getQQ());
                        tiParse.setEnabled(true);
                        decryptMenu.getItem(0).setEnabled(true);
                        decryptMenu.getItem(1).setEnabled(true);
                        decryptMenu.getItem(2).setEnabled(true);
                        decryptMenu.getItem(3).setEnabled(true);
                    }
                }                        
            }
        } else
            switchDebugMode();
    }

    /**
     * 打开调试参数对话框
     * 
     * @return
     * 			DebugArgument对象
     */
    protected InitialArgument openDialog() {
        InitialArgumentDialog dialog = new InitialArgumentDialog(getShell());
        return dialog.open();
    }
    
    /**
     * @param event
     */
    protected void onPacketViewerSelectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection)event.getSelection();
        IDebugObject obj = (IDebugObject)selection.getFirstElement();
        if(obj != null)
            textBytes.setText(chkBodyOnly.getSelection() ? obj.getBodyHexString() : obj.getHexString());        
    }
    
    /**
     * @return
     * 		当前选择的文本,从当前激活的text中得到
     */
    private String getSelectionText() {
        if(viewFolder.getSelectionIndex() == 0)
            return textBytes.getSelectionText();
        else if(viewFolder.getSelectionIndex() == 1)
            return textInput.getSelectionText();
        else
            return "";
    }
    
    /**
     * 初始化独立模式的参数
     * 
     * @param arg
     * 			调试参数
     * @return true表示初始化成功
     */
    protected boolean initIndividualMode(InitialArgument arg) {
        try {
            // 打开调试模式
            DebugSwitch.getInstance().addDebugListener(this);
            setDebug(true);
            
            // 初始化各重要参数,在解密以后的包必须要用到
            user = new QQUser(arg.getQQ(), arg.getPassword());
            ByteBuffer myBuf = ByteBuffer.wrap(arg.getLoginReply());
            LoginReplyPacket lrp = (LoginReplyPacket)PacketHelper.processIn(myBuf, user, true);
            if(lrp == null)
                throw new PacketParseException("Error Format");
            user.setSessionKey(lrp.sessionKey);  
		    byte[] b = new byte[4 + QQ.QQ_KEY_LENGTH];
		    b[0] = (byte)((user.getQQ() >>> 24) & 0xFF);
		    b[1] = (byte)((user.getQQ() >>> 16) & 0xFF);
		    b[2] = (byte)((user.getQQ() >>> 8) & 0xFF);
		    b[3] = (byte)(user.getQQ() & 0xFF);
		    System.arraycopy(user.getSessionKey(), 0, b, 4, QQ.QQ_KEY_LENGTH);
		    user.setFileSessionKey(Util.doMD5(b));
            return true;
        } catch (PacketParseException e) {
            DebugSwitch.getInstance().removeDebugListener(this);
            setDebug(false);
            return false;
        }
    }
    
    /* (non-Javadoc)
     * @see edu.tsinghua.lumaqq.qq.debug.IDebugListener#deliverDebugObject(edu.tsinghua.lumaqq.qq.debug.IDebugObject)
     */
    public void deliverDebugObject(IDebugObject obj) {
        addDebugObject(obj);
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
     */
    public void widgetDisposed(DisposeEvent e) {
        font.dispose();
    }    
    
    /**
     * @return Returns the debug.
     */
    public boolean isDebug() {
        return debug;
    }
    
    /**
     * @param debug The debug to set.
     */
    public void setDebug(boolean debug) {
        this.debug = debug;
    }
    
    private void showMessage(String msg) {
        MessageDialog.openInformation(getShell(), "Debug", msg);
    }
    
    private void showWarning(String msg) {
        MessageDialog.openWarning(getShell(), "Warning", msg);
    }
    
    private void showError(String msg) {
        MessageDialog.openError(getShell(), "Error", msg);
    }
    
    /**
     * 添加一个DebugObject到包列表
     * 
     * @param obj
     * 		IDebugObject
     */
    public void addDebugObject(IDebugObject obj) {
        addPacketRunnable.obj = obj;
        display.syncExec(addPacketRunnable);
    }
    
    /**
     * 删除一个包
     * 
     * @param index
     */
    public void removeDebugObject(int index) {
        packets.remove(index);
        packetViewer.refresh();
    }
    
    /**
     * 清空packets
     */
    public void removeAllPackets() {
        packets.clear();
        packetViewer.refresh();
    }
    
    /**
     * 解密
     * 
     * @param key
     */
    protected void decryptInput(byte[] key) {
        byte[] b = Util.convertHexStringToByte(textInput.getText());
        if(b == null) 
            showWarning("Can't get byte array from your input!");
        else {
            try {
	            b = crypter.decrypt(b, key);
	            if(b == null)
	                showWarning("Decrypt Error!");
	            else 
	                addDebugObject(new FragmentDO(b));
            } catch(Exception e) {
                showError(e.getMessage());
            }
        }
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialSize()
     */
    protected Point getInitialSize() {
        return new Point(800, 600);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -