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

Coder

Ветераны
  • Постов

    815
  • Зарегистрирован

  • Посещение

  • Победитель дней

    13

Весь контент Coder

  1. И каким образом тогда должен получаться базовый адрес?
  2. Ну а как ты снимок создаешь показать не хочешь? Код перечисления где?
  3. resultArray это массив void*, куда записываются совпадения по сигнатуре, а maxCount это лимит (сколько совпадений по сигнатуре искать), по умолчанию - 1. Как компилить в x64 - http://msdn.microsoft.com/en-us/library/9yb4317s.aspx
  4. Ну как же так можно, почему ты даже не смотришь в хидер файлы? Там каждый метод документирован. /* 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 режиме.
  5. Изложи свою проблему понятнее и желательно с примерами кода (или иллюстрациями).
  6. Моя не понимать о чем ты говорить) Если ты про получение базового адреса модуля, то там все просто вполне делается. Если DLL - GetModuleHandle, если внешний процесс, то можно через tlhelp32 сделать.
  7. Это тебе виднее, я в этом не особо разбираюсь)
  8. Я то уже удалил, это я по глупости своей сморозил) Там все правильно, VirtualQuery это метод класса, все правильно.
  9. Указатель на массив void* размером maxCount элементов. void* results[5] = {0};FindPattern(..., results, 5);
  10. Ну начнем с того, что 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;}Mem.zip
  11. У нас так много посещаемости или активных юзеров, что можно регу делатьз закрытой? Или может здесь есть какой-то платный контент?
  12. Тогда реверс инжиниринг тебе в помощь) Ну или 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 .
  13. Coder

    Custom DLL Injector

    Работоспособность ссылок снова восстановлена.
  14. У тебя в CE сигнатуре нигде нет 0xFF (-1), а у тебя за место нулей идут идут -1.
  15. Всё просто. У тебя в функции 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. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай (когда он не нужен).
  16. Не понял, что здесь смешного. Перехватывай через vTable - EndScene (DX 9, если не ошибаюсь индекс в vTable будет 42) либо Present (DX 10, 11, индекс Present загуглишь сам думаю) и перед тем как вернуть управление оригинальной функции рисуй своё меню, всё просто.
  17. Кстати, откатился я с 10/8.1 на 7.
  18. NullAlex, и тебя с наступающим! Желаю хорошо отменить в семейном кругу или в кругу друзей! Всем желаю всех благ в наступающем, 2015м году! Желаю форумчанам: творческих в успехов, обрести смысл жизни и найти своё предназначение (для тех, кто пока не определился). Помните - ищущий всегда найдет, эта поговорка существует еще с древних времен (по некоторым источникам с 15-16 веков), а значит не нужно сдаваться и отчаиваться! Также желаю всем крепкого здоровья, дабы болезни не отвлекали вас от творческой деятельности, и чтобы мир для вас был всегда в цветных красках. А теперь, что касается 31 декабря - уважаемые форумчане, фраза: "Чрезмерное употребление алкоголя вредит вашему здоровью" не пустые слова. Поэтому не стоит пить больше, чем нужно (если есть такой соблазн). Празднуйте и веселитесь! Спасибо за внимание, всем удачи!
  19. В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.
  20. Тебе нужно использовать альфа-канал, который отвечает за прозрачность. RGBA формат. Первые 3 это код цвета (Красный, Зеленый, Синий), а посл. это А - Альфа канал (от 0 до 255 регулируется уровень прозрачности, если я конечно ничего не путаю).
  21. Просто восхитительная работа!
  22. Отличная работа! В обнове следующей замени шрифты на более читаемые, или расположи их на другом бэкграунде
×
×
  • Создать...

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

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