mirror of
https://github.com/yincongcyincong/wechat_chatter.git
synced 2026-07-15 10:26:52 +08:00
76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
import ida_dbg
|
|
import ida_kernwin
|
|
import ida_bytes
|
|
import random
|
|
|
|
# --- 配置 ---
|
|
TARGET_FUNC_EA = 0x1006DDE48 # 目标函数的虚拟地址 (EA)
|
|
STRUCT_SIZE = 4 * 8 # 4 个 8 字节指针 = 32 字节
|
|
|
|
# 假设您已经知道这 4 个指针应该指向的目标地址
|
|
# 这里的地址应该是目标程序内存中已有的有效地址
|
|
PTR1_TARGET_VA = 0x108276190
|
|
PTR2_TARGET_VA = 0x1082f6288
|
|
PTR3_TARGET_VA = 0x0000600000614820 # 对应内存中的 P3
|
|
PTR4_TARGET_VA = 0x0000000032AAAAA7 # 对应内存中的 P4 (如果它是地址的话)
|
|
|
|
def create_and_set_pointer_arg():
|
|
"""在目标进程中创建结构体,并将其地址设置为 X0 参数"""
|
|
|
|
# 1. 在目标进程中分配内存 (例如 32 字节)
|
|
# flag 0x01表示分配内存,返回分配内存的起始地址
|
|
struct_addr = ida_dbg.alloc_dealloc_memory(STRUCT_SIZE, 0x01)
|
|
if struct_addr == ida_idaapi.BADADDR:
|
|
ida_kernwin.msg("错误:无法在目标进程中分配内存。")
|
|
return
|
|
|
|
ida_kernwin.msg(f"已在 0x{struct_addr:X} 处分配 {STRUCT_SIZE} 字节内存。")
|
|
|
|
# 2. 写入 4 个指针的值 (QWORD - 8 字节)
|
|
try:
|
|
ida_bytes.patch_qword(struct_addr + 0, PTR1_TARGET_VA)
|
|
ida_bytes.patch_qword(struct_addr + 8, PTR2_TARGET_VA)
|
|
ida_bytes.patch_qword(struct_addr + 16, PTR3_TARGET_VA)
|
|
ida_bytes.patch_qword(struct_addr + 24, PTR4_TARGET_VA)
|
|
ida_kernwin.msg("已成功写入 4 个指针到新分配的内存。")
|
|
except Exception as e:
|
|
ida_kernwin.msg(f"写入内存失败: {e}")
|
|
ida_dbg.alloc_dealloc_memory(struct_addr, 0) # 清理内存
|
|
return
|
|
|
|
# 3. 设置 X0 寄存器为这个结构体的地址
|
|
ida_dbg.set_reg("X0", struct_addr)
|
|
ida_kernwin.msg(f"已设置 X0 = 结构体指针地址: 0x{struct_addr:X}")
|
|
|
|
# 返回地址,供后续调用函数使用
|
|
return struct_addr
|
|
|
|
# --- 完整的调用函数 ---
|
|
def remote_call_with_pointer():
|
|
# ... (省略检查和上下文保存代码,与之前相同)
|
|
|
|
# 1. 创建并设置指针参数
|
|
arg_x0_ptr = create_and_set_pointer_arg()
|
|
if arg_x0_ptr is None:
|
|
return
|
|
|
|
# 2. 设置其他参数 (如果需要)
|
|
# ida_dbg.set_reg("X1", other_arg_value)
|
|
|
|
# 3. 执行函数调用 (X0 已经设置完毕)
|
|
ida_dbg.call_user_func(TARGET_FUNC_EA, [], ida_dbg.CUF_WAIT)
|
|
|
|
# 4. 获取返回值 (X0)
|
|
return_value = ida_dbg.get_reg("X0")
|
|
|
|
# 5. 恢复寄存器上下文 (与之前相同)
|
|
# ...
|
|
|
|
# 6. 清理新分配的内存
|
|
ida_dbg.alloc_dealloc_memory(arg_x0_ptr, 0) # flag 0x00表示释放内存
|
|
ida_kernwin.msg(f"已释放分配的内存: 0x{arg_x0_ptr:X}")
|
|
|
|
ida_kernwin.msg(f"返回值 (X0): {return_value} (0x{return_value:X})")
|
|
ida_dbg.run_requests()
|
|
|
|
# remote_call_with_pointer() |