|
Вопрос # 6 021/ вопрос решён / |
|
Здравствуйте!
Задача загрузить длл в чужой процесс.
Пытаюсь загрузить с помощью удалённого потока.
В прилежении к вопросу выложу что сделано на данный момент.
VirtualAllocEx и WriteProcessMemory формально работают, проверял выставляя в VirtualAllocEx размер в 100 мегабайт. После срабатывания
WriteProcessMemory память процесса действительно увеличивалась ровно на 100 мегабайт.
Поясню что пишу прогу для личного использования, т.к понимаю что вы подумаете глядя на используемые функции.
 |
Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 23 марта 2012, 12:03
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 30 марта 2012, 00:54; участников в обсуждении: 1.
|
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 (статус: Посетитель), 23 марта 2012, 17:32 [#2]:
Ну точно. Довольно подходящий раздел.
Не собирался задавать вопрос в том разделе. У меня чтото с мышкой, бывает кликает не туда, а когда я сам кликаю кликает два раза
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|