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