吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5035|回复: 51
收起左侧

[原创] 关于Master PDF Editor5.9.94破解的分析

[复制链接]
gxr2010 发表于 2025-9-19 16:47
本帖最后由 gxr2010 于 2025-9-19 17:13 编辑

最新版的下载地址:https://code-industry.net/downloads/
od64载入,字符串搜索‘’(NOT REGISTERED)
001.png
定位到段首,右键-查找引用-选定的地址,找到两处:
00007FF7EC0C3B68
00007FF7EC0DBAC3

任何一处双击,返回
002.png
发现上面的cmp byteptr ds:[r14+69],r15b非常可疑
003.png
找到相关地址
004.png
重新运行程序,一路看,最终定位到这里
005.png
成品展示
006.png

免费评分

参与人数 10吾爱币 +15 热心值 +10 收起 理由
bullshit + 1 + 1 我很赞同!
那些年的灰色 + 1 + 1 谢谢@Thanks!
xinmu123 + 1 + 1 我很赞同!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Clarence210 + 1 + 1 我很赞同!
RIKKIA + 1 + 1 热心回复!
xuhao4577062311 + 1 + 1 我很赞同!
qck + 1 + 1 谢谢@Thanks!
lzk1 + 1 我很赞同!
bailemenmlbj + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qq465881818 发表于 2025-9-21 15:12
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import os
import sys
import ctypes


