from ctypes import * # 数据类型封装 操作windows的数据类型 获取和windows兼容的数据类型
import win32process # 进程模块 用来操作windows中的进程 用来操作进程
import win32api # 调用动态链接库函数的功能模块 dll lib windows中存储函数的 外挂必备
import win32gui # 操作windows界面 获取指定窗口+
# 在windows编程中需要指定权限打开对应的进程
# 最高权限附加进程 管理员权限打开进程
PROCESS_ALL_ACCESS=0X1F0FFF
# Kernel32.dll 北斗内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理
# 加载kernel32
kernel32 = windll.LoadLibrary("C:\\Windows\\System32\\kernel32.dll")
# 准备工作完成
# 寻找到指定窗口 win32gui 找窗口 (窗口类名,窗口名称)
window_handle = win32gui.FindWindow(None,"Diablo II")
print("进程ID为 %x"%window_handle)
# 获取线程 句柄id 和 进程ID 返回值是两个,我们需要第二个 pid
hid,pid = win32process.GetWindowThreadProcessId(window_handle)
print("pid"+str(pid))
# phand 打开一个进程(参数意思是使用最高权限非安全打这个进程)
phand = win32api.OpenProcess(PROCESS_ALL_ACCESS,False,pid)
print(phand)
# 拿到id就相当于拿到身份证了
# 阳光值内存修改
sun = int(input("请输入要金币值:"))
print("修改成功")
# 写入内存数据
# 北斗内核级文件写入对应的阳光值
# 四个参数 1:写入哪个进程 2:写入地址 3:写入内容 byref传递这个值的内存地址 4:写入大小int为4字节 5:实际写入大小
# 不断的写入当前内存地址,保证数据不会再变动
while True:
kernel32.WriteProcessMemory(int(phand),0x03128064,
byref(c_int(sun)),4,bytes(c_int(0)))