
06.04.2014, 00:44
|
 |
Новичок
|
|
Регистрация: 07.01.2012
Сообщения: 90
Репутация: 10
|
|
Цитата:
Klyaksa, поясни, зачем тебе вообще это надо. Может есть решение проще.
|
Моя длл-ка замедляет процесс игры или остонавливает полностью(подмена процедуры QueryPerformanceCounter).
Цитата:
Инжект для того и делается обычно, чтобы изменить поведение программы,
|
Соответсвенно чтобы каждый раз не перекомпилировать длл с теми или другими параметрами скорости, вот и хочу сделать управление с другой проги.
Код:
function InjectModule(ModulePath: PAnsiChar; ProcessID: DWORD): Boolean;
type
TNtCreateThreadEx = function(
ThreadHandle: PHANDLE;
DesiredAccess: ACCESS_MASK;
ObjectAttributes: Pointer;
ProcessHandle: THANDLE;
lpStartAddress: Pointer;
lpParameter: Pointer;
CreateSuspended: BOOL;
dwStackSize: DWORD;
Unknown1: Pointer;
Unknown2: Pointer;
Unknown3: Pointer): HRESULT; stdcall;
var
lpStartAddress, lpParameter: Pointer;
dwSize: Integer;
hProcess, hThread, lpThreadId, lpExitCode, lpBytesWritten: Cardinal;
NtCreateThreadEx: TNtCreateThreadEx;
begin
Result := False;
if IsModuleLoaded(ModulePath, ProcessID) = True then
Exit;
hProcess := 0;
hProcess := OpenProcess(MAXIMUM_ALLOWED, False, ProcessID);
if hProcess = 0 then
Exit;
dwSize := StrLen(ModulePath) + 1;
lpParameter := VirtualAllocEx(hProcess, nil, dwSize, MEM_COMMIT, PAGE_READWRITE);
if (lpParameter = nil) then
begin
if hProcess <> 0 then
CloseHandle(hProcess);
Exit;
end;
if GetOSVersion >= 60 then
NtCreateThreadEx := GetProcAddress(GetModuleHandleW('ntdll'), 'NtCreateThreadEx');
lpStartAddress := GetProcAddress(GetModuleHandleW('kernel32'), 'LoadLibraryA');
if (lpStartAddress = nil) then
Exit;
if GetOSVersion >= 60 then
if (@NtCreateThreadEx = nil) then
Exit;
lpBytesWritten := 0;
if (WriteProcessMemory(hProcess, lpParameter, ModulePath, dwSize, lpBytesWritten) = False) then
begin
VirtualFreeEx(hProcess, lpParameter, 0, MEM_RELEASE);
if hProcess <> 0 then
CloseHandle(hProcess);
Exit;
end;
hThread := 0;
lpThreadId := 0;
if GetOSVersion >= 60 then
NtCreateThreadEx(@hThread, MAXIMUM_ALLOWED, nil, hProcess, lpStartAddress, lpParameter, false, 0, 0, 0, 0)
else
hThread := CreateRemoteThread(hProcess, nil, 0, lpStartAddress, lpParameter, 0, lpThreadId);
if (hThread = 0) then
begin
VirtualFreeEx(hProcess, lpParameter, 0, MEM_RELEASE);
CloseHandle(hProcess);
Exit;
end;
GetExitCodeThread(hThread, lpExitCode);
if hProcess <> 0 then
CloseHandle(hProcess);
if hThread <> 0 then
CloseHandle(hThread);
Result := True;
end;
|