-
Постов
815 -
Зарегистрирован
-
Посещение
-
Победитель дней
13
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные Coder
-
-
статья на английском, нашел на русском.
Переключил на х64, теперь насколько я знаю, собирается проект под х64. Правда только дебаг, релиз не хочет. "Доступ к ликвидированному объекту не возможен" при компиляции.
Ну да ладно, компилю в дебаге. Не думаю что это что-то меняет. tlhelp32 по прежнему не в какую.
MODULEENTRY32 game = { 0 };printf("Process base: 0x%X, ", game.modBaseAddr);
вот код. Прописал, конечно же, #include <tlhelp32>. При компиле выдается 0х0
Ну а как ты снимок создаешь показать не хочешь? Код перечисления где?
-
resultArray это массив void*, куда записываются совпадения по сигнатуре, а maxCount это лимит (сколько совпадений по сигнатуре искать), по умолчанию - 1.
Как компилить в x64 - http://msdn.microsoft.com/en-us/library/9yb4317s.aspx
-
Ну как же так можно, почему ты даже не смотришь в хидер файлы?
Там каждый метод документирован.
/* startAddress - address from which search begins size - search size (maximum offset) pattern - pattern for search mask - mask of pattern for search resultArray - pointer to an array that stores data maxCount [opt] - limit count of found signatures WARNING: size of resultArray should be not smaller than maxCount You must open process with PROCESS_QUERY_INFORMATION and PROCESS_VM_READ rights before call this function Return value: none */ virtual void FindPattern(void* startAddress, size_t size, PBYTE pattern, char* mask, void* resultArray[], size_t maxCount = 1);
Открой MemWorker.h, там каждый метод документирован. Тебе даже студия мою документацию в твоем видео вывела, но ты продолжаешь ее игнорировать...
tlhelp32 работает, я же тебе уже говорил, что компилить надо в x64 режиме.
-
Моя твоя не понимать))
Изложи свою проблему понятнее и желательно с примерами кода (или иллюстрациями).
-
Coder не разбирается в чем-то, связанном с программированием???)))
Сейчас помоему магма вулканическая развергентся)))
Ведь мы это делали, в том уроке с MemReader. BaseAddress, помнишь?))
Разве нельзя это переделать под этот, уже обновленный исходник? (чтобы работал на 32 и 64 бит и без разницы в какой кодировке)
Моя не понимать о чем ты говорить)
Если ты про получение базового адреса модуля, то там все просто вполне делается. Если DLL - GetModuleHandle, если внешний процесс, то можно через tlhelp32 сделать.
-
Это тебе виднее, я в этом не особо разбираюсь)
-
VirtualQuerryEx?
Я то уже удалил, это я по глупости своей сморозил) Там все правильно, VirtualQuery это метод класса, все правильно.
- 1
-
Спасибо))
"Старому" исходнику новое описание ReadPointer не помогло, теперь ковыряю новый ))
В нем, как я понял, FindPattern это поиск сигнатуры. Немного непонятно с предпоследним аргументом, resultArray... Что ему передавать?
Указатель на массив void* размером maxCount элементов.
void* results[5] = {0};FindPattern(..., results, 5);
-
Ну начнем с того, что Dead Ricing 3 это x64 игра.
А трейнер собирается под x86,так еще и исходники тоже под x64 заточены.
Примерно так надо код фиксить и компилить трейнер надо под x64.
DWORD64 MemReader::ReadPointer(DWORD64 base, DWORD64* offsets, int count){ for (int i = 0; i < count - 1; i++) { base = Read(base + offsets[i], 8).toUINT64(); } return base + offsets[count - 1];}
Единственное, чем я тебе могу помочь, это предоставить свои наработки последнего поколения (их в уроках не было).
Наработки независимы от архитектуры под которую ты компилишь (x86 или x64), а также от кодировки ANSI или UNICODE.
Но однако, трейнер тебе все равно надо собрать под x64, потому что ты работаешь с игрой в x64.
Исходники во вложении. Метод ReadPointer накидаешь сам думаю, если возникнут осложнения - пиши.
Пример использования:
#include "Process.h"#include "MemWorker.h"int SeDebugPrivilege(void){ HANDLE hToken; LUID Val; TOKEN_PRIVILEGES tp; OpenProcessToken(HANDLE(-1), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Val); tp.PrivilegeCount = 1; tp.Privileges[0].Luid = Val; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof (tp), NULL, NULL); CloseHandle(hToken); return 1;}int main(int argc, CHAR* argv[]){ GH::Process process; GH::MemWorker memory; process.FindProcessID(GH::string(TEXT("game.exe"))); DWORD PID = process.GetPID(); if (PID == 0) { printf("Run game first!\n"); system("PAUSE"); return 0; } printf("PID: %X\n", PID); process.OpenProcess(PROCESS_ALL_ACCESS); // открываешь хэндл memory.SetProcess(&process); // помещаешь указатель на объект Process в MemWorker // ... дальше оперируешь с процессом игры process.CloseProcess(); // закрываешь хэндл return 0;}
- 2
-
У нас так много посещаемости или активных юзеров, что можно регу делатьз закрытой? Или может здесь есть какой-то платный контент?
-
нее) я имею ввиду без d3d9 и т.д
просто используя api игры
Тогда реверс инжиниринг тебе в помощь) Ну или SDK по игре (если такой имеется).
Касательно твоего основного вопрососа.
Описываешь указатель на функцию и потом просто через указатель вызываешь функцию.
Вот кусок кода из моего проекта, возможно тебе поможет:
typedef void (__thiscall IRenderer::*func)(); // тип мембер-функции интерфейса IRendererfunc origDraw = 0; // указатель на функциюIRenderer* render = 0; // указатель на экземпляр класса IRendererHINSTANCE hDLL = 0;DWORD* ReadPtr(DWORD base, DWORD offset){ return *(DWORD**)(base + offset);}void HookedDraw(void){ // рисуем что хотим render->TextToScreenColor(1, 1, 255, 0, 0, 255, "Hello world!\nThis is IRenderer::Update hook!"); //printf("HookedDraw!\n"); (render->*origDraw)(); // но не забываем вернуть управление оригинальной функции}void vTableHook(DWORD* vTable, short index, DWORD value){ DWORD oldProt = 0; VirtualProtect(vTable, index * 4, PAGE_READWRITE, &oldProt); vTable[index] = value; VirtualProtect(vTable, index * 4, oldProt, &oldProt);}DWORD WINAPI Thread(LPVOID){ CreateConsole(); DWORD* ptr = ReadPtr((DWORD)GetModuleHandleA("CryGame.dll"), 0x00118564); DWORD* ptr2 = ReadPtr((DWORD)ptr, 0x48); CXGame* game = (CXGame*)ptr2; // получили указатель на главный класс игры ISystem* sys = game->GetSystem(); // получили указатель на основную подсистему игры render = sys->GetIRenderer(); // получили указатель на рендерер игры DWORD* vTable = *(DWORD**)render; // получили указатель на vTable экзепляря класса IRenderer origDraw = (func&)vTable[15]; // получили указатель на оригинальную функцию отрисовки (IRenderer::Update) vTableHook(vTable, 15, (DWORD)HookedDraw); // подменяем указатель оригинальной IRenderer::Update на нашу HookedDraw getch(); // ждем пока в консоли нажмут любую клавишу vTableHook(vTable, 15, (DWORD&)origDraw); // снимаем хук FreeConsole(); // закрываем консоль FreeLibraryAndExitThread(hDLL, 0); // выгружаем DLL и завершаем поток return 0;}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){ if (fdwReason == DLL_PROCESS_ATTACH) { hDLL = hinstDLL; DisableThreadLibraryCalls(hinstDLL); CreateThread(0, 0, Thread, 0, 0, 0); } return 1;}
Вообще загугли все это, как вызывать функции на Си через указатели, вот здесь неплохо расписано - http://amse.ru/courses/cpp2/2011_04_11.html .
-
Работоспособность ссылок снова восстановлена.
-
У тебя в CE сигнатуре нигде нет 0xFF (-1), а у тебя за место нулей идут идут -1.
-
Чуть ниже в окне IDE будет написано в чем проблема.
-
Спасибо , попробую разобраться.
Т.е я искал сигнатуру в своем процессе ?Оо
Именно
-
Всё просто.
У тебя в функции FindSignature выполняется VirtualQueryEx к твоему процессу если что:
VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle,
А здесь должен быть процесс Heroes 3. Вот и думай теперь, почему у тебя не получается.
И во первых, FindSignature должен возвращать не int, так как адреса у нас хранятся в виде unsigned int - uint.
Во вторых FindSignature по логике твоего кода - первым параметром должен получать хэндл на открытый процесс Heroes 3 и вторым параметром сигнатуру.
uint FindSignature(HANDLE hProcess, byte[] signature)....
P.S. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай (когда он не нужен).
-
хм сейчас попробую, я собираюсь использовать функции игры вместо d3d hook для создания меню
Не понял, что здесь смешного.
Перехватывай через vTable - EndScene (DX 9, если не ошибаюсь индекс в vTable будет 42) либо Present (DX 10, 11, индекс Present загуглишь сам думаю) и перед тем как вернуть управление оригинальной функции рисуй своё меню, всё просто.
-
А что за девайс vBox этот?
-
Кстати, откатился я с 10/8.1 на 7.
-
NullAlex, и тебя с наступающим! Желаю хорошо отменить в семейном кругу или в кругу друзей!
Всем желаю всех благ в наступающем, 2015м году! Желаю форумчанам: творческих в успехов, обрести смысл жизни и найти своё предназначение (для тех, кто пока не определился).
Помните - ищущий всегда найдет, эта поговорка существует еще с древних времен (по некоторым источникам с 15-16 веков), а значит не нужно сдаваться и отчаиваться!
Также желаю всем крепкого здоровья, дабы болезни не отвлекали вас от творческой деятельности, и чтобы мир для вас был всегда в цветных красках.
А теперь, что касается 31 декабря - уважаемые форумчане, фраза: "Чрезмерное употребление алкоголя вредит вашему здоровью" не пустые слова.
Поэтому не стоит пить больше, чем нужно (если есть такой соблазн). Празднуйте и веселитесь!
Спасибо за внимание, всем удачи!
-
Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3...
В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.
-
Тебе нужно использовать альфа-канал, который отвечает за прозрачность.
RGBA формат.
Первые 3 это код цвета (Красный, Зеленый, Синий), а посл. это А - Альфа канал (от 0 до 255 регулируется уровень прозрачности, если я конечно ничего не путаю).
-
Просто восхитительная работа!
-
Отличная работа!
В обнове следующей замени шрифты на более читаемые, или расположи их на другом бэкграунде
Вопрос по уроку Coder'a (читаем указатели)
in Общение
Опубликовано
И каким образом тогда должен получаться базовый адрес?