class MasterPDFPatcher:
    def __init__(self, root):
        self.root = root
        self.root.title("Master PDF Editor 补丁工具")
        self.root.geometry("600x400")
        self.root.resizable(False, False)

        # 设置中文字体
        self.font = ('SimHei', 10)

        # 文件路径变量
        self.file_path = tk.StringVar()
        self.target_address = tk.StringVar(value="00007FF7EC0C255C")
        self.target_instruction = tk.StringVar(value="mov bl,1")
        self.machine_code = tk.StringVar(value="B301")  # mov bl,1的机器码

        self.create_widgets()

    def create_widgets(self):
        # 创建主框架
        main_frame = ttk.Frame(self.root, padding="20")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 文件选择部分
        ttk.Label(main_frame, text="Master PDF Editor 可执行文件:", font=self.font).grid(row=0, column=0, sticky=tk.W,
                                                                                         pady=5)

        file_frame = ttk.Frame(main_frame)
        file_frame.grid(row=1, column=0, columnspan=2, sticky=tk.EW, pady=5)

        ttk.Entry(file_frame, textvariable=self.file_path, width=50, font=self.font).pack(side=tk.LEFT, fill=tk.X,
                                                                                          expand=True, padx=(0, 10))
        ttk.Button(file_frame, text="浏览...", command=self.browse_file, width=10).pack(side=tk.RIGHT)

        # 地址设置部分
        ttk.Label(main_frame, text="目标内存地址:", font=self.font).grid(row=2, column=0, sticky=tk.W, pady=5)
        ttk.Entry(main_frame, textvariable=self.target_address, width=30, font=self.font).grid(row=2, column=1,
                                                                                               sticky=tk.W, pady=5)

        # 指令设置部分
        ttk.Label(main_frame, text="要替换的指令:", font=self.font).grid(row=3, column=0, sticky=tk.W, pady=5)
        ttk.Entry(main_frame, textvariable=self.target_instruction, width=30, font=self.font).grid(row=3, column=1,
                                                                                                   sticky=tk.W, pady=5)

        # 机器码设置部分
        ttk.Label(main_frame, text="对应的机器码 (十六进制):", font=self.font).grid(row=4, column=0, sticky=tk.W,
                                                                                    pady=5)
        ttk.Entry(main_frame, textvariable=self.machine_code, width=30, font=self.font).grid(row=4, column=1,
                                                                                             sticky=tk.W, pady=5)

        # 状态显示
        self.status_var = tk.StringVar(value="就绪")
        ttk.Label(main_frame, textvariable=self.status_var, font=self.font, foreground="blue").grid(row=5, column=0,
                                                                                                    columnspan=2,
                                                                                                    pady=10)

        # 操作按钮
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=6, column=0, columnspan=2, pady=20)

        ttk.Button(button_frame, text="备份文件", command=self.backup_file, width=15).pack(side=tk.LEFT, padx=10)
        ttk.Button(button_frame, text="执行修改", command=self.patch_file, width=15).pack(side=tk.LEFT, padx=10)
        ttk.Button(button_frame, text="退出", command=self.root.quit, width=15).pack(side=tk.LEFT, padx=10)

        # 添加说明文本(修复变量名和作用域问题)
        instruction_text = """
注意事项:
1. 请先备份原始文件,以防操作失误
2. 修改前请关闭Master PDF Editor程序
3. 可能需要以管理员权限运行此工具
4. 本工具仅用于学习和研究目的
        """
        # 确保在main_frame的作用域内使用它
        ttk.Label(main_frame, text=instruction_text, font=self.font, justify=tk.LEFT).grid(
            row=7, column=0, columnspan=2, pady=10, sticky=tk.W)

        # 配置列权重
        main_frame.columnconfigure(1, weight=1)

    def browse_file(self):
        file_path = filedialog.askopenfilename(
            title="选择masterpdfeditor.exe",
            filetypes=[("可执行文件", "*.exe"), ("所有文件", "*.*")]
        )
        if file_path:
            self.file_path.set(file_path)

    def backup_file(self):
        exe_path = self.file_path.get()
        if not exe_path or not os.path.exists(exe_path):
            messagebox.showerror("错误", "请先选择有效的可执行文件")
            return

        backup_path = f"{exe_path}.backup"
        try:
            # 复制文件作为备份
            with open(exe_path, 'rb') as src, open(backup_path, 'wb') as dst:
                dst.write(src.read())
            self.status_var.set(f"已创建备份: {backup_path}")
            messagebox.showinfo("成功", f"备份文件已创建: {backup_path}")
        except Exception as e:
            self.status_var.set(f"备份失败: {str(e)}")
            messagebox.showerror("错误", f"备份失败: {str(e)}")

    def patch_file(self):
        exe_path = self.file_path.get()
        if not exe_path or not os.path.exists(exe_path):
            messagebox.showerror("错误", "请先选择有效的可执行文件")
            return

        # 检查是否以管理员权限运行
        if not self.is_admin():
            messagebox.showwarning("警告", "建议以管理员权限运行此程序,否则可能无法修改文件")

        try:
            # 转换地址为整数 (去掉0x前缀)
            address_str = self.target_address.get().replace("0x", "")
            target_address = int(address_str, 16)

            # 获取机器码
            machine_code = self.machine_code.get()
            # 转换为字节
            patch_bytes = bytes.fromhex(machine_code)

            # 打开文件并修改
            with open(exe_path, 'r+b') as f:
                # 移动到目标地址
                f.seek(target_address)
                # 写入新的机器码
                f.write(patch_bytes)

            self.status_var.set("修改成功!")
            messagebox.showinfo("成功", "文件修改成功!")
        except Exception as e:
            self.status_var.set(f"修改失败: {str(e)}")
            messagebox.showerror("错误", f"修改失败: {str(e)}")

    def is_admin(self):
        """检查程序是否以管理员权限运行"""
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            return False


if __name__ == "__main__":
    root = tk.Tk()
    app = MasterPDFPatcher(root)
    root.mainloop()
Xingjiangg09 发表于 2025-9-20 13:34
gxr2010 发表于 2025-9-20 11:40
X64dbg论坛里有,照着抄一下就可以了。
直接定位到00007FF7EC0C255C,修改为mov bl,1,右键,补丁,保 ...

好的,谢谢
cn2jp 发表于 2025-9-19 17:17
软件本身这种强度的算法是不是也没有特别强的防破解意图?
bailemenmlbj 发表于 2025-9-19 17:36
虽然看不懂但感觉很不错的
芽衣 发表于 2025-9-19 17:38
这个软件还挺好用的,办公经常用到
cux666 发表于 2025-9-19 17:48
这个版本不错,值得使用。
属于你 发表于 2025-9-19 18:05
这个软件操作逻辑不友好,但是功能是我用过最强的
Rizia233 发表于 2025-9-19 18:48
这个软件还挺好用的,和acrobat一样,办公经常用到
Noangler 发表于 2025-9-19 19:38
谢谢分享方法。
20116189 发表于 2025-9-19 21:23
谢谢大佬分享方法
qck 发表于 2025-9-19 21:48
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-5-19 15:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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