飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 444|回复: 6

[原创] EXE文件标题修改工具可以搜索EXE文件中的字符串(包括中文和英文)并替换标题修改

[复制链接]
  • TA的每日心情
    开心
    2024-8-8 11:24
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 前天 15:13 | 显示全部楼层 |阅读模式
    本帖最后由 china365love 于 2025-4-1 15:15 编辑

    EXE文件标题修改工具(有能力者自行打包或打包好发送到下方评论群)
    以下是一个可以修改EXE文件标题的工具的Python实现。
    这个工具可以搜索EXE文件中的字符串(包括中文和英文),并替换指定的标题字符串。
    [Python] 纯文本查看 复制代码
    ## 完整代码[/align]
    
    
    ```python
    
    import os
    
    import re
    
    import shutil
    
    import tkinter as tk
    
    from tkinter import filedialog, messagebox, ttk
    
    
    
    class ExeTitleEditor:
    
        def __init__(self, root):
    
            self.root = root
    
            self.root.title("EXE文件标题修改工具 - 大飞哥软件自习室")
    
            self.root.geometry("800x600")
    
            
    
            # 设置样式
    
            self.style = ttk.Style()
    
            self.style.configure('TLabel', font=('Microsoft YaHei', 10))
    
            self.style.configure('TButton', font=('Microsoft YaHei', 10))
    
            self.style.configure('TEntry', font=('Microsoft YaHei', 10))
    
            
    
            # 创建界面元素
    
            self.create_widgets()
    
            
    
            # 初始化变量
    
            self.file_path = ""
    
            self.backup_path = ""
    
            self.original_title = ""
    
            self.encoding_list = ['utf-8', 'gbk', 'ascii', 'utf-16', 'latin-1']
    
            
    
        def create_widgets(self):
    
            # 标题
    
            title_label = ttk.Label(self.root, text="EXE文件标题修改工具", font=('Microsoft YaHei', 16, 'bold'))
    
            title_label.pack(pady=10)
    
            
    
            # 作者信息
    
            author_label = ttk.Label(self.root, text="大飞哥软件自习室荣誉出品", font=('Microsoft YaHei', 10))
    
            author_label.pack()
    
            
    
            # 文件选择区域
    
            file_frame = ttk.LabelFrame(self.root, text="选择EXE文件", padding=10)
    
            file_frame.pack(fill=tk.X, padx=10, pady=5)
    
            
    
            self.file_entry = ttk.Entry(file_frame, width=60)
    
            self.file_entry.pack(side=tk.LEFT, padx=5)
    
            
    
            browse_button = ttk.Button(file_frame, text="浏览...", command=self.browse_file)
    
            browse_button.pack(side=tk.LEFT)
    
            
    
            # 搜索区域
    
            search_frame = ttk.LabelFrame(self.root, text="搜索标题", padding=10)
    
            search_frame.pack(fill=tk.X, padx=10, pady=5)
    
            
    
            ttk.Label(search_frame, text="当前标题:").grid(row=0, column=0, sticky=tk.W)
    
            self.current_title_var = tk.StringVar()
    
            self.current_title_label = ttk.Label(search_frame, textvariable=self.current_title_var, foreground="blue")
    
            self.current_title_label.grid(row=0, column=1, sticky=tk.W)
    
            
    
            ttk.Label(search_frame, text="或手动输入要查找的标题:").grid(row=1, column=0, sticky=tk.W)
    
            self.search_entry = ttk.Entry(search_frame, width=50)
    
            self.search_entry.grid(row=1, column=1, sticky=tk.W)
    
            
    
            search_button = ttk.Button(search_frame, text="搜索标题", command=self.search_title)
    
            search_button.grid(row=2, column=0, columnspan=2, pady=5)
    
            
    
            # 替换区域
    
            replace_frame = ttk.LabelFrame(self.root, text="替换标题", padding=10)
    
            replace_frame.pack(fill=tk.X, padx=10, pady=5)
    
            
    
            ttk.Label(replace_frame, text="新标题:").grid(row=0, column=0, sticky=tk.W)
    
            self.replace_entry = ttk.Entry(replace_frame, width=50)
    
            self.replace_entry.grid(row=0, column=1, sticky=tk.W)
    
            
    
            replace_button = ttk.Button(replace_frame, text="替换并保存", command=self.replace_title)
    
            replace_button.grid(row=1, column=0, columnspan=2, pady=5)
    
            
    
            # 日志区域
    
            log_frame = ttk.LabelFrame(self.root, text="操作日志", padding=10)
    
            log_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
    
            
    
            self.log_text = tk.Text(log_frame, wrap=tk.WORD, height=15)
    
            self.log_text.pack(fill=tk.BOTH, expand=True)
    
            
    
            # 状态栏
    
            self.status_var = tk.StringVar()
    
            self.status_var.set("就绪")
    
            status_bar = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN)
    
            status_bar.pack(fill=tk.X)
    
            
    
        def browse_file(self):
    
            file_path = filedialog.askopenfilename(
    
                title="选择EXE文件",
    
                filetypes=[("可执行文件", "*.exe"), ("所有文件", "*.*")]
    
            )
    
            if file_path:
    
                self.file_path = file_path
    
                self.file_entry.delete(0, tk.END)
    
                self.file_entry.insert(0, file_path)
    
                self.log(f"已选择文件: {file_path}")
    
                self.status_var.set(f"已加载: {os.path.basename(file_path)}")
    
                
    
                # 自动尝试查找标题
    
                self.search_title()
    
        
    
        def search_title(self):
    
            if not self.file_path:
    
                messagebox.showerror("错误", "请先选择EXE文件")
    
                return
    
                
    
            search_text = self.search_entry.get().strip()
    
            if search_text:
    
                # 使用用户指定的搜索文本
    
                self.original_title = search_text
    
                self.current_title_var.set(search_text)
    
                self.log(f"使用手动输入的搜索文本: {search_text}")
    
                return
    
                
    
            self.log("正在搜索文件中的标题...")
    
            
    
            try:
    
                with open(self.file_path, 'rb') as f:
    
                    content = f.read()
    
                    
    
                # 尝试自动查找可能的标题
    
                found = False
    
                
    
                # 查找常见的字符串模式
    
                string_pattern = re.compile(b'[\x20-\x7E\xA1-\xFF][\x20-\x7E\xA1-\xFF]+')
    
                matches = string_pattern.finditer(content)
    
                
    
                potential_titles = []
    
                
    
                for match in matches:
    
                    matched_bytes = match.group()
    
                    for encoding in self.encoding_list:
    
                        try:
    
                            decoded_str = matched_bytes.decode(encoding)
    
                            # 简单的启发式规则判断是否是可能的标题
    
                            if (len(decoded_str) >= 3 and len(decoded_str) <= 50 and 
    
                                any(c.isalpha() or c.isdigit() for c in decoded_str) and
    
                                not any(c in decoded_str for c in ['\\', '/', ':', '*', '?', '"', '<', '>', '|'])):
    
                                potential_titles.append(decoded_str)
    
                        except UnicodeDecodeError:
    
                            continue
    
                
    
                # 去重并按长度排序
    
                potential_titles = sorted(list(set(potential_titles)), key=lambda x: -len(x))
    
                
    
                if potential_titles:
    
                    # 选择最长的字符串作为可能的标题
    
                    self.original_title = potential_titles[0]
    
                    self.current_title_var.set(self.original_title)
    
                    self.log(f"找到可能的标题: {self.original_title}")
    
                    self.log("如果这不是正确的标题,请手动输入要查找的标题")
    
                    found = True
    
                
    
                if not found:
    
                    self.log("未能自动找到标题,请手动输入要查找的标题")
    
                    messagebox.showinfo("提示", "未能自动找到标题,请手动输入要查找的标题")
    
                    
    
            except Exception as e:
    
                self.log(f"搜索标题时出错: {str(e)}")
    
                messagebox.showerror("错误", f"搜索标题时出错: {str(e)}")
    
        
    
        def replace_title(self):
    
            if not self.file_path:
    
                messagebox.showerror("错误", "请先选择EXE文件")
    
                return
    
                
    
            if not self.original_title and not self.search_entry.get().strip():
    
                messagebox.showerror("错误", "请先搜索或输入要替换的标题")
    
                return
    
                
    
            new_title = self.replace_entry.get().strip()
    
            if not new_title:
    
                messagebox.showerror("错误", "请输入新的标题")
    
                return
    
                
    
            # 如果用户手动输入了搜索文本,使用它
    
            search_text = self.search_entry.get().strip()
    
            if search_text:
    
                self.original_title = search_text
    
                
    
            # 创建备份
    
            backup_dir = os.path.join(os.path.dirname(self.file_path), "backup")
    
            if not os.path.exists(backup_dir):
    
                os.makedirs(backup_dir)
    
                
    
            filename = os.path.basename(self.file_path)
    
            self.backup_path = os.path.join(backup_dir, f"original_{filename}")
    
            
    
            try:
    
                # 创建备份
    
                shutil.copy2(self.file_path, self.backup_path)
    
                self.log(f"已创建备份: {self.backup_path}")
    
                
    
                # 读取文件内容
    
                with open(self.file_path, 'rb') as f:
    
                    content = f.read()
    
                
    
                # 尝试用不同编码替换
    
                replaced = False
    
                for encoding in self.encoding_list:
    
                    try:
    
                        original_bytes = self.original_title.encode(encoding)
    
                        new_bytes = new_title.encode(encoding)
    
                        
    
                        if original_bytes in content:
    
                            new_content = content.replace(original_bytes, new_bytes)
    
                            
    
                            # 写入修改后的文件
    
                            with open(self.file_path, 'wb') as f:
    
                                f.write(new_content)
    
                            
    
                            self.log(f"成功替换标题 (编码: {encoding})")
    
                            self.log(f"原标题: {self.original_title}")
    
                            self.log(f"新标题: {new_title}")
    
                            replaced = True
    
                            break
    
                            
    
                    except UnicodeEncodeError:
    
                        continue
    
                    except Exception as e:
    
                        self.log(f"使用编码 {encoding} 替换时出错: {str(e)}")
    
                        continue
    
                
    
                if not replaced:
    
                    self.log("未能找到匹配的标题进行替换")
    
                    messagebox.showerror("错误", "未能找到匹配的标题进行替换")
    
                    # 恢复备份
    
                    shutil.copy2(self.backup_path, self.file_path)
    
                    self.log("已恢复原始文件")
    
                else:
    
                    messagebox.showinfo("成功", "标题替换成功!")
    
                    self.status_var.set(f"标题已修改为: {new_title}")
    
                    
    
            except Exception as e:
    
                self.log(f"替换标题时出错: {str(e)}")
    
                messagebox.showerror("错误", f"替换标题时出错: {str(e)}")
    
                if os.path.exists(self.backup_path):
    
                    # 恢复备份
    
                    shutil.copy2(self.backup_path, self.file_path)
    
                    self.log("已恢复原始文件")
    
        
    
        def log(self, message):
    
            self.log_text.insert(tk.END, message + "\n")
    
            self.log_text.see(tk.END)
    
            self.root.update()
    
    
    
    if __name__ == "__main__":
    
        root = tk.Tk()
    
        app = ExeTitleEditor(root)
    
        root.mainloop()
    
    ```
    
    
    
    

    ## 功能说明

    1. **文件选择**:
       - 浏览并选择要修改的EXE文件
       - 自动创建文件备份(在原始文件同目录的backup文件夹中)

    2. **标题搜索**:
       - 自动尝试查找EXE文件中的可能标题
       - 支持手动输入要查找的标题(当自动查找失败时)

    3. **标题替换**:
       - 输入新标题并替换原标题
       - 支持多种编码格式(UTF-8, GBK, ASCII, UTF-16, Latin-1等)
       - 自动尝试使用最合适的编码进行替换

    4. **安全特性**:
       - 自动创建备份文件
       - 如果替换失败自动恢复原始文件
       - 详细的操作日志

    5. **用户界面**:
       - 简洁直观的GUI界面
       - 操作状态显示
       - 详细的日志记录

    ## 使用方法

    1. 将代码保存为`exe_title_editor.py`
    2. 安装Python(如果尚未安装)
    3. 安装必要的库(仅需要标准库,无需额外安装)
    4. 运行程序:`python exe_title_editor.py`
    5. 按照界面提示操作:
       - 选择EXE文件
       - 自动或手动搜索标题
       - 输入新标题
       - 点击"替换并保存"

    ## 注意事项

    1. 此工具会修改EXE文件,建议先备份重要文件
    2. 不是所有EXE文件的标题都可以修改,有些可能被加密或压缩
    3. 修改后的EXE文件应进行测试以确保功能正常
    4. 某些杀毒软件可能会误报,因为修改EXE文件是敏感操作

    这个工具应该能满足您修改EXE文件标题的需求,同时提供了足够的安全措施来防止意外损坏文件。

    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2025-1-13 09:04
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 前天 17:08 | 显示全部楼层
    谢谢  谢谢  非常感谢
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 前天 17:45 | 显示全部楼层
    PYG19周年生日快乐!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 昨天 00:24 | 显示全部楼层
    坐等大佬们制作成品分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2025-1-14 07:49
  • 签到天数: 1587 天

    [LV.Master]伴坛终老

    发表于 昨天 08:10 | 显示全部楼层
    能打包成exe就更好了
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-13 08:02
  • 签到天数: 1333 天

    [LV.10]以坛为家III

    发表于 4 小时前 | 显示全部楼层
    112233.png 源码直接复制后,还的稍微修改一下才能打包,打包后运行,测试了下,随便找了一个无壳的delphi的程序,改了下,没啥效果,其实感觉,改东西的话,还的是手动去改才行啊。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表