需要使用到 JFrame 和画图工具 Graphics2D
1.创建一个 JFrame 窗口并设置其大小。
JFrame frame = new JFrame("Fireworks");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
2.创建一个 JPanel,并将其设置为 JFrame 的内容面板。
JPanel panel = new JPanel();
frame.setContentPane(panel);
3.重写 JPanel 的 paintComponent() 方法,在方法中调用 Graphics2D 的 drawOval()、drawLine() 和 fillOval() 方法来绘制烟花效果。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int x = 250;
int y = 250;
int r = 5;
int length = 30;
Color[] colors = {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.BLUE, Color.MAGENTA};
for (int i = 0; i < 6; i++) {
g2d.setColor(colors[i]);
g2d.setStroke(new BasicStroke(2.0f));
for (int j = 0; j < 12; j++) {
double angle = (30 * j) * Math.PI / 180;
int x1 = (int)Math.round(x + r * Math.cos(angle));
int y1 = (int)Math.round(y + r * Math.sin(angle));
int x2 = (int)Math.round(x + (r + length) * Math.cos(angle));
int y2 = (int)Math.round(y + (r + length) * Math.sin(angle));
g2d.drawLine(x1, y1, x2, y2);
}
g2d.fillOval(x - r, y - r, 2 * r, 2 * r);
r += 10;
length += 20;
}
}
4.在 main() 方法中创建一个 Timer,每隔一定时间调用 JPanel 的 repaint() 方法,不断刷新窗口。
public static void main(String[] args) {
JFrame frame = new JFrame("Fireworks");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
JPanel panel = new JPanel() {
protected void paintComponent(Graphics g) {
// 绘制烟花效果的代码
}
};
frame.setContentPane(panel);
int delay = 10;
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
panel.repaint();
}
};
new Timer(delay, taskPerformer).start();
frame.setVisible(true);
}
5.运行程序就可以看到烟花特效啦!
这段代码中,我们使用Python的turtle库来实现烟花效果。在程序开始时,我们通过turtle.Screen()
函数创建了一个画布,并设置了背景颜色和大小。接着,我们定义了一个画笔pen
,并将其初始化为未下笔状态。然后,我们定义了烟花效果的主要函数firework
。该函数首先从颜色列表中随机选择一个颜色,接着在指定位置画出火柴棒,并开始模拟烟花爆炸效果。最后,我们绑定了鼠标点击事件,当用户点击画布时,程序会在鼠标点击的位置调用firework
函数。最后,我们通过turtle.mainloop()
方法进入主事件循环。
动态分析技术中最重要的工具是调试器,分为用户模式和内核模式两种类型。
用户模式调试器: 用来调试用户模式应用程序的调试器,工作在Ring3级,例如OllyDbg、x64dbg。也存在有VisualC++等编译器自带的调试器。
内核模式调试器: 能调试操作系统内核的调试器,例如WinDbg。
OllyDbg
简称OD,用户级调试器。OD是一款十分强大的32位调试器,虽然作者早已停止更新,但作为学习工具还是可以的。实践中建议使用x64dbg的32位版本。
64位平台可以使用x64dbg、IDA Pro等
操作窗口
配置
ollydbg.ini: OD中Options菜单里的所有设置,保存在ollydbg.ini中
UDD文件: OD的工程文件,用于保存当前调试的一些状态,例如断点、注释等,以便下次调试时继续使用。
插件: OD支持插件,并提供了相关api。这使得其扩展性非常好。
调试设置
单击“Options” —“Debugsingoplions” 选项,打开调试设置选项对话框,一般保持默认即可。其中,“Exceptions” (异常)选项用于设置让OllyDbg 忽路或不忽略某些异常,建议全部选择。 有关异常的知识将在第8 章讲解。
加载符号文件
点击“Debug”- "Seleet importlibraries” 选项,打开导入库窗口进行加载。符号文件可以在调试过程中,让函数以函数名字表示。比如存在一个函数叫“abc”,但是在调试器中很可能是一串数字”004012f7“,而符号文件就能让它显示为”abc“。
基本操作
常见快捷键:
断点
常用断点有:INT3断点、硬件断点、消息断点。
INT3断点
当你使用bp命令或者按下F2时,所设的断点为INT3断点。原理是把下断点的地方的指令换成CC指令来引发异常,调试器捕获异常后中断,并把原指令还原。例如:
复制代码 隐藏代码
004011F3 68 D0404000
||||||||||||
004011F3 CC D0404000
优点: 可以设置无数个INT3断点,只要电脑受得住。
缺点: 由于修改了程序,所以易被检测
硬件断点
设断方法是在指定的代码行单击右键,执行快捷菜单中的“Breakpoint” 一 "Hardware,on execution”(“断点〞一,“硬件执行”)命令(也可以在命令行中设置“HE地址”)
最多可以设置四个硬件断点。
其中DR0、DR1、DR2、DR3可以设定地址,用来断下,DR7用来控制状态。
原理: 设置好断点后,运行到改地址时,CPU会向调试器发送异常,调试器捕获后中断。
优点: 执行速度快,不易被检测
缺点: 只能设置四个