Перейти к содержанию

Помогите с трейнером на C++ или C#


Рекомендуемые сообщения

Как мне сделать на c++ трейнер вот допустим есть сигнатура 00 00 40 41 И нужно чтоб она изменилась на 00 00 90 90 т.е 2 nop'a как в чит энжине... Как бы мне это реализовать В С++ ?

Вот например на кнопку активировать он ищет эту сигнатуру, а на кнопку включить меняет её на мою. Ну и на выкл аналогично возвращает старую... Помогите пожалуйста весь интернет перелазил :9 почти 4 месяца убил на поиск этой информации. Буду очень благодарен. Или кто не знает допустим как на C++ расскажите как такую шнягу на С# заделать.....

Вот пример кода на lua ...


stringListAddresses = AOBScan("Сигнатура для поиска","*X*W-C") // поиск сигнатуры
if (stringListAddresses~=nil) then
lenghtLines = stringlist_getCount(stringListAddresses)
for i = 0, lenghtLines-1 do
address = stringlist_getString(stringListAddresses, i)
writeBytes(address ,Первый байт сигнатуры);
end
end


if lenghtLines ~= nil then // замена
for i = 0, lenghtLines-1 do
address = stringlist_getString(stringListAddresses, i)
writeBytes(address ,сигнатура для замены);
end
end

Ссылка на комментарий
Поделиться на другие сайты

Код поиска сигнатур приводился на нашем форуме неоднократно, как для С++, так и для C#. Далее, код записи в память тоже приводился. Воспользуйся поиском по форуму.

Ссылка на комментарий
Поделиться на другие сайты

посмотри видео уроки кодера у нас на форуме, там все подробно описано как делать, то что тебе надо на сколько я помню в теме пишем трейнер на с++ или же трейнер гибрид на с++

Ссылка на комментарий
Поделиться на другие сайты

Ну вот накопал я кое что...


using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Hack
{
class Func
{
//ReadProcessMemory
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out int lpNumberOfBytesRead
);
//OpenProcess // Flag = All = 0x001F0FFF
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
// CloseHandle
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_BASIC_INFORMATION
{
public IntPtr BaseAddress;
public IntPtr AllocationBase;
public uint AllocationProtect;
public IntPtr RegionSize;
public uint State;
public uint Protect;
public uint Type;
}
// VirtualQueryEx
[DllImport("kernel32.dll")]
static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);
//WriteProcessMemory
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, uint nSize, UIntPtr lpNumberOfBytesWritten);
private int GetProcessID()
{
foreach (Process proc in Process.GetProcessesByName("opera"))
return proc.Id;
return -1;
}
public void WriteBytes()
{
var handle = OpenProcess(0x001F0FFF, false, GetProcessID());
byte[] buffer = { 0xC7, 0x41, 0x14, 0x00, 0x00, 0x01, 0x00, 0xC7, 0x41, 0x18, 0x90 };
var dammy = new UIntPtr();
var address = FindSignature();
if (address != -1)
WriteProcessMemory(handle, (IntPtr)address, buffer, (uint)buffer.Length, out dammy);
CloseHandle(handle);
}
private int FindSignature()
{
int[] signature = { 0xC7, 0x41, 0x14, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x41, 0x18, 0x00 };
long MaxAddress = 0x7fffffff;
long address = 0;
MEMORY_BASIC_INFORMATION m;
var handle = OpenProcess(0x001F0FFF, false, GetProcessID());
m.BaseAddress = IntPtr.Zero;
m.RegionSize = IntPtr.Zero;
byte[] buffer;
while (address <= MaxAddress)
{
VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
buffer = new byte[(uint)m.RegionSize];
int dammy = 0;
ReadProcessMemory(handle, m.BaseAddress, buffer, (int)m.RegionSize, out dammy);
if (address == (long)m.BaseAddress + (long)m.RegionSize)
break;
int count = 0;
address = (long)m.BaseAddress + (long)m.RegionSize;
if (buffer.Length > signature.Length)
{
for (int i = 0; i < buffer.Length; i++)
{
if (buffer[i] == signature[0])
{
for (int q = 0; q < signature.Length; q++)
{
if (buffer[i + q] == signature[q] || signature[q] == -1)
{
count++;
if (count == signature.Length)
{
CloseHandle(handle);
return i + (int)m.BaseAddress;
}
}
else
{
count = 0;
}
}
}
}
}
}
CloseHandle(handle);
return -1;
}
}
}

Но...

if (buffer[i + q] == signature[q] || signature[q] == -1) // как только жму запуск доходит до сюда и такая шня...

eb1c6e928652f53de53b1ee8da0bcd73.jpg

и после...

762f537bd9069250dc4ed21ed602d025.jpg

Что делать :/ o_0O-=

P.S на клавишу Активировать OnClick кинул такой код...


private void button1_Click(object sender, EventArgs e)
{
Func func = new Func();
func.WriteBytes();
}

Ссылка на комментарий
Поделиться на другие сайты

выход за пределы выделенной памяти, попробуй прочитать больший регион памяти, в твоем коде трудно чуток разбираться)

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

function AOBScan(L: PLua_state): integer; cdecl;

var

parameters: integer;

i,b: integer;

scanstring: string;

protectionflags: string;

alignmentparam: string;

alignmenttype: TFastScanMethod;

list: tstringlist;

begin

result:=0;

parameters:=lua_gettop(L);

if parameters=0 then exit;

protectionflags:='';

alignmenttype:=fsmNotAligned;

alignmentparam:='1';

if (parameters>=1) and (lua_isstring(L,-parameters)) then

begin

//it's a scanstring, optional call

scanstring:=Lua_ToString(L, -parameters);

if parameters>=2 then

