Если вы хотели попробовать написать чит на банихоп для кс2, но в гайдах всегда видели только сложные классы хуки и тд, то вот вам версия на питоне которую поймет даже человек начавший учить пайтон 2 дня назад. Для самого чита нам понадобится дампер для получения офсетов, который можно взять на гитхаб
Теперь когда все получено можно переходить к програмированию для питона мы возьмем 3 библиотеки они самые простые и осваиваются за пол часа первая из них pymem вторая keyboard и третья time.
import pymem
import time
import keyboard
дальше когда все импортировали нам нужно подключиться к самой кс2 в pymem это делается одной командой
pm = pymem.Pymem("cs2.exe") - в pm у нас сохраниться процесс
теперь самое главное понять, то что игра при запуске кладется в оперативную память вашего пк в рандомное место поэтому просто читать офсеты мы не можем ведь офсет это расстояние от чего то, сначало надо получить адресс в памяти куда загрузилась сама игра и потом уже скакать от этого места применим все тот же pymem
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll - поскольку pm это уже наша игра нам нужно взять от нее handle - если совсем просто то это сам процесс и вторым аргументом идет что от него взять, поскольку все действия с игроком в кс2 находятся в client.dll ее мы и берем но будьте внимательны сама команда pymem.process.module_from_name возращает массив от полученной длл ее имя айди и тд поэтому через точку мы указываем .lpBaseOfDll что нам нужен только адресс длл в памяти.
теперь когда мы получили процесс игры и точку отсчета для всех оффсетов давайте возьмем из дампера все нужные нам оффсеты для этого зайдите в дампер - output - client_dll.hpp и возьмите оттуда офсет m_fFlags (это оффсет который указывает на переменную в кс2 отвечающую за проверку стоит игрок на земле или нет) дальше в дампер - output - offsets.hpp и возьмите dwLocalPlayerPawn (это оффсет указывающий на нашего локального игрока) и последний офсет который нам нужен дампер - output - buttons.hpp возьмите оттуда jump (офсет который отвечает за то нажали вы пробел или нет) вот так это выглядит в коде
jump = 0x204DE30;
dwLocalPlayerPawn = 0x20546A0;
m_fFlags = 0x3F8;
Поздравляю теперь у нас есть все чтобы написать баннихоп для кс2 и это мы щас и сделаем
while(True):
localplayer = pm.read_longlong(client + dwLocalPlayerPawn)
OnGround = pm.read_int(localplayer + m_fFlags)
if(OnGround & 1):
if keyboard.is_pressed("space"):
pm.write_int(client + jump, 65537)
time.sleep(0.5)
pm.write_int(client + jump, 16777472)
теперь объясню вкратце что тут происходит запускается цикл мы ищем для начала нас локального игрока поскольку локальный игрок это не просто переменная с числом мы берем тип даннных 8 бит longlong дальше нужно прочитать переменную отвечающую за то на земле мы или нет OnGround в самом сравнении идет & это битовая маска если кто то не знает что это такое напишите я объясню, дальше проверяем нажат ли пробел и если да то записываем в переменную прыжка число 65537 почему именно такое потому что это сигнал прыжка для кс2 а 16777472 сигнал что кнопка больше не нажата дальше объясню важный нюанс почему между ними стоит sleep сам движок кс2 обрабатывает команды так: нажатие поступило 65537 выполнить и если вы не поставите следом же команду отжатия 16777472 то бхоп будет прыгать очень плохо и с задержкой тк перед командой отжатия ему надо будет обработать 1000 команд нажатия и появиться очередь из команд поэтому лучший вариант для движка нажал выполнил отжал выполнил и задержка 0.5 секунд чтоб движок хотябы успевал понимать что происходит и все идеальный бхоп готов, но учтите это все еще не хук и прям идеальным он не будет тк вы просто спамите в память игры а не меняете саму логику прыжка если надо могу рассказать также как сделать хук для банихопа и напоследок вот код целиком:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import pymem
import time
import keyboard
pm = pymem.Pymem("cs2.exe")
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll
jump = 0x204DE30;
dwLocalPlayerPawn = 0x20546A0;
m_fFlags = 0x3F8;
while(True):
localplayer = pm.read_longlong(client + dwLocalPlayerPawn)
OnGround = pm.read_int(localplayer + m_fFlags)
if(OnGround & 1):
if keyboard.is_pressed("space"):
pm.write_int(client + jump, 65537)
time.sleep(0.5)
pm.write_int(client + jump, 16777472)
(офсеты могли устареть перепроверяйте дампером!!!!)
Пожалуйста, авторизуйтесь для просмотра ссылки.
нажимаете release и скачиваете exe файл ( примечание перед использованием положите его в любую папку не оставляйте на рабочем столе) дальше запускаете кс2 и следом когда запустили включаете дампер и получаете все возможные офсеты.Теперь когда все получено можно переходить к програмированию для питона мы возьмем 3 библиотеки они самые простые и осваиваются за пол часа первая из них pymem вторая keyboard и третья time.
import pymem
import time
import keyboard
дальше когда все импортировали нам нужно подключиться к самой кс2 в pymem это делается одной командой
pm = pymem.Pymem("cs2.exe") - в pm у нас сохраниться процесс
теперь самое главное понять, то что игра при запуске кладется в оперативную память вашего пк в рандомное место поэтому просто читать офсеты мы не можем ведь офсет это расстояние от чего то, сначало надо получить адресс в памяти куда загрузилась сама игра и потом уже скакать от этого места применим все тот же pymem
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll - поскольку pm это уже наша игра нам нужно взять от нее handle - если совсем просто то это сам процесс и вторым аргументом идет что от него взять, поскольку все действия с игроком в кс2 находятся в client.dll ее мы и берем но будьте внимательны сама команда pymem.process.module_from_name возращает массив от полученной длл ее имя айди и тд поэтому через точку мы указываем .lpBaseOfDll что нам нужен только адресс длл в памяти.
теперь когда мы получили процесс игры и точку отсчета для всех оффсетов давайте возьмем из дампера все нужные нам оффсеты для этого зайдите в дампер - output - client_dll.hpp и возьмите оттуда офсет m_fFlags (это оффсет который указывает на переменную в кс2 отвечающую за проверку стоит игрок на земле или нет) дальше в дампер - output - offsets.hpp и возьмите dwLocalPlayerPawn (это оффсет указывающий на нашего локального игрока) и последний офсет который нам нужен дампер - output - buttons.hpp возьмите оттуда jump (офсет который отвечает за то нажали вы пробел или нет) вот так это выглядит в коде
jump = 0x204DE30;
dwLocalPlayerPawn = 0x20546A0;
m_fFlags = 0x3F8;
Поздравляю теперь у нас есть все чтобы написать баннихоп для кс2 и это мы щас и сделаем
while(True):
localplayer = pm.read_longlong(client + dwLocalPlayerPawn)
OnGround = pm.read_int(localplayer + m_fFlags)
if(OnGround & 1):
if keyboard.is_pressed("space"):
pm.write_int(client + jump, 65537)
time.sleep(0.5)
pm.write_int(client + jump, 16777472)
теперь объясню вкратце что тут происходит запускается цикл мы ищем для начала нас локального игрока поскольку локальный игрок это не просто переменная с числом мы берем тип даннных 8 бит longlong дальше нужно прочитать переменную отвечающую за то на земле мы или нет OnGround в самом сравнении идет & это битовая маска если кто то не знает что это такое напишите я объясню, дальше проверяем нажат ли пробел и если да то записываем в переменную прыжка число 65537 почему именно такое потому что это сигнал прыжка для кс2 а 16777472 сигнал что кнопка больше не нажата дальше объясню важный нюанс почему между ними стоит sleep сам движок кс2 обрабатывает команды так: нажатие поступило 65537 выполнить и если вы не поставите следом же команду отжатия 16777472 то бхоп будет прыгать очень плохо и с задержкой тк перед командой отжатия ему надо будет обработать 1000 команд нажатия и появиться очередь из команд поэтому лучший вариант для движка нажал выполнил отжал выполнил и задержка 0.5 секунд чтоб движок хотябы успевал понимать что происходит и все идеальный бхоп готов, но учтите это все еще не хук и прям идеальным он не будет тк вы просто спамите в память игры а не меняете саму логику прыжка если надо могу рассказать также как сделать хук для банихопа и напоследок вот код целиком:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import pymem
import time
import keyboard
pm = pymem.Pymem("cs2.exe")
client = pymem.process.module_from_name(pm.process_handle, "client.dll").lpBaseOfDll
jump = 0x204DE30;
dwLocalPlayerPawn = 0x20546A0;
m_fFlags = 0x3F8;
while(True):
localplayer = pm.read_longlong(client + dwLocalPlayerPawn)
OnGround = pm.read_int(localplayer + m_fFlags)
if(OnGround & 1):
if keyboard.is_pressed("space"):
pm.write_int(client + jump, 65537)
time.sleep(0.5)
pm.write_int(client + jump, 16777472)
(офсеты могли устареть перепроверяйте дампером!!!!)
Последнее редактирование: