攻防世界-re-1000Click

第一种方法:IDA静态分析

拿到题目放进DIE分析,可见无壳,32位程序
image
点击Click,点击Check,弹出Error!!!
image
在IDA里shift+F12跳转到字符串界面,搜索error
image
双击“Error!!!”跳转到反汇编界面
image
ctrl+x交叉引用,双击地址跳转并向上查找
image
当然可以用最笨的方法在字符串界面搜索flag,对flag字符串进行交叉引用,哪个可以选哪个

第二种方法:CE进程修改,这个比较好玩

点击文件-打开进程-选择Click.exe-打开
image
在Click界面点击Click,点到哪个数就在CE中填入哪个数,选择精确数值(至于为什么选"精确数值",看官方文档),一般32位程序选择4字节,点击首次扫描
image
然后再点几次Click,把得到的次数填入CE,点击再次扫描,会得到一个地址,双击保存
image
双击数字7进行数值修改,填999,因为1000次才会显示flag
image
最后点击Click,获得flag
image

第三种方法x32dbg分析(od同理使用中文搜索,没下od就不演示了)

进入主程序界面,右键选择搜索-所有模块-字符串
image
搜索“error"
image
双击跳转值汇编窗口,向上查找
image

第四种连点器

点击查看代码
import tkinter as tk
from tkinter import ttk, messagebox
import threading
import time
import pyautogui
import keyboard
from pynput import mouse

