debugger.java

来自「一个功能强大的聊天程序.....基本实现所有功能....强烈推荐下载」· Java 代码 · 共 1,422 行 · 第 1/4 页

JAVA
1,422
字号
        	@Override
        	public void widgetSelected(SelectionEvent e) {
                Rectangle rect = tiParse.getBounds();
                Point p = tb.toDisplay(rect.x, rect.y);
                p.y += rect.height;
                parseMenu.setLocation(p);
                parseMenu.setVisible(true);
        	}
        });
        // 做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());
                if(b == null)
                	b = Util.getBytes(textInput.getText());
                if(b == null)
                	return;
                b = md5(b);
                textInput.append(System.getProperty("line.separator"));
                textInput.append(Util.convertByteToHexString(b));
            }
        });
        // 解密
        tiDecrypt = new ToolItem(tb, SWT.DROP_DOWN);
        tiDecrypt.setText("Decrypt");
        tiDecrypt.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                Rectangle rect = tiDecrypt.getBounds();
                Point p = tb.toDisplay(rect.x, rect.y);
                p.y += rect.height;
                decryptMenu.setLocation(p);
                decryptMenu.setVisible(true);
            }
        });
        tiEncrypt = new ToolItem(tb, SWT.DROP_DOWN);
		tiEncrypt.setText("Encrypt");
        tiEncrypt.addSelectionListener(new SelectionAdapter() {
        	@Override
        	public void widgetSelected(SelectionEvent e) {
                Rectangle rect = tiEncrypt.getBounds();
                Point p = tb.toDisplay(rect.x, rect.y);
                p.y += rect.height;
                encryptMenu.setLocation(p);
                encryptMenu.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) {
                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(res.getImage(Resources.icoDebugSend));
	        ViewForm sendForm = new ViewForm(viewFolder, SWT.FLAT);
	        sendTab.setControl(sendForm);
	        
	        final ToolBar sendBar = new ToolBar(sendForm, SWT.FLAT);
	        final ToolItem tiSend = new ToolItem(sendBar, SWT.DROP_DOWN);
	        tiSend.setText("Send");
	        tiSend.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    Rectangle rect = tiSend.getBounds();
                    Point p = sendBar.toDisplay(rect.x, rect.y);
                    p.y += rect.height;
                    sendMenu.setLocation(p);
                    sendMenu.setVisible(true);
                }
	        });	        
	        sendForm.setTopLeft(sendBar);
	        
	        textSend = new Text(sendForm, SWT.MULTI | SWT.V_SCROLL | SWT.WRAP);
	        textSend.setFont(font);
	        sendForm.setContent(textSend);
        }
        
        viewFolder.setSelection(0);
        
        hSash.setWeights(new int[] { 30, 70} );
        
        initMenu();
        return control;
    }
    
    protected void onInputKey() {
    	if(user == null || packetHelper == null)
    		return;
    	
		String s = getInput("Input 0x001D reply packet");
		byte[] b = Util.convertHexStringToByte(s);
		if(b == null)
			return;
		ByteBuffer buf = ByteBuffer.wrap(b);
		try {
			RequestKeyReplyPacket packet = (RequestKeyReplyPacket)packetHelper.parseIn(QQ.QQ_PROTOCOL_FAMILY_BASIC, buf, user, true);
			switch(packet.subCommand) {
				case QQ.QQ_SUB_CMD_REQUEST_FILE_AGENT_KEY:
					user.setFileAgentKey(packet.key);
					break;
				case QQ.QQ_SUB_CMD_REQUEST_UNKNOWN03_KEY:
					user.setUnknown03Key(packet.key);
					break;
				case QQ.QQ_SUB_CMD_REQUEST_UNKNOWN06_KEY:
					user.setUnknown06Key(packet.key);
					break;
				case QQ.QQ_SUB_CMD_REQUEST_UNKNOWN07_KEY:
					user.setUnknown07Key(packet.key);
					break;
				case QQ.QQ_SUB_CMD_REQUEST_UNKNOWN08_KEY:
					user.setUnknown08Key(packet.key);
					break;
			}
		} catch(PacketParseException e1) {
			return;
		}
	}

	/**
     * 输入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() {
    	packetHelper = new PacketHelper(QQ.QQ_PROTOCOL_ALL);
        if(main == null) {
        	if(!debug) {
                InitialArgument arg = openDialog();
                if(arg != null) {
                    if(initIndividualMode(arg)) {
                        tiInputArg.setText("User " + user.getQQ());
                        tiInputArg.getParent().layout();
                        tiParse.setEnabled(true);
                    }
                }                        
            }
        } else
            switchDebugMode();
    }

    /**
     * 打开调试参数对话框
     * 
     * @return
     * 			DebugArgument对象
     */
    protected InitialArgument openDialog() {
        InitialArgumentDialog dialog = new InitialArgumentDialog(getShell());
        if(dialog.open() == IDialogConstants.OK_ID)
        	return dialog.getArg();
        else
        	return null;
    }
    
    /**
     * @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.parseIn(QQ.QQ_PROTOCOL_FAMILY_BASIC, myBuf, user, true);
            if(lrp == null)
                throw new PacketParseException("Error Format");
            user.setSessionKey(lrp.sessionKey);  
		    byte[] b = new byte[4 + QQ.QQ_LENGTH_KEY];
		    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_LENGTH_KEY);
		    user.setFileSessionKey(md5(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);
    }

    /**
     * @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 + =
减小字号Ctrl + -
显示快捷键?