还在因为写shellcode要查文档吗?,还在因为patch时不知道汇编的机器码吗?,还在计算修改指令的偏移吗?,有它就够!!!
安装依赖
如果你没有安装 keystone-engine 和 PyQt6,请先安装:
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())
效果

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

被折叠的 条评论
为什么被折叠?



