📄 debugger.java
字号:
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StringTokenizer st = new StringTokenizer(getSelectionText(), " ");
int len = st.countTokens();
if(len != 2)
showWarning("To show a port, you should selected 2 bytes.");
else {
byte[] ip = Util.convertHexStringToByte(getSelectionText());
int port = (ip[0] << 8) & 0xFF00 | ip[1] & 0xFF;
showMessage(String.valueOf(port));
}
}
});
// get integer
mi = new MenuItem(textMenu, SWT.PUSH);
mi.setText("Show as Integer");
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StringTokenizer st = new StringTokenizer(getSelectionText(), " ");
int len = st.countTokens();
if(len > 4)
showWarning("To show a integer, you should selected no more than 4 bytes.");
else {
String s = getSelectionText().replaceAll(" ", "");
int i = Util.getInt(s, 16, 0);
showMessage(String.valueOf(i));
}
}
});
// get long
mi = new MenuItem(textMenu, SWT.PUSH);
mi.setText("Show as Long");
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StringTokenizer st = new StringTokenizer(getSelectionText(), " ");
int len = st.countTokens();
if(len > 8)
showWarning("To show a integer, you should selected no more than 8 bytes.");
else {
String s = getSelectionText().replaceAll(" ", "");
long l = Util.getLong(s, 16, 0);
showMessage(String.valueOf(l));
}
}
});
// get time
mi = new MenuItem(textMenu, SWT.PUSH);
mi.setText("Show as Time");
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
StringTokenizer st = new StringTokenizer(getSelectionText(), " ");
int len = st.countTokens();
if(len > 4)
showWarning("To show a integer, you should selected no more than 4 bytes.");
else {
String s = getSelectionText().replaceAll(" ", "");
long t = (long)Integer.parseInt(s, 16) * 1000L;
showMessage(new Date(t).toString());
}
}
});
// separator
mi = new MenuItem(textMenu, SWT.SEPARATOR);
// Go to
mi = new MenuItem(textMenu, SWT.PUSH);
mi.setText("Go To...");
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String s = getInput("Which byte you want to locate");
if(s == null)
showWarning("You Should Input a Integer");
else {
int index = Util.getInt(s, -1);
if(index == -1)
return;
textBytes.setSelection(index * 3, index * 3 + 2);
}
}
});
// menu listener
textMenu.addMenuListener(new MenuAdapter() {
public void menuShown(MenuEvent e) {
textMenu.getItem(0).setEnabled(getSelectionText().length() > 0);
}
});
// 解密菜单
decryptMenu = new Menu(getShell());
// 用会话密钥解密
mi = new MenuItem(decryptMenu, SWT.PUSH);
mi.setText("Decrypt with Session Key");
mi.setEnabled(main != null);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
decryptInput(user.getSessionKey());
}
});
// 用密码密钥解密
mi = new MenuItem(decryptMenu, SWT.PUSH);
mi.setText("Decrpty with Password Key");
mi.setEnabled(main != null);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
decryptInput(user.getPasswordKey());
}
});
// 用文件传输会话密钥解密
mi = new MenuItem(decryptMenu, SWT.PUSH);
mi.setText("Decrypt with File Session Key");
mi.setEnabled(main != null);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
decryptInput(user.getFileSessionKey());
}
});
// 用文件中转密钥解密
mi = new MenuItem(decryptMenu, SWT.PUSH);
mi.setText("Decrypt with File Agent Key");
mi.setEnabled(main != null);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
decryptInput(user.getFileAgentKey());
}
});
// 用QQ初始密钥解密
mi = new MenuItem(decryptMenu, SWT.PUSH);
mi.setText("Decrypt with QQ Initial Key");
mi.setEnabled(main != null);
mi.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
decryptInput(user.getInitKey());
}
});
// 用用户输入的内容做为密钥解密
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_KEY_LENGTH)
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 = Util.doMD5(Util.doMD5(s.getBytes()));
decryptInput(key);
}
}
});
}
/**
* 初始化变量
*
* @param shell
*/
protected void initializeVariables(Shell shell) {
display = shell.getDisplay();
icons = IconHolder.getInstance();
font = new Font(display, "Courier New", 9, SWT.NORMAL);
handCursor = display.getSystemCursor(SWT.CURSOR_HAND);
packets = new ArrayList();
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);
lblAgent = UITool.createLink(comp, "Input File Agent Info", null, new GridData());
lblAgent.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
onAgent();
}
});
lblAgent.setVisible(individual);
lblStart = UITool.createLink(comp, individual ? "Input Initial Argument" : "Start Debug", null, new GridData(GridData.FILL_HORIZONTAL));
lblStart.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent 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(icons.getImage(IconHolder.icoDebugPacket));
tableFolder.setSelection(0);
packetViewer = new TableViewer(tableFolder, SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL);
packetViewer.setContentProvider(new ListContentProvider(packets));
packetViewer.setLabelProvider(new DebugObjectLabelProvider());
packetViewer.setUseHashlookup(true);
packetViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
onPacketViewerSelectionChanged(event);
}
});
Table packetTable = packetViewer.getTable();
TableColumn tc = 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);
SashForm vSash = new SashForm(hSash, SWT.VERTICAL);
CTabFolder otherFolder = new CTabFolder(vSash, SWT.TOP | SWT.BORDER);
CTabItem descTab = new CTabItem(otherFolder, SWT.NONE);
descTab.setText("Packet Format");
descTab.setImage(icons.getImage(IconHolder.icoDebugFormat));
textDesc = new Text(otherFolder, SWT.MULTI | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);
textDesc.setFont(font);
descTab.setControl(textDesc);
otherFolder.setSelection(0);
viewFolder = new CTabFolder(vSash, SWT.TOP | SWT.BORDER);
// 数据字节窗口
CTabItem byteTab = new CTabItem(viewFolder, SWT.NONE);
byteTab.setText("Bytes");
byteTab.setImage(icons.getImage(IconHolder.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(icons.getImage(IconHolder.icoDebugInput));
ViewForm inputForm = new ViewForm(viewFolder, SWT.FLAT);
// viewform的工具条
final ToolBar tb = new ToolBar(inputForm, SWT.FLAT);
// 解析
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -