|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
CreateRemoteThread - краш целового приложения
Доброго времени суток участники форума.
Возникла проблема, которую не знаю как исправить. Алгоритм: Вызов функции чужого адресного пространства по указателю и передача ей параметров без использования библиотеки. Рабочий вариант, только спустя успешного выполнения функции с моими параметрами, проходит 5-6 секунд и крашит. Код:
type TShilutefn = function(id: Integer; r, g, b, alpha: real; k, d: boolean; s: real): integer; stdcall; procedure ISetShilute(oShilute: TShilutefn); stdcall; //Функция что выполняется в памяти. begin oShilute := Pointer($06D8ED0); //Указатель (имеет статистическое значение) oShilute(30583, 1, 0, 0, 0.9, false, false, 999); end; function AllocAndCopyMem(hProcess: dword; ptBuffer: Pointer; iBuffSize: Int64): Pointer; var Write: Cardinal; begin WinHandle:= OpenProcess(PROCESS_ALL_ACCESS,False,hProcess); Write := 0; Result := VirtualAllocEx(hProcess, nil, iBuffSize, MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hProcess, Result, ptBuffer, iBuffSize, Write); end; procedure SetShilute(hProcess: dword); var tInj: TShilutefn; ptStruct: Pointer; uTamFun: UINT; ptEsp: Pointer; hThread: THandle; begin hProcess:= OpenProcess(PROCESS_ALL_ACCESS,False,hProcess); ptStruct := AllocAndCopyMem(hProcess, @tInj, Sizeof(@tInj)); uTamFun := UINT(@SetShilute) - UINT(@ISetShilute); ptEsp := AllocAndCopyMem(hProcess, @ISetShilute, uTamFun); hThread := CreateRemoteThread(hProcess, nil, 0, ptEsp, ptStruct, 0, PDWORD(nil)^); if hThread <> 0 then begin CloseHandle(hThread); //VirtualFreeEx(hProcess, ptStruct, 0, MEM_RELEASE); //VirtualFreeEx(hProcess, ptEsp, 0, MEM_RELEASE); end; end; Виде библиотеки работает идеально, но мне надо в приложении. Надеюсь на вашу помощь! За ранее огромное спасибо! Последний раз редактировалось Admin, 27.03.2017 в 19:27. |
#2
|
||||
|
||||
Вызывается функция, а результат в песок летит, может так надо
Код:
procedure ISetShilute(oShilute: TShilutefn); stdcall; //Функция что выполняется в памяти. var i: integer; begin oShilute := Pointer($06D8ED0); //Указатель (имеет статистическое значение) i:= oShilute(30583, 1, 0, 0, 0.9, false, false, 999); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Да нет дело не в этом было, поставил вместо типа данных real, single.
Спасибо! Заработало всё! |