Files
2025-12-11 16:27:56 +08:00

74 lines
2.7 KiB
Python

import idc
# ====================================================================
# 【请务必修改以下参数】
# ====================================================================
# 1. 你想开始执行的代码段的起始地址
# 示例:假设你想从函数 sub_1000 开始执行
START_ADDRESS = 0x1024C6614
# 2. 你想执行的步数(单步执行的次数)
# 例如:执行 5 条指令
STEPS_TO_EXECUTE = 5
# ====================================================================
def execute_code_snippet(start_addr, num_steps):
# 1. 获取当前线程 ID
tid = idc.get_current_thread()
if tid == -1:
print("[!] 错误:无法获取当前线程 ID。")
return
# 2. 设置指令指针 (PC/RIP/EIP) 到起始地址
# 寄存器名称取决于架构 (ARM64用'PC', x64用'RIP', x86用'EIP')
architecture = idc.get_inf_attr(idc.INF_PROCNAME)
if "arm" in architecture.lower():
pc_reg = "PC"
elif "x64" in architecture.lower():
pc_reg = "RIP"
else: # 默认为 x86
pc_reg = "EIP"
print(f"--- 准备执行代码片段 ({architecture}, PC={pc_reg}) ---")
# 获取当前 PC/RIP/EIP 的值(用于后续打印)
original_pc = idc.get_reg_value(pc_reg)
# 设置新的 PC/RIP/EIP 值
if idc.set_reg_value(start_addr, pc_reg):
print(f"✅ PC/RIP/EIP 成功设置为起始地址: 0x{start_addr:X}")
else:
print(f"[!] 警告:无法设置 PC/RIP/EIP 到 0x{start_addr:X}。请检查地址有效性。")
return
# 3. 单步执行指定的步数
print(f"🚀 开始单步执行 {num_steps} 条指令...")
for i in range(num_steps):
# 使用 Step Over (跨过函数调用)
# 如果需要进入函数,请使用 idc.step_into()
if not idc.step_over():
print(f"[!] 警告:第 {i+1} 步执行失败或遇到程序结束。")
break
current_pc = idc.get_reg_value(pc_reg)
disasm = idc.generate_disasm_line(current_pc, 0)
# 打印当前执行的指令和新的 PC 地址
print(f" [Step {i+1}/{num_steps}] -> 0x{current_pc:X}: {disasm}")
# 4. 执行完毕后的状态
final_pc = idc.get_reg_value(pc_reg)
print("----------------------------------------")
print(f"执行完毕。")
print(f"起始 PC/RIP/EIP (设置前): 0x{original_pc:X}")
print(f"当前 PC/RIP/EIP (执行后): 0x{final_pc:X}")
print(f"📢 **程序处于暂停状态,请手动恢复 (F9) 或检查状态。**")
# ----------------------------------------------------
# 执行主函数
# ----------------------------------------------------
execute_code_snippet(START_ADDRESS, STEPS_TO_EXECUTE)