есть код: Code: function InjectLibraryAPI(lpProcessID: Cardinal; lpDllname: String): LongBool; var hProc: Cardinal; oAlloc: Pointer; cWPM: Cardinal; hRemThread: Cardinal; begin result := false; SetLastError(ERROR_SUCCESS); hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); // открываем процесс if hProc <> 0 then begin oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE); // если существует выделяем память в процессе if oAlloc <> nil then begin if WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM) = true then begin // если получилось выделить, то копируем туда содержимое своей DLL CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread); // создаем удаленный поток, по адресу kernel32.dll -> LoadLibraryA, чтобы подгрузить DLL средствами WinAPI, в чужом процессе if GetLastError = ERROR_SUCCESS then result := true; end; end; end; CloseHandle(hProc); // закрываем Handle процесса end; Все теперь получилось, вопрос другой теперь, как мне можно вызывать функции игры из программы? Допустим есть адрес функции которая дает игроку оружие, как мне ее вызвать из чужого пространства, ну и что-бы игрок получил оружие. Вот как вызвать?
потому что школота умеет писать только на Инди и Синапс (и то спорно) компонентах тупые фейки. В вашем коде происходит инжект ДЛЛ в процесс игры, а это значит, что код, который находится в ней, выполняется от имени данного процесса, что в свою очередь дает право использовать пространство как своё. Реализуйте в ДЛЛ работу hotkey. Можно сделать через перехват клавиш, хуками. В обработчике hotkey нужной клавиши просто вызываете напрямую функцию, которая дает оружие игрокам, ведь адрес её известен, только нужно знать прототип. Если возникает трудности в синтаксисе Делфи при вызове функции, зная её адрес, то собственно вот: 1. Объявляем прототип функции в разделе переменных (в данном примере это процедура). Code: var INeedSomeWeapons: procedure(param1, param2, param3: integer); 2. Присваиваем функции нужный адрес. Code: INeedSomeWeapons := ptr($адрес); 3. Вызываем как обычную функцию. Code: INeedSomeWeapons(1, 2, 3);
Тогда в чем проблема? Со знанием трех ЯП реализовать инжект кода в процесс, через ДЛЛ, с уже готовой процедурой собственного самого инжекта? Или дать наводку на API функции? Да тут всего их две нужно - установить хук SetWindowsHookEx() на перехват сообщений клавиатуры, и вызвать следующую по цепочке процедуру, через CallNextHookEx(), внутри обработчика. Тут собственно разжевывать нечего.
http://www.wasm.ru/forum/viewtopic.php?id=38110 http://www.wasm.ru/forum/viewtopic.php?id=42515 http://www.wasm.ru/forum/viewtopic.php?id=39826