protectionflags:=Lua_ToString(L, -parameters+1);

if parameters>=3 then

alignmenttype:=TFastScanMethod(lua_tointeger(L, -parameters+2));

if parameters>=4 then

alignmentparam:=Lua_ToString(L, -parameters+3);

end

else

begin

//buildup the scanstring

scanstring:='';

for i:=-parameters to -1 do

begin

b:=lua_tointeger(L,i);

if (b>255) then scanstring:=scanstring+'* '

else

if b=0 then

begin

if not lua_isnumber(L,i) then

scanstring:=scanstring+'* '

else

scanstring:=scanstring+'00 '

end

else scanstring:=scanstring+inttohex(b,2)+' ';

end;

end;

lua_pop(L, lua_gettop(L));

list:=tstringlist.create;

if getaoblist(scanstring, list, protectionflags, alignmenttype, alignmentparam) then

begin

result:=1;

lua_pushlightuserdata(L, list);

end

else

begin

list.free;

end;

end;

Ссылка на комментарий
Поделиться на другие сайты

Привет всем! У меня возник вопрос, как вывести значения ассемблера из заинжектенного кода в адресном пространстве...

Например:

void _declspec(naked) Cheat()

{

DWORD value;

_asm

{

push edx

mov edx[esi+23]

mov value,edx

pop edx

retn

}

}

Как вывести значение "value" на экран путем MessageBox?

Ссылка на комментарий
Поделиться на другие сайты

можно value сделать глобальной переменной и вывести её значение MessageBox'ом


char buff[4];
wsprintf(buff, "value = 0x%X", value);
MessageBox(NULL, buff, "", MB_OK);

по идее еще можно вызвать из ассемблерского кода еще, но тут уже гугл в помощь

Ссылка на комментарий
Поделиться на другие сайты

можно value сделать глобальной переменной и вывести её значение MessageBox'ом


char buff[4];
wsprintf(buff, "value = 0x%X", value);
MessageBox(NULL, buff, "", MB_OK);

по идее еще можно вызвать из ассемблерского кода еще, но тут уже гугл в помощь

Я так тоже пробовал. Если DWORD value; сделать глобальной, то метка value исчезает совсем, вместо него появляется call в никуда...

Жалко что никто не знает решение. Остается только написать функцию с запросом и возвратом значения...

Ссылка на комментарий
Поделиться на другие сайты

В ассемблерной вставке убираешь retn (это возврат из функции), после ассемблерной вставки форматируешь число, как тут писали выше, и вызываешь месседжбокс. Вот и вся проблема.

Ссылка на комментарий
Поделиться на другие сайты

Я так тоже пробовал. Если DWORD value; сделать глобальной, то метка value исчезает совсем, вместо него появляется call в никуда...

Жалко что никто не знает решение. Остается только написать функцию с запросом и возвратом значения...

наверно потому, что надо делать так:


mov [value], edx

тогда все прокатит

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Писал под x64 платформу.

Подскажи пожалуйста как правильно и грамотно выделять память в процессе игры x64 бит. Я пытался выделить память с помощью VirtualAllocEx, но возвращяется адрес в виде DWORD т.е. 0x6160000, а должно возвращаться в виде DWORD64 (DWORD_PTR) т.е. 0x106160000. Из за этого прыжок получается неизвестно куда O-= Или в 64 существует иной способ для выделения памяти? В проекте у меня выбрана платформа x64. Система: Win7x64.

Ссылка на комментарий
Поделиться на другие сайты

Подскажи пожалуйста как правильно и грамотно выделять память в процессе игры x64 бит. Я пытался выделить память с помощью VirtualAllocEx, но возвращяется адрес в виде DWORD т.е. 0x6160000, а должно возвращаться в виде DWORD64 (DWORD_PTR) т.е. 0x106160000. Из за этого прыжок получается неизвестно куда O-= Или в 64 существует иной способ для выделения памяти? В проекте у меня выбрана платформа x64. Система: Win7x64.

Данная функция возвращает void*, обычно это 4 байта. И нет ничего необычного в том, что тебе вернули 32х битный адрес, ты можешь спокойно по нему записывать.

Ссылка на комментарий
Поделиться на другие сайты

Данная функция возвращает void*, обычно это 4 байта. И нет ничего необычного в том, что тебе вернули 32х битный адрес, ты можешь спокойно по нему записывать.

Похоже мы не совсем поняли друг друга. Спокойно записывать то смогу, но прыжок будет не туда куда надо. Например есть такой вот скрипт СЕ для 64 битной игры:


alloc(newmem,100,"Game_x64.exe"+CB9133) // jmp 13FDC0000
...

и


alloc(newmem,100) // jmp qword ptr [140A89139] (comment: 05A60000)
...

По первому скрипту прыжок получается туда куда надо, а во втором неизвестно куда. Я хочу понять как это реализовать в C++ (x64-ном проекте). Там похоже как-то связано с выделенным адресом VirtualAllocEx и базовым адресом игры.

Ссылка на комментарий
Поделиться на другие сайты

Похоже мы не совсем поняли друг друга. Спокойно записывать то смогу, но прыжок будет не туда куда надо. Например есть такой вот скрипт СЕ для 64 битной игры:


alloc(newmem,100,"Game_x64.exe"+CB9133) // jmp 13FDC0000
...

и


alloc(newmem,100) // jmp qword ptr [140A89139] (comment: 05A60000)
...

По первому скрипту прыжок получается туда куда надо, а во втором неизвестно куда. Я хочу понять как это реализовать в C++ (x64-ном проекте). Там похоже как-то связано с выделенным адресом VirtualAllocEx и базовым адресом игры.

DWORD64 adderss = 0x0000000140A89139;

И пишешь себе на здоровье.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.