debugger.java

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

JAVA
1,422
字号
                    showError("Parse packet error!");
                } else {
                    ByteBuffer buf = ByteBuffer.wrap(b);
                    try {
                        if(packetHelper.parseIn(QQ.QQ_PROTOCOL_ALL, buf, user, true) == null)
                            showError("Parse packet error!");                            
                    } catch (PacketParseException e1) {
                        showError("Parse packet error!");
                    }
                }
            }
        });
        // 解析为输出包
        mi = new MenuItem(parseMenu, SWT.PUSH);
        mi.setText("Outcoming Packet");
        mi.addSelectionListener(new SelectionAdapter() {
        	@Override
            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.parseOut(QQ.QQ_PROTOCOL_ALL, buf, user) == null)
                            showError("Parse packet error!");                            
                    } catch (PacketParseException e1) {
                        showError("Parse packet error!");
                    }
                }
            }
        });
	}

	private void initDecryptMenu() {
		MenuItem mi;
		// 解密菜单
        decryptMenu = new Menu(getShell());
        // 用会话密钥解密
        final MenuItem miSessionKey = new MenuItem(decryptMenu, SWT.PUSH);
        miSessionKey.setText("Decrypt with Session Key");
        miSessionKey.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                decryptInput(user.getSessionKey());
            }
        });
        // 用密码密钥解密
        final MenuItem miPasswordKey = new MenuItem(decryptMenu, SWT.PUSH);
        miPasswordKey.setText("Decrpty with Password Key");
        miPasswordKey.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                decryptInput(user.getPasswordKey());
            }
        });
        // 用文件传输会话密钥解密
        final MenuItem miFileSessionKey = new MenuItem(decryptMenu, SWT.PUSH);
        miFileSessionKey.setText("Decrypt with File Session Key");
        miFileSessionKey.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                decryptInput(user.getFileSessionKey());
            }
        });
        // 用QQ初始密钥解密
        final MenuItem miInitKey = new MenuItem(decryptMenu, SWT.PUSH);
        miInitKey.setText("Decrypt with QQ Initial Key");
        miInitKey.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                decryptInput(user.getInitKey());
            }
        });
        // 用文件中转密钥解密
        final MenuItem miAgentKey = new MenuItem(decryptMenu, SWT.PUSH);
        miAgentKey.setText("Decrypt with File Agent Key");
        miAgentKey.addSelectionListener(new SelectionAdapter() {
        	public void widgetSelected(SelectionEvent e) {
        		decryptInput(user.getFileAgentKey());
        	}
        });
        // 用未知密钥03解密
        final MenuItem mi03Key = new MenuItem(decryptMenu, SWT.PUSH);
        mi03Key.setText("Decrypt with Unknown Key 03");
        mi03Key.addSelectionListener(new SelectionAdapter() {
        	public void widgetSelected(SelectionEvent e) {
        		decryptInput(user.getUnknown03Key());
        	}
        });
        // 用未知密钥06解密
        final MenuItem mi06Key = new MenuItem(decryptMenu, SWT.PUSH);
        mi06Key.setText("Decrypt with Unknown Key 06");
        mi06Key.addSelectionListener(new SelectionAdapter() {
        	public void widgetSelected(SelectionEvent e) {
        		decryptInput(user.getUnknown06Key());
        	}
        });
        // 用未知密钥07解密
        final MenuItem mi07Key = new MenuItem(decryptMenu, SWT.PUSH);
        mi07Key.setText("Decrypt with Unknown Key 07");
        mi07Key.addSelectionListener(new SelectionAdapter() {
        	public void widgetSelected(SelectionEvent e) {
        		decryptInput(user.getUnknown07Key());
        	}
        });
        // 用未知密钥08解密
        final MenuItem mi08Key = new MenuItem(decryptMenu, SWT.PUSH);
        mi08Key.setText("Decrypt with Unknown Key 08");
        mi08Key.addSelectionListener(new SelectionAdapter() {
        	public void widgetSelected(SelectionEvent e) {
        		decryptInput(user.getUnknown08Key());
        	}
        });
        // 用用户输入的内容做为密钥解密
        mi = new MenuItem(decryptMenu, SWT.PUSH);
        mi.setText("Decrypt with User Input Key...");
        mi.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                String s = getInput("Input a KEY and the content of the input textbox will be decrypted with it");
                if(s == null)
                    showMessage("Your input is invalid!");
                else {
                    byte[] key = Util.convertHexStringToByte(s);
                    if(key == null || key.length != QQ.QQ_LENGTH_KEY)
                        showMessage("The key is invalid!");
                    else
                        decryptInput(key);
                }                    
            }
        });
        // 用用户输入的密码的密码密钥解密
        mi = new MenuItem(decryptMenu, SWT.PUSH);
        mi.setText("Decrypt with Key of User Input Password...");
        mi.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                String s = getInput("Input a password and the content of the input textbox will be decrypted with its password key");
                if(s == null)
                    showMessage("Your input is empty");
                else {
                    byte[] key = md5(md5(s.getBytes()));
                    decryptInput(key);
                }                    
            }
        });
        // 菜单事件
        decryptMenu.addMenuListener(new MenuAdapter() {
        	@Override
        	public void menuShown(MenuEvent e) {
        		boolean userNull = user == null;
        		miAgentKey.setEnabled(!userNull && user.getFileAgentKey() != null);
        		mi03Key.setEnabled(!userNull && user.getUnknown03Key() != null);
        		mi06Key.setEnabled(!userNull && user.getUnknown06Key() != null);
        		mi07Key.setEnabled(!userNull && user.getUnknown07Key() != null);
        		mi08Key.setEnabled(!userNull && user.getUnknown08Key() != null);
        		miInitKey.setEnabled(main != null);
        		miFileSessionKey.setEnabled(!userNull && user.getFileSessionKey() != null);
        		miSessionKey.setEnabled(!userNull && user.getSessionKey() != null);
        		miPasswordKey.setEnabled(!userNull && user.getPasswordKey() != null);
        	}
        });
	}
    
    /**
     * @return
     * 		输入的command
     */
    protected char inputCommand() {
        String s = getInput("Input the packet command in Hex");
        if(s == null)
        	return QQ.QQ_CMD_UNKNOWN;
        try {
            char command = (char)Integer.parseInt(s, 16);
            return command;
        } catch (NumberFormatException e1) {
            showWarning("The command you inputed isn't correct");
            return QQ.QQ_CMD_UNKNOWN;
        }
	}

	/**
     * 初始化变量
     * 
     * @param shell
     */
    protected void initializeVariables(Shell shell) {
        display = shell.getDisplay();        
        res = Resources.getInstance();
        font = new Font(display, "Courier New", 9, SWT.NORMAL);
        packets = new ArrayList<IDebugObject>();
        addPacketRunnable = new AddPacketRunnable();
    }
    
    /**
     * 如果要做为一个独立程序运行,则使用main方法
     * 
     * @param args
     * 			命令行参数
     */
    public static void main(String[] args) {        
        new Debugger(null).open();
    }
    
    /**
     * 打开一个输入对话框,返回用户输入
     * 
     * @param msg
     * 		提示
     * @return
     * 		输入的字符串
     */
    private String getInput(String msg) {
        InputDialog dialog = new InputDialog(getShell(), 
                "Input",
                msg,
                null,
                null);
        if(dialog.open() == IDialogConstants.OK_ID)
            return dialog.getValue();
        else
            return null;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
     */
    protected Control createContents(Composite parent) {
        parent.setLayout(new GridLayout());
        Composite control = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = layout.marginWidth = 0;
        control.setLayout(layout);
        control.setLayoutData(new GridData(GridData.FILL_BOTH));
        
        boolean individual = main == null;
        
        UITool.setDefaultBackground(parent.getBackground());
        
        layout = new GridLayout(2, false);
        layout.marginHeight = layout.marginWidth = 0;
        Composite comp = UITool.createContainer(control, new GridData(GridData.FILL_HORIZONTAL), layout);
        
        // 输入0x001D携带的key
        ToolBar mainTb = new ToolBar(comp, SWT.FLAT);
        ToolItem tiInputKey = new ToolItem(mainTb, SWT.PUSH);
        tiInputKey.setText("Input 0x001D Keys");
        tiInputKey.setEnabled(individual);
        tiInputKey.addSelectionListener(new SelectionAdapter() {
        	@Override
        	public void widgetSelected(SelectionEvent e) {
        		onInputKey();
        	}
        });

        // 输入初始参数
        tiInputArg = new ToolItem(mainTb, SWT.PUSH);
		tiInputArg.setText(individual ? "Input Initial Argument" : "Start Debug");
        tiInputArg.addSelectionListener(new SelectionAdapter() {
        	@Override
        	public void widgetSelected(SelectionEvent e) {
        		onStart();
        	}
        });     
        
        SashForm hSash = new SashForm(control, SWT.HORIZONTAL);
        hSash.setLayoutData(new GridData(GridData.FILL_BOTH));
        
        CTabFolder tableFolder = new CTabFolder(hSash, SWT.TOP | SWT.BORDER);
        CTabItem packetTab = new CTabItem(tableFolder, SWT.NONE);
        packetTab.setText("Packets");       
        packetTab.setImage(res.getImage(Resources.icoDebugPacket));
        tableFolder.setSelection(0);
        packetViewer = new TableViewer(tableFolder, SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL);
        packetViewer.setContentProvider(new ListContentProvider<IDebugObject>(packets));
        packetViewer.setLabelProvider(new DebugObjectLabelProvider());
        packetViewer.setUseHashlookup(true);
        packetViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                onPacketViewerSelectionChanged(event);
            }
        });
        
        Table packetTable = packetViewer.getTable();
        new TableColumn(packetTable, SWT.LEFT);
        packetTable.addControlListener(new ControlAdapter() {
            public void controlResized(ControlEvent e) {
                Table t = (Table)e.getSource();
                t.getColumn(0).setWidth(t.getClientArea().width);
            }
        });
        packetTable.addMouseListener(new MouseAdapter() {
            public void mouseUp(MouseEvent e) {
                if(e.button == 3)
                    packetMenu.setVisible(true);
            }
        });
        packetTab.setControl(packetTable);
        packetViewer.setColumnProperties(new String[] { NAME });
        packetViewer.setCellEditors(new CellEditor[] { new TextCellEditor(packetTable) });
        packetViewer.setCellModifier(new PacketNameCellModifier());
        packetViewer.setInput(this);
        
        viewFolder = new CTabFolder(hSash, SWT.TOP | SWT.BORDER);        
        // 数据字节窗口
        CTabItem byteTab = new CTabItem(viewFolder, SWT.NONE);
        byteTab.setText("Bytes");
        byteTab.setImage(res.getImage(Resources.icoDebugBytes));
        ViewForm byteForm = new ViewForm(viewFolder, SWT.FLAT);
        Composite c = new Composite(byteForm, SWT.NONE);
        c.setLayout(new GridLayout(2, false));
        chkBodyOnly = new Button(c, SWT.CHECK | SWT.FLAT);
        chkBodyOnly.setText("Body Only");
        chkBodyOnly.setLayoutData(new GridData());
        chkBodyOnly.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                IStructuredSelection selection = (IStructuredSelection)packetViewer.getSelection();
                IDebugObject obj = (IDebugObject)selection.getFirstElement();
                if(obj != null)
                    textBytes.setText(chkBodyOnly.getSelection() ? obj.getBodyHexString() : obj.getHexString());        
            }
        });
        lblSelection = new Label(c, SWT.LEFT);
        lblSelection.setText("Selection: null");
        GridData gd = new GridData();
        gd.widthHint = 200;
        lblSelection.setLayoutData(gd);
        byteForm.setTopLeft(c);                
        textBytes = new StyledText(byteForm, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL);
        textBytes.setFont(font);
        textBytes.addMouseListener(new MouseAdapter() {
            public void mouseUp(MouseEvent e) {
                if(e.button == 3) {
                    textMenu.setLocation(textBytes.toDisplay(e.x, e.y));
                    textMenu.setVisible(true);
                }
            }
        });
        textBytes.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                Point selection = textBytes.getSelectionRange();
                int start = (selection.x + 1) / 3;
                int end = (selection.x + selection.y + 1) / 3;
                lblSelection.setText("Start: " + start + ", Length: " + (end - start) + ", Hex: " + Integer.toHexString(end - start).toUpperCase());
            }
        });
        byteForm.setContent(textBytes);
        byteTab.setControl(byteForm);
        
        // 输入窗口
        CTabItem inputTab = new CTabItem(viewFolder, SWT.NONE);
        inputTab.setText("Input");
        inputTab.setImage(res.getImage(Resources.icoDebugInput));
        ViewForm inputForm = new ViewForm(viewFolder, SWT.FLAT);
        // viewform的工具条
        final ToolBar tb = new ToolBar(inputForm, SWT.FLAT);
        // 解析
        tiParse = new ToolItem(tb, SWT.DROP_DOWN);
        tiParse.setText("Parse as");
        tiParse.setEnabled(main != null);
        tiParse.addSelectionListener(new SelectionAdapter() {

⌨️ 快捷键说明

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