|
Как делать антиотдачу для трейнеров - Разработка ПО для Point Blank - Бюро разработчиков Zhyk.Ru: создание чит-программ и прочего ПО для Point Blank |
15.06.2012, 03:16
|
#1
|
|
|
|
Старший сержант
|
Регистрация: 18.02.2011
Сообщений: 232
Популярность: 8824
Сказал(а) спасибо: 43
Поблагодарили 801 раз(а) в 240 сообщениях
|
Как делать антиотдачу для трейнеров
Внимание опасность C++: Да я знаю что вы пишете трейнеры на основе ванильной библиотечки и на C#! А поскольку я не пишу на C# вам придется переписать то что я тут выдал, если вам это конечно надо будет! Основной смысл этой темы показать вам как можно сделать антиотдачу без хука, а не тупо дать вам копипастить в свой исход, поэтому не вижу смысла распинаться на C#. К тому же я решил написать пример даже не используя функцию WriteProcessMemory прямое назначение которой как раз писать в память другого процесса, но не вижу в этом смысла, так как 99% та самая библиотека, которой все пользуются использует эту функцию... Поэтому в примере показана функция которая редактирует только свой процесс (можно скопипастить спокойно в свою выхашечку, но не в трейнер).
Вот вам пара примеров как делать антиотдачу без хука:
прежде всего объявим переменную с основным адресом
Код:
//для 1 и 2 способа
DWORD NoRecoil = 0x62F874;
#define offset_NoRecoil2 0x100
//еще для 1 способа
DWORD WeaponCrash_1 = 0xA51E98;
DWORD WeaponCrash_2 = 0xA51E94;
float RecoilValue = 0;//можно выбрать другое значение
//только для 3 способа
DWORD f_NoRecoil_1 = 0x5D08D0;
DWORD f_NoRecoil_2 = f_NoRecoil_1 + 0x124;
1 способ
+ регулировка отдачи
+ в примере регулируется сразу верт и гор отдача, но можно и по отдельности
Принцип работы: в функции отдачи (если кто не заметил когда копировал код) есть некое значение на которое умножается текущая отдача если оружия поломано. мы используем это значение в качестве итоговой отдачи, таким образом можно поставить отдачу хоть 5000
Код:
MEMwrite((void*)WeaponCrash_1, (void*)&RecoilValue, 4);//вы не знали что эту функцию можно использовать так? /problem
MEMwrite((void*)WeaponCrash_2, (void*)&RecoilValue, 4);
MEMwrite((void*)(NoRecoil - 0x29), (void*)"\xEB\x1B", 2);
MEMwrite((void*)(NoRecoil - 0x6), (void*)"\x90\x90\x90", 3);
MEMwrite((void*)(NoRecoil - 0x29 + offset_NoRecoil2), (void*)"\xEB\x1B", 2);
MEMwrite((void*)(NoRecoil - 0x6 + offset_NoRecoil2), (void*)"\x90\x90\x90", 3);
2 способ
- рисковый, в случае если попался мусор в стеке результат может быть не очень...
- не регулируется отдача
+ простой
Принцип работы: перескакиваем часть кода в котором функция заносит полученное значение в стек и надеемся что там был 0
Код:
MEMwrite((void*)(NoRecoil - 0x29), (void*)"\xEB\x2A", 2);
MEMwrite((void*)(NoRecoil - 0x29 + offset_NoRecoil2), (void*)"\xEB\x2A", 2);
3 способ
+ эмм ну как бы увеличиваем производительность игры избавляя ее от не нужных вычислений
- новые адреса
- уже так просто не вернуть обратно, лучший способ это хранить в какой либо переменной значение которое было
Принцип работы: функция вычисления отдачи не работает
Код:
MEMwrite((void*)f_NoRecoil_1, (void*)"\xD9\xEE\x90\x90\x90", 5);
MEMwrite((void*)f_NoRecoil_2, (void*)"\xD9\xEE\x90\x90\x90", 5);
з.ы. smile33 ты заставил меня это сделать
з.з.ы. не забывайте хоть автора, он тратил на это свое время
|
|
|
9 пользователя(ей) сказали cпасибо:
|
|
18.06.2012, 21:52
|
#2
|
|
|
|
Командор
|
Регистрация: 08.05.2011
Сообщений: 752
Популярность: 18860
Золото Zhyk.Ru: 8
Сказал(а) спасибо: 383
Поблагодарили 1,069 раз(а) в 448 сообщениях
|
Re: Как делать антиотдачу для трейнеров
|
Цитата: |
|
|
|
|
|
|
|
|
|
на основе ванильной библиотечки
|
|
|
|
|
|
вапщета это не основа Ее используют потому, что так легче т.е в ней содержится все что нужно. Т.е ее тупо добавил в проект и все
вот код c#
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace RECOIL
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, uint lpNumberOfBytesRead);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll")]
private static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
[DllImport("kernel32.dll")]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, uint lpNumberOfBytesWritten);
private Process[] PROC;
private IntPtr PROCHANDLE;
public Form1()
{
InitializeComponent();
}
private void OPENPROC(string PROCNAME)
{
if (PROCNAME != null)
{
PROC = Process.GetProcessesByName(PROCNAME);
if (PROC.Length == 0) MessageBox.Show("Процесс : " + PROCNAME + "не найден!",
"Процесс не найден!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
else PROCHANDLE = OpenProcess(0x1F0FFF, false, PROC[0].Id);
}
else MessageBox.Show("Ошибка! Не указано имя процесса! Укажите его!");
}
private bool WriteByteArray(string PROCNAME,int ADDRES, byte[] BYTES)
{
if (PROCHANDLE == IntPtr.Zero) OPENPROC(PROCNAME);
try
{
uint num;
VirtualProtectEx(PROCHANDLE, (IntPtr)ADDRES, (UIntPtr)BYTES.Length, 4, out num);
bool F = WriteProcessMemory(PROCHANDLE, (IntPtr)ADDRES, BYTES, (uint)BYTES.Length, 0);
VirtualProtectEx(PROCHANDLE, (IntPtr)ADDRES, (UIntPtr)BYTES.Length, num, out num);
return F;
}
catch (Exception ex) { MessageBox.Show("Ошибка : WriteByteArray()" + ex.ToString()); return false; }
}
int NoRecoil = 0x62F874;
int offset_NoRecoil2 = 0x100;
int WeaponCrash_1 = 0xA51E98;
int WeaponCrash_2 = 0xA51E94;
float RecoilValue = 0;
private void button1_Click(object sender, EventArgs e)
{
string P = "PointBlank.exe";
WriteByteArray(P, WeaponCrash_1, BitConverter.GetBytes(RecoilValue));
WriteByteArray(P, WeaponCrash_2, BitConverter.GetBytes(RecoilValue));
WriteByteArray(P, NoRecoil - 0x29, new byte[] { 0xEB, 0x1B });
WriteByteArray(P, NoRecoil - 0x6, new byte[] { 0x90, 0x90, 0x90 });//nop'
WriteByteArray(P, NoRecoil - 0x29 + offset_NoRecoil2, new byte[] { 0xEB, 0x1B });
WriteByteArray(P, NoRecoil - 0x6 + offset_NoRecoil2, new byte[] { 0x90, 0x90, 0x90 });//nop'
}
}
}
целый проект находится во вложении
________________
|
|
|
Пользователь сказал cпасибо:
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 00:04.
|
|