Python (GUI) 实现 汇编指令转换为机器码脚本

Python GUI实现汇编指令转机器码脚本

还在因为写shellcode要查文档吗?,还在因为patch时不知道汇编的机器码吗?,还在计算修改指令的偏移吗?,有它就够!!!

安装依赖

如果你没有安装 keystone-enginePyQt6,请先安装:

pip install keystone-engine PyQt6

如果安装很慢可以用国内的源 (清华源)

pip install keystone-engine PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simple 

python 脚本

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QTextEdit, QPushButton, QLineEdit
from keystone import Ks, KS_ARCH_X86, KS_MODE_64

class AssemblerGUI(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 窗口设置
        self.setWindowTitle("x86-64 汇编转机器码")
        self.setGeometry(100, 100, 600, 400)

        # 创建布局
        layout = QVBoxLayout()

        # 起始地址输入框
        self.address_label = QLabel("起始地址 (16进制):")
        self.address_input = QLineEdit("0x1000")

        # 汇编代码输入框
        self.asm_label = QLabel("输入 x86-64 汇编代码:")
        self.asm_input = QTextEdit()

        # 转换按钮
        self.convert_button = QPushButton("转换为机器码")
        self.convert_button.clicked.connect(self.assemble_code)

        # 机器码输出框
        self.output_label = QLabel("机器码输出:")
        self.output_text = QTextEdit()
        self.output_text.setReadOnly(True)

        # 添加组件到布局
        layout.addWidget(self.address_label)
        layout.addWidget(self.address_input)
        layout.addWidget(self.asm_label)
        layout.addWidget(self.asm_input)
        layout.addWidget(self.convert_button)
        layout.addWidget(self.output_label)
        layout.addWidget(self.output_text)

        self.setLayout(layout)

    def assemble_code(self):
        # 获取起始地址
        try:
            base_address = int(self.address_input.text(), 16)
        except ValueError:
            self.output_text.setText("错误: 无效的起始地址")
            return

        # 获取汇编代码
        assembly_code = self.asm_input.toPlainText().strip()
        if not assembly_code:
            self.output_text.setText("错误: 请输入汇编代码")
            return

        # 进行汇编转换
        machine_code, addr_map = self.assemble_x86_64(assembly_code, base_address)

        # 显示结果
        if machine_code:
            output_str = "### 机器码输出 ###\n"
            current_addr = base_address
            for code in machine_code:
                hex_code = " ".join(f"{b:02x}" for b in code)
                output_str += f"{hex(current_addr)}: {hex_code}  ; {addr_map[current_addr][0]}\n"
                current_addr += len(code)
            self.output_text.setText(output_str)
        else:
            self.output_text.setText("汇编错误,请检查代码!")

    def assemble_x86_64(self, assembly_code, base_address=0x1000):
        """
        将 x86-64 汇编指令转换为机器码,并计算跳转地址。

        :param assembly_code: 汇编指令 (str)
        :param base_address: 代码起始地址 (int)
        :return: (机器码, 指令地址映射)
        """
        try:
            ks = Ks(KS_ARCH_X86, KS_MODE_64)
            lines = assembly_code.split("\n")
            encoded_bytes = []
            address_map = {}

            current_address = base_address

            for line in lines:
                line = line.strip()
                if not line or line.startswith(";"):
                    continue

                encoding, _ = ks.asm(line, current_address)
                encoded_bytes.append(bytes(encoding))
                address_map[current_address] = (line, bytes(encoding))
                current_address += len(encoding)

            return encoded_bytes, address_map

        except Exception as e:
            print(f"汇编错误: {e}")
            return None, None

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AssemblerGUI()
    window.show()
    sys.exit(app.exec())

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值