class AutoClicker:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 连点器")
        self.root.geometry("400x350")
        self.root.resizable(False, False)
        
        # 连点状态
        self.clicking = False
        self.click_thread = None
        self.remaining_clicks = 0
        
        # 设置变量
        self.click_interval = tk.DoubleVar(value=0.1)
        self.click_type = tk.StringVar(value="left")
        self.click_mode = tk.StringVar(value="infinite")  # infinite 或 limited
        self.click_count = tk.IntVar(value=10)
        self.hotkey_start = tk.StringVar(value="f6")
        self.hotkey_stop = tk.StringVar(value="f7")
        
        self.create_widgets()
        self.setup_hotkeys()
        
    def create_widgets(self):
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 标题
        title_label = ttk.Label(main_frame, text="Python 连点器", font=("Arial", 16, "bold"))
        title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20))
        
        # 点击间隔设置
        interval_frame = ttk.Frame(main_frame)
        interval_frame.grid(row=1, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
        
        ttk.Label(interval_frame, text="点击间隔 (秒):").grid(row=0, column=0, sticky=tk.W)
        interval_scale = ttk.Scale(interval_frame, from_=0.01, to=2.0, 
                                  variable=self.click_interval, orient=tk.HORIZONTAL)
        interval_scale.grid(row=0, column=1, sticky=(tk.W, tk.E), padx=5)
        
        interval_value = ttk.Label(interval_frame, textvariable=self.click_interval)
        interval_value.grid(row=0, column=2, padx=5)
        
        # 点击类型选择
        type_frame = ttk.Frame(main_frame)
        type_frame.grid(row=2, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
        
        ttk.Label(type_frame, text="点击类型:").grid(row=0, column=0, sticky=tk.W)
        ttk.Radiobutton(type_frame, text="左键", variable=self.click_type, 
                       value="left").grid(row=0, column=1, padx=5)
        ttk.Radiobutton(type_frame, text="右键", variable=self.click_type, 
                       value="right").grid(row=0, column=2, padx=5)
        
        # 点击模式设置
        mode_frame = ttk.Frame(main_frame)
        mode_frame.grid(row=3, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
        
        ttk.Label(mode_frame, text="点击模式:").grid(row=0, column=0, sticky=tk.W)
        ttk.Radiobutton(mode_frame, text="无限", variable=self.click_mode, 
                       value="infinite", command=self.toggle_click_mode).grid(row=0, column=1, padx=5)
        ttk.Radiobutton(mode_frame, text="指定次数", variable=self.click_mode, 
                       value="limited", command=self.toggle_click_mode).grid(row=0, column=2, padx=5)
        
        # 点击次数设置
        count_frame = ttk.Frame(main_frame)
        count_frame.grid(row=4, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
        
        ttk.Label(count_frame, text="点击次数:").grid(row=0, column=0, sticky=tk.W)
        self.count_entry = ttk.Entry(count_frame, textvariable=self.click_count, width=10, state=tk.NORMAL)
        self.count_entry.grid(row=0, column=1, padx=5, sticky=tk.W)
        
        # 快捷键设置
        hotkey_frame = ttk.Frame(main_frame)
        hotkey_frame.grid(row=5, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=5)
        
        ttk.Label(hotkey_frame, text="开始快捷键:").grid(row=0, column=0, sticky=tk.W)
        start_entry = ttk.Entry(hotkey_frame, textvariable=self.hotkey_start, width=5)
        start_entry.grid(row=0, column=1, padx=5)
        start_entry.bind('<FocusOut>', lambda e: self.update_hotkeys())
        
        ttk.Label(hotkey_frame, text="停止快捷键:").grid(row=0, column=2, sticky=tk.W, padx=(20,0))
        stop_entry = ttk.Entry(hotkey_frame, textvariable=self.hotkey_stop, width=5)
        stop_entry.grid(row=0, column=3, padx=5)
        stop_entry.bind('<FocusOut>', lambda e: self.update_hotkeys())
        
        # 控制按钮
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=6, column=0, columnspan=2, pady=20)
        
        self.start_button = ttk.Button(button_frame, text="开始连点", command=self.start_clicking)
        self.start_button.grid(row=0, column=0, padx=10)
        
        self.stop_button = ttk.Button(button_frame, text="停止连点", command=self.stop_clicking, state=tk.DISABLED)
        self.stop_button.grid(row=0, column=1, padx=10)
        
        # 状态显示
        self.status_var = tk.StringVar(value="状态: 就绪")
        status_label = ttk.Label(main_frame, textvariable=self.status_var, font=("Arial", 10))
        status_label.grid(row=7, column=0, columnspan=2, pady=10)
        
        # 说明文本
        info_text = tk.Text(main_frame, height=4, width=50, font=("Arial", 9))
        info_text.grid(row=8, column=0, columnspan=2, pady=10)
        info_text.insert(tk.END, "使用说明:\n")
        info_text.insert(tk.END, "1. 设置点击间隔、类型和次数\n")
        info_text.insert(tk.END, "2. 使用快捷键或按钮开始/停止连点\n")
        info_text.insert(tk.END, "3. 将鼠标移动到需要点击的位置")
        info_text.config(state=tk.DISABLED)
        
        # 配置列权重
        main_frame.columnconfigure(1, weight=1)
        interval_frame.columnconfigure(1, weight=1)
        
        # 初始化点击次数输入框状态
        self.toggle_click_mode()
        
    def toggle_click_mode(self):
        if self.click_mode.get() == "limited":
            self.count_entry.config(state=tk.NORMAL)
        else:
            self.count_entry.config(state=tk.DISABLED)
    
    def setup_hotkeys(self):
        try:
            keyboard.add_hotkey(self.hotkey_start.get(), self.start_clicking)
            keyboard.add_hotkey(self.hotkey_stop.get(), self.stop_clicking)
        except Exception as e:
            messagebox.showerror("错误", f"设置快捷键失败: {str(e)}")
    
    def update_hotkeys(self):
        try:
            keyboard.clear_all_hotkeys()
            keyboard.add_hotkey(self.hotkey_start.get(), self.start_clicking)
            keyboard.add_hotkey(self.hotkey_stop.get(), self.stop_clicking)
        except Exception as e:
            messagebox.showerror("错误", f"更新快捷键失败: {str(e)}")
    
    def start_clicking(self):
        if not self.clicking:
            # 验证点击次数
            if self.click_mode.get() == "limited":
                try:
                    count = self.click_count.get()
                    if count <= 0:
                        messagebox.showerror("错误", "点击次数必须大于0")
                        return
                    self.remaining_clicks = count
                except tk.TclError:
                    messagebox.showerror("错误", "请输入有效的点击次数")
                    return
            else:
                self.remaining_clicks = -1  # 无限模式
                
            self.clicking = True
            self.start_button.config(state=tk.DISABLED)
            self.stop_button.config(state=tk.NORMAL)
            
            if self.click_mode.get() == "limited":
                self.status_var.set(f"状态: 连点中 - 剩余 {self.remaining_clicks} 次")
            else:
                self.status_var.set(f"状态: 连点中 - 无限模式")
            
            # 在新线程中执行连点
            self.click_thread = threading.Thread(target=self.click_loop, daemon=True)
            self.click_thread.start()
    
    def stop_clicking(self):
        self.clicking = False
        self.start_button.config(state=tk.NORMAL)
        self.stop_button.config(state=tk.DISABLED)
        self.status_var.set("状态: 已停止")
    
    def click_loop(self):
        while self.clicking and (self.remaining_clicks == -1 or self.remaining_clicks > 0):
            try:
                if self.click_type.get() == "left":
                    pyautogui.click()
                else:
                    pyautogui.click(button='right')
                
                # 更新剩余点击次数
                if self.remaining_clicks > 0:
                    self.remaining_clicks -= 1
                    self.root.after(0, self.update_status)
                
                # 检查是否完成指定次数
                if self.remaining_clicks == 0:
                    self.root.after(0, self.stop_clicking)
                    break
                    
                time.sleep(self.click_interval.get())
            except Exception as e:
                self.root.after(0, lambda: self.status_var.set(f"错误: {str(e)}"))
                break
    
    def update_status(self):
        if self.click_mode.get() == "limited":
            self.status_var.set(f"状态: 连点中 - 剩余 {self.remaining_clicks} 次")
    
    def on_closing(self):
        self.clicking = False
        if self.click_thread and self.click_thread.is_alive():
            self.click_thread.join(timeout=1.0)
        self.root.destroy()

if __name__ == "__main__":
    try:
        root = tk.Tk()
        app = AutoClicker(root)
        root.protocol("WM_DELETE_WINDOW", app.on_closing)
        root.mainloop()
    except ImportError as e:
        print(f"缺少必要的库,请安装: {e}")
        print("运行: pip install pyautogui keyboard pynput")
posted @ 2025-11-06 14:44  这道题太难了  阅读(7)  评论(0)    收藏  举报