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 + -
显示快捷键?