Гость andriwer Опубликовано 20 сентября, 2013 Поделиться Опубликовано 20 сентября, 2013 Как мне сделать на 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 endif lenghtLines ~= nil then // заменаfor i = 0, lenghtLines-1 do address = stringlist_getString(stringListAddresses, i) writeBytes(address ,сигнатура для замены); end end Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 21 сентября, 2013 Поделиться Опубликовано 21 сентября, 2013 Код поиска сигнатур приводился на нашем форуме неоднократно, как для С++, так и для C#. Далее, код записи в память тоже приводился. Воспользуйся поиском по форуму. Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 21 сентября, 2013 Поделиться Опубликовано 21 сентября, 2013 посмотри видео уроки кодера у нас на форуме, там все подробно описано как делать, то что тебе надо на сколько я помню в теме пишем трейнер на с++ или же трейнер гибрид на с++ Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость andriwer Опубликовано 23 сентября, 2013 Поделиться Опубликовано 23 сентября, 2013 Ну вот накопал я кое что...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) // как только жму запуск доходит до сюда и такая шня...и после...Что делать :/ P.S на клавишу Активировать OnClick кинул такой код... private void button1_Click(object sender, EventArgs e) { Func func = new Func(); func.WriteBytes(); } Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 24 сентября, 2013 Поделиться Опубликовано 24 сентября, 2013 выход за пределы выделенной памяти, попробуй прочитать больший регион памяти, в твоем коде трудно чуток разбираться) Ссылка на комментарий Поделиться на другие сайты Поделиться
Drakon3 Опубликовано 15 октября, 2013 Поделиться Опубликовано 15 октября, 2013 function AOBScan(L: PLua_state): integer; cdecl;varparameters: integer;i,b: integer;scanstring: string;protectionflags: string;alignmentparam: string;alignmenttype: TFastScanMethod;list: tstringlist;beginresult:=0;parameters:=lua_gettop(L);if parameters=0 then exit;protectionflags:='';alignmenttype:=fsmNotAligned;alignmentparam:='1';if (parameters>=1) and (lua_isstring(L,-parameters)) thenbegin//it's a scanstring, optional callscanstring:=Lua_ToString(L, -parameters);if parameters>=2 thenprotectionflags:=Lua_ToString(L, -parameters+1);if parameters>=3 thenalignmenttype:=TFastScanMethod(lua_tointeger(L, -parameters+2));if parameters>=4 thenalignmentparam:=Lua_ToString(L, -parameters+3);endelsebegin//buildup the scanstringscanstring:='';for i:=-parameters to -1 dobeginb:=lua_tointeger(L,i);if (b>255) then scanstring:=scanstring+'* 'elseif b=0 thenbeginif not lua_isnumber(L,i) thenscanstring:=scanstring+'* 'elsescanstring:=scanstring+'00 'endelse scanstring:=scanstring+inttohex(b,2)+' ';end;end;lua_pop(L, lua_gettop(L));list:=tstringlist.create;if getaoblist(scanstring, list, protectionflags, alignmenttype, alignmentparam) thenbeginresult:=1;lua_pushlightuserdata(L, list);endelsebeginlist.free;end;end; Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 21 октября, 2013 Поделиться Опубликовано 21 октября, 2013 Привет всем! У меня возник вопрос, как вывести значения ассемблера из заинжектенного кода в адресном пространстве...Например:void _declspec(naked) Cheat(){DWORD value;_asm{push edxmov edx[esi+23]mov value,edxpop edxretn}}Как вывести значение "value" на экран путем MessageBox? Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 26 октября, 2013 Поделиться Опубликовано 26 октября, 2013 можно value сделать глобальной переменной и вывести её значение MessageBox'ом char buff[4];wsprintf(buff, "value = 0x%X", value);MessageBox(NULL, buff, "", MB_OK);по идее еще можно вызвать из ассемблерского кода еще, но тут уже гугл в помощь Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 27 октября, 2013 Поделиться Опубликовано 27 октября, 2013 можно value сделать глобальной переменной и вывести её значение MessageBox'омchar buff[4];wsprintf(buff, "value = 0x%X", value);MessageBox(NULL, buff, "", MB_OK);по идее еще можно вызвать из ассемблерского кода еще, но тут уже гугл в помощьЯ так тоже пробовал. Если DWORD value; сделать глобальной, то метка value исчезает совсем, вместо него появляется call в никуда...Жалко что никто не знает решение. Остается только написать функцию с запросом и возвратом значения... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 октября, 2013 Поделиться Опубликовано 27 октября, 2013 В ассемблерной вставке убираешь retn (это возврат из функции), после ассемблерной вставки форматируешь число, как тут писали выше, и вызываешь месседжбокс. Вот и вся проблема. Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 27 октября, 2013 Поделиться Опубликовано 27 октября, 2013 Я так тоже пробовал. Если DWORD value; сделать глобальной, то метка value исчезает совсем, вместо него появляется call в никуда...Жалко что никто не знает решение. Остается только написать функцию с запросом и возвратом значения...наверно потому, что надо делать так:mov [value], edxтогда все прокатит Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 30 ноября, 2013 Поделиться Опубликовано 30 ноября, 2013 В тему, кто нить делал трейнер или подобное для 64 битной версии виндовс на VC++? Отпишитесь... Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 30 ноября, 2013 Поделиться Опубликовано 30 ноября, 2013 В тему, кто нить делал трейнер или подобное для 64 битной версии виндовс на VC++? Отпишитесь...Писал под x64 платформу. Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 1 декабря, 2013 Поделиться Опубликовано 1 декабря, 2013 Писал под x64 платформу.Подскажи пожалуйста как правильно и грамотно выделять память в процессе игры x64 бит. Я пытался выделить память с помощью VirtualAllocEx, но возвращяется адрес в виде DWORD т.е. 0x6160000, а должно возвращаться в виде DWORD64 (DWORD_PTR) т.е. 0x106160000. Из за этого прыжок получается неизвестно куда Или в 64 существует иной способ для выделения памяти? В проекте у меня выбрана платформа x64. Система: Win7x64. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 1 декабря, 2013 Поделиться Опубликовано 1 декабря, 2013 Подскажи пожалуйста как правильно и грамотно выделять память в процессе игры x64 бит. Я пытался выделить память с помощью VirtualAllocEx, но возвращяется адрес в виде DWORD т.е. 0x6160000, а должно возвращаться в виде DWORD64 (DWORD_PTR) т.е. 0x106160000. Из за этого прыжок получается неизвестно куда Или в 64 существует иной способ для выделения памяти? В проекте у меня выбрана платформа x64. Система: Win7x64.Данная функция возвращает void*, обычно это 4 байта. И нет ничего необычного в том, что тебе вернули 32х битный адрес, ты можешь спокойно по нему записывать. Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 3 декабря, 2013 Поделиться Опубликовано 3 декабря, 2013 Данная функция возвращает 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 и базовым адресом игры. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 3 декабря, 2013 Поделиться Опубликовано 3 декабря, 2013 Похоже мы не совсем поняли друг друга. Спокойно записывать то смогу, но прыжок будет не туда куда надо. Например есть такой вот скрипт СЕ для 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;И пишешь себе на здоровье. Ссылка на комментарий Поделиться на другие сайты Поделиться
ArxLex Опубликовано 4 декабря, 2013 Поделиться Опубликовано 4 декабря, 2013 DWORD64 adderss = 0x0000000140A89139;И пишешь себе на здоровье.Спасибо за отзывы, разобрался что к чему с помощью MSDN. Теперь есть база и под x64! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения