Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 08.04.2025
Сообщений: 1

Поиск адреса памяти по его значению

08.04.2025, 20:48. Показов 1659. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я делаю так называемый "чит на деньги" на python. И мне нужно найди адрес в памяти процесса по его значению (по количеству денег игрока). То есть, пользователь вводит в программу текущее количество денег, и программа перебирает все адреса в памяти процесса, и ищет адрес со значением равным значению количества денег игрока, и меняет его например на 99999. Я использую pymem, и я знаю что это все лучше делать на других языках программирования, и что я занимаюсь ерундой, но просто помогите мне и например вышлите код как это сделать.

код который у меня есть:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from tkinter import *
import psutil
from tkinter.ttk import Combobox
 
processes = psutil.process_iter()
process_names = []
 
for process in processes:
    try:
        process_names.append(process.name())
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        pass
 
window = Tk()
window.title("Money Cheat")
window.iconbitmap("app_icon.ico")
window.geometry("300x200")
window.resizable(width=False,height=False)
 
frame = Frame(window, bg="lightgray")
frame.place(relx=0,rely=0 ,relwidth=1,relheight=1)
 
label_1 = Label(frame, text="Выберите процесс:", font= 30)
label_1.place(x=0,y=0,width=150, height=50)
 
label_2 = Label(frame, text="Введите текущее\nколичество денег:", font=30)
label_2.place(x=0,y=50, width=150, height=50)
 
label_3 = Label(frame, text="Введите желаемое\nколичество денег:", font=30)
label_3.place(x=0,y=100, width=150, height=50)
 
current_money = Entry(font=50)
current_money.place(x=150,y=50,width=150,height=50)
 
desired_money = Entry(font=50)
desired_money.place(x=150,y=100,width=150,height=50)
 
select_process = Combobox(values=process_names)
select_process.place(x=150,y=0,width=150,height=50)
 
def start_button_click():
    print(1)
 
start_button = Button(frame, text="Выдать деньги", font=40, command=start_button_click)
start_button.place(x=0,y=150,width=300,height=50)
 
mainloop()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2025, 20:48
Ответы с готовыми решениями:

Поиск адреса по значению в памяти процесса
Возможно ли найти адрес по значению? Как аналог Cheat Engine Пробовал перебирать, но их слишком...

Даны части IPv4 адреса и нужно собрать из них все возможные адреса
Здравствуйте, мне нужно написать такой алгоритм. Даны часты IPv4 адреса и нужно собрать из них все...

Чтение памяти из exe, получить значение по адресу
Собственно есть вот такой кусок кода, тут я получаю значение из памяти процесса exe from...

1
6 / 4 / 3
Регистрация: 24.09.2013
Сообщений: 63
09.04.2025, 00:34
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from tkinter import *
import psutil
from tkinter.ttk import Combobox
import pymem
import pymem.process
from tkinter import messagebox
 
processes = psutil.process_iter()
process_names = []
 
for process in processes:
    try:
        process_names.append(process.name())
    except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
        pass
 
window = Tk()
window.title("Money Cheat")
window.iconbitmap("app_icon.ico")
window.geometry("300x200")
window.resizable(width=False, height=False)
 
frame = Frame(window, bg="lightgray")
frame.place(relx=0, rely=0, relwidth=1, relheight=1)
 
label_1 = Label(frame, text="Выберите процесс:", font=30)
label_1.place(x=0, y=0, width=150, height=50)
 
label_2 = Label(frame, text="Введите текущее\nколичество денег:", font=30)
label_2.place(x=0, y=50, width=150, height=50)
 
label_3 = Label(frame, text="Введите желаемое\nколичество денег:", font=30)
label_3.place(x=0, y=100, width=150, height=50)
 
current_money = Entry(font=50)
current_money.place(x=150, y=50, width=150, height=50)
 
desired_money = Entry(font=50)
desired_money.place(x=150, y=100, width=150, height=50)
 
select_process = Combobox(values=sorted(list(set(process_names)))) # Добавил сортировку и убрал дубликаты
select_process.place(x=150, y=0, width=150, height=50)
 
def start_button_click():
    process_name = select_process.get()
    # current_money_str = current_money.get() # Текущее значение нужно для поиска, который тут не реализован
    desired_money_str = desired_money.get()
 
    if not process_name:
        messagebox.showerror("Ошибка", "Пожалуйста, выберите процесс.")
        return
    try:
        # current_money_val = int(current_money_str) # Нужно будет для реального поиска
        desired_money_val = int(desired_money_str)
    except ValueError:
        messagebox.showerror("Ошибка", "Количество денег должно быть целым числом.")
        return
 
    try:
        pm = pymem.Pymem(process_name)
 
        # Тебе нужно будет найти реальный адрес (он будет вида 0xABCDEF12) и подставить его вместо условного ADDRESS_TO_WRITE. Также важно знать тип данных (int, float и т.д.). Для денег часто int. Найди реальный адрес и замени это значение:
        ADDRESS_TO_WRITE = 0xDEADBEEF  # !!! ЗАМЕНИ НА НАСТОЯЩИЙ АДРЕС !!!
 
        if ADDRESS_TO_WRITE == 0xDEADBEEF:
             messagebox.showwarning("Внимание", "Адрес для записи не указан!\n\n"
                                              "В коде (в функции start_button_click) найди строку:\n"
                                              "ADDRESS_TO_WRITE = 0xDEADBEEF\n"
                                              "и замени 0xDEADBEEF на реальный адрес памяти, который ты нашел (например, с помощью Cheat Engine). Без этого запись невозможна.")
             return
 
        # Запись нового значения по найденному адресу
        # Убедись, что тип write_ соответствует типу данных в игре (int, float, longlong, etc.)
        pm.write_int(ADDRESS_TO_WRITE, desired_money_val)
 
        messagebox.showinfo("Успех!", f"Попытка записи {desired_money_val} по адресу {hex(ADDRESS_TO_WRITE)} в процесс {process_name} выполнена.")
 
    except pymem.exception.ProcessNotFound:
        messagebox.showerror("Ошибка", f"Процесс '{process_name}' не найден.\nУбедись, что игра запущена и выбрано правильное имя процесса (.exe).")
    except pymem.exception.CouldNotOpenProcess:
         messagebox.showerror("Ошибка", f"Не удалось получить доступ к процессу '{process_name}'.\nПопробуй запустить скрипт от имени администратора.")
    except Exception as e:
        messagebox.showerror("Неизвестная ошибка", f"Произошла ошибка при работе с памятью:\n{e}")
 
start_button = Button(frame, text="Выдать деньги", font=40, command=start_button_click)
start_button.place(x=0, y=150, width=300, height=50)
 
mainloop()
Задача не самая простая, особенно если делать это "в лоб", перебирая всю память. Процессы могут иметь гигабайты виртуальной памяти, и прямой перебор будет дико медленным и неэффективным.

Обычно это делают как в старые добрые, когда мы "ломали" игры в ArtMoney или CheatEngine: находят первый раз все адреса с текущим значением денег, тратят/получают деньги в игре, сканируют еще раз, но ищут новое значение только среди адресов, найденных на шаге 1, повторяют шаги, пока не останется один или несколько адресов. Вот их и меняют.
pymem сам по себе не предоставляет готовой функции "найди мне все адреса со значением X". Он дает инструменты для чтения и записи памяти по известному адресу или для работы с регионами памяти, но логику поиска нужно писать самому.

Выше я привел модифицированный код для вашей функции start_button_click. Он показывает, как подключиться к процессу и записать значение по уже найденному адресу, но сам поиск адреса по значению там не реализован. Вместо реального сканирования памяти (которое очень сложно реализовать эффективно), там поставлена "заглушка" ADDRESS_TO_WRITE. Вам нужно будет самостоятельно найти реальный адрес (например, с помощью того же Cheat Engine) и вписать его туда вместо условного 0xDEADBEEF.

pm.write_int(ADDRESS_TO_WRITE, desired_money_val) – вот эта строка и записывает новое значение (целое число int) по указанному адресу. Если же в вашей игре деньги хранятся как float или какой-то еще другой тип, то, соответственно, тоже правьте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2025, 00:34
Помогаю со студенческими работами здесь

sqlite3 и киррилица (адрес в память вместо текста)
У меня почему то вместо нормального текста sqlite3 возвращает адрес в память... Мой код: def...

Поиск hex значения в файле и получение его смещения
Всем доброго времени суток. Есть последовательность в виде b'\x69\x13\x0f' надо найти её в файле...

Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в отдельной строке
Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в...

Чтение URL адресса из окна виджета и открытие его браузером при нажатии кнопки виджета
#Как считать url со строки ввода в виджете что бы потом при нажатии кнопки виджета открыть этот...

Ввести адрес файла и «разобрать» его на части
Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru