|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - CreateRemoteThread постоянное возникновение ошибки |
|
Delphi - CreateRemoteThread постоянное возникновение ошибки
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать Появилась необходимость инжектировать свой код в другую программу. Базовый адрес и смещение, куда требуется занести свое значение, известно.
Вот код процедуры: procedure TMainForm.Button1Click(Sender: TObject); var aParamsSize: DWORD; dd,ProcessId,lpNumberOfBytes:cardinal; ThreadAddr, ParamAddr: Pointer; hThread, hProcess: THandle; Wnd :HWND; procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean); var NewState: TTokenPrivileges; luid: TLargeInteger; hToken: THandle; ReturnLength: DWord; begin OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, szPrivilege, luid); NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := luid; if (fEnable) then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, ReturnLength); CloseHandle(hToken); end; // процедура, которая выполняет необходимые изменения в памяти procedure Injected(Param: PParams); stdcall; begin .... end; begin try Wnd := FindWindow(nil, WinName); //находим окно GetWindowThreadProcessId(Wnd, @ProcessId); ChangePrivilege('SeDebugPrivilege', True); hProcess := OpenProcess( PROCESS_ALL_ACCESS, true, ProcessId); //хэндл окна dd := 1000; //значение, которое надо внести aParamsSize := SizeOf(dd); //выделяем память, где будет храниться процедура Injected ThreadAddr := VirtualAllocEx(hProcess, 0, 4, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE); WriteProcessMemory(hProcess, ThreadAddr, @Injected, 4, lpNumberOfBytes); ParamAddr := VirtualAllocEx(hProcess, 0, 4, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); WriteProcessMemory(hProcess, ParamAddr, Pointer(dd), 4, lpNumberOfBytes); hThread := CreateRemoteThread(hProcess, 0, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); finally CloseHandle(hProcess); end; end; Ошибка возникает при CreateRemoteThread. ThreadAddr и ParamAddr <> nil, т.е. память выделена. Пожалуйста, помогите разобраться с данной проблемой. В инете встречалась пара сообщений о подобной ошибке, но решения и адекватного объяснения, я так и не встретил. P.S. Среда delphi 2009 |
|
Отправлено: 20:21, 31-05-2009 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Если CREATE_SUSPENDED указать - та же ошибка получается?
|
Отправлено: 08:55, 01-06-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Сегодня решил эту проблему выделением большего объема памяти под модуль и под параметры, которые передаются ему (+исправил небольшие неточности в самом коде). Хотя все равно остается не понятным, какой же нужно выделить размер, если VirtualAllocEx(hProcess, 0, SizeOf(Injected), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); не дает результата. Я просто вписал 512, и все заработало, но это же не есть оптимальный вариант, учитывая, что хранимая функция может быть и большего размера и меньшего.
|
Отправлено: 13:00, 01-06-2009 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать а под стек и под свободную память откуда оперативка выделяется? (неизвестно как реализуют себя борландовские функции, попавшие в чужой процесс, без инициализации своих библиотек)
|
Отправлено: 13:41, 01-06-2009 | #4 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать dwar, во-первых,вы пробовали отлаживать?Например,в SoftIce.
Во-вторых,внедряя код подобным образом,вы скорее всего получите ошибку доступа.Дело в том,что в вашей процедуре Injected могут быть относительные смещения,а VirtualAllocEx вернёт вам в данном случае адрес,заданный системой.Поэтому смещения будут указывать не туда,куда надо,что и вызовет ошибку. И почему вы выделяете место для процедуры размером четыре байта? Более грамотный способ - это внедрение своей библиотеки.Ищите статьи. |
|
------- Отправлено: 13:58, 01-06-2009 | #5 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Постоянное кидалово из всех игр,синие экраны смерти,непонятные ошибки | SuperDog | Видеокарты | 6 | 18-01-2010 16:27 | |
возникновение черного экрана | Silverman | Видеокарты | 3 | 16-05-2008 12:45 | |
Постоянное включение Scandiskа | vovik25 | Microsoft Windows 95/98/Me (архив) | 3 | 28-08-2006 20:56 |
|