Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - CreateRemoteThread постоянное возникновение ошибки

Ответить
Настройки темы
Delphi - CreateRemoteThread постоянное возникновение ошибки

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить 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;
при запуске процедуры, программа, в которую инжектируется год, выдает ошибку «инструкция по адресу 0х0000000 обратилась к памяти по адресу 0х0000000. память не может быть read».
Ошибка возникает при CreateRemoteThread. ThreadAddr и ParamAddr <> nil, т.е. память выделена.
Пожалуйста, помогите разобраться с данной проблемой. В инете встречалась пара сообщений о подобной ошибке, но решения и адекватного объяснения, я так и не встретил.

P.S. Среда delphi 2009

Отправлено: 20:21, 31-05-2009

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Если CREATE_SUSPENDED указать - та же ошибка получается?

Отправлено: 08:55, 01-06-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Сегодня решил эту проблему выделением большего объема памяти под модуль и под параметры, которые передаются ему (+исправил небольшие неточности в самом коде). Хотя все равно остается не понятным, какой же нужно выделить размер, если VirtualAllocEx(hProcess, 0, SizeOf(Injected), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE); не дает результата. Я просто вписал 512, и все заработало, но это же не есть оптимальный вариант, учитывая, что хранимая функция может быть и большего размера и меньшего.

Отправлено: 13:00, 01-06-2009 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


а под стек и под свободную память откуда оперативка выделяется? (неизвестно как реализуют себя борландовские функции, попавшие в чужой процесс, без инициализации своих библиотек)

Отправлено: 13:41, 01-06-2009 | #4


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


dwar, во-первых,вы пробовали отлаживать?Например,в SoftIce.
Во-вторых,внедряя код подобным образом,вы скорее всего получите ошибку доступа.Дело в том,что в вашей процедуре Injected могут быть относительные смещения,а VirtualAllocEx вернёт вам в данном случае адрес,заданный системой.Поэтому смещения будут указывать не туда,куда надо,что и вызовет ошибку.
И почему вы выделяете место для процедуры размером четыре байта?
Более грамотный способ - это внедрение своей библиотеки.Ищите статьи.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 13:58, 01-06-2009 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - CreateRemoteThread постоянное возникновение ошибки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Постоянное кидалово из всех игр,синие экраны смерти,непонятные ошибки 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




 
Переход