| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |