mirror of
https://github.com/yincongcyincong/wechat_chatter.git
synced 2026-07-15 10:26:52 +08:00
74 lines
2.7 KiB
Python
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) |