仅供学习交流
讲内存修改脚本之前扩展一个rar密码遍历脚本
"""
项目名称:遍历破解rar压缩文件密码
项目描述:通过密码文件提供的密码,循环遍历输入密码,达到破解的目的
项目环境:pycharm & rarfile
作者所属:蓝花楹下
日期:2024/3/22
版本:v1.0
"""
import os
import rarfile
def rar_attack(rar_file_path, pwd_file_path):
"""
通过循环遍历密码文件密码,破解rar压缩文件密码,并解压
:param rar_file_path: rar压缩文件地址
:param pwd_file_path: 密码字典文件地址
:return: None
"""
file_handle = rarfile.RarFile(rar_file_path) # 使用rarfile 模块里的Rarfile方法实例化一个文件句柄,也可以理解成把文件赋值给一个变量
with open(pwd_file_path, "r", encoding="latin-1") as f: # 打开密码文件并命名为f
for i in f.readlines(): # 循环把每行密码赋值给i并循环里面的代码
pwd = i.strip() # 去除i两边的空格
try: # 这是个异常捕捉结构,就是去执行try里面的代码,如果不报错就执行完,如果报错就执行except里面的代码块
file_handle.extractall(pwd=pwd) # 输入密码尝试解压
print('Password found:', pwd)
break # 如果不报错结束循环
except:
pass
else:
print('Password not found') # 输入整个字典密码依然没有破解
file_handle.close()
if __name__ == '__main__':
rar_file_path = r"C:\baidunetdiskdownload\tm2\tm2\tmqy2.part1.rar"
password_file_path = r"C:\Users\dusk\Desktop\tools\rockyou.txt"
if os.path.exists(password_file_path) and os.path.exists(rar_file_path): # 如果两个路径都存在
rar_attack(rar_file_path, password_file_path)
else:
print('RAR file or password file not found') # 两个文件有一个不存在
正题:内存数据修改
下载一个单机游戏(少部分网游也可以)
我下载的游戏是天命奇御(一款武侠游戏)
这时可以看到我们的金钱是110
游戏下载好后,还要借助一个工具叫做cheat engine 利用这个工具来找到数据的内存地址
第一步启动游戏
第二步打开查看数据内存地址工具
第三步:
查看我们需要修改的数据的值,假如是160
然后输入160并查找
此时左边会有很多160的数据
我们需要在游戏中改变这个数据,比如买一把武器,然后看这个数据最新的值,比如我买了一个药品,还剩110,那么我在搜110,点击右边按钮搜索
此时就得到了这个数据的内存地址
接下来就可以使用python脚本进行外挂的编写了
import ctypes
import win32api
import win32con # 跟控制权限有关的模块
# 这个模块里面有很多api函数
import win32gui # 操作窗口的一个模块
import win32process # 操作windows进程的一个模块
def modify_memory(handle_name, memory_path, num):
"""
修改游戏的内存数据
:return: None
"""
handle = win32gui.FindWindow(0, handle_name) # 把这个游戏窗口赋值给handle
pid = win32process.GetWindowThreadProcessId(handle) # 通过这个操作进程的方法,传入窗口找到这个窗口所属的程序 pid 就是程序的编号
pid = pid[1] # pid有两个pid 第二个才是程序实际的pid
process_handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid) #打开程序(设置权限为全部打开,不影响其他数据,对象是pid)
k32 = ctypes.windll.LoadLibrary(r"C:\Windows\System32\kernel32.dll") # 通过c语言打开一个动态库kernel32.dll 并赋值给k32 这个动态库是修改内存数据的
k32.WriteProcessMemory(int(process_handle), memory_path, ctypes.byref(ctypes.c_long(num)), 4) # 给当前程序写入数据(1,操作对象, 地址,数据,数据类型)
if __name__ == '__main__':
modify_memory("FateSeeker", 0x2D2656D8, 10000)
结果如下
成功修改金额