📄 debugger.java
字号:
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 + -