Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 021

/ вопрос решён /

Здравствуйте!

Задача загрузить длл в чужой процесс.
Пытаюсь загрузить с помощью удалённого потока.
В прилежении к вопросу выложу что сделано на данный момент.
VirtualAllocEx и WriteProcessMemory формально работают, проверял выставляя в VirtualAllocEx размер в 100 мегабайт. После срабатывания
WriteProcessMemory память процесса действительно увеличивалась ровно на 100 мегабайт.

Поясню что пишу прогу для личного использования, т.к понимаю что вы подумаете глядя на используемые функции.

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8. if (Length(NewDllPath) = RealWrite) then
  9. begin
  10.  
  11.  
  12.  
  13.  


QWERYTY Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 23 марта 2012, 12:03
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 30 марта 2012, 00:54; участников в обсуждении: 1.
QWERYTY

QWERYTY (статус: Посетитель), 23 марта 2012, 12:18 [#1]:

GetProcAddress(GetModuleHandle('kernel32.dll'), PWideChar('LoadLibraryA'));
PWideChar - это после многих эксперементов. Изначально было PAnsiChar.
делфи 2010 как я понимаю ориентирована(ну в плане начальных настроек) на юникод. Функция же судя из поп-ап подсказки которая вылазит требует указатель на анси символы.
То есть как я понимаю нельзя просто писать PChar('LoadLibraryA')
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

23 марта 2012, 14:49: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Взаимодействие с Windows модератором Ерёмин А.А.

QWERYTY

QWERYTY (статус: Посетитель), 23 марта 2012, 17:32 [#2]:

Ну точно. Довольно подходящий раздел.
Не собирался задавать вопрос в том разделе. У меня чтото с мышкой, бывает кликает не туда, а когда я сам кликаю кликает два раза
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
QWERYTY

QWERYTY (статус: Посетитель), 30 марта 2012, 00:54 [#3]:

Не зря сомневался с кодировками, а код был рабочим.
От недостатка знаний передавал вместо пути к длл кашу.
Наивно полагал что PAnsiChar(NewDllPath) чудесным образом передаст анси строку. В итоге я указываю на анси строку в которой юникод строка.
Пробовал конвертировать при помощи WideCharToMultiByte, но сконвертить так и не смог.
Length(NewDllPath) - подсчитывает количество юникод символов, а VirtualAllocEx выделяет место под анси символы
В итоге я прозрел, нужно выделять место под удвоенное количество символов и передавать юникод строку с последующим вызовом LoadLibraryW.

Вот так канает:
ParentHandle, LibPathLen, PId, TId, HProcess, HThread, MyTId, RealWrite: CARDINAL;
StartAddress, RemotePMem: POINTER;
 
begin
ParentHandle := FindWindow('SplashWin', NIL); 
LibPathLen := Length('Путь к длл')*2;
TId := GetWindowThreadProcessId(ParentHandle, @PId); 
HProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, PId);
StartAddress := GetProcAddress(GetModuleHandle('kernel32.dll'), PAnsiChar('LoadLibraryW'));
RemotePMem := VirtualAllocEx(HProcess, 0, LibPathLen, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(HProcess, RemotePMem, PWideChar('Путь к длл'), LibPathLen, RealWrite);
HThread := CreateRemoteThread(HProcess, NIL, 0, StartAddress, RemotePMem, 0, MyTId); 
end;
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.

8 мая 2012, 16:35: Статус вопроса изменён на решённый (изменил автор вопроса — QWERYTY)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.