
23.02.2012, 17:34
|
Прохожий
|
|
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
|
|
Облазил Инет и в каком-то закаулке наткнулся на обсуждение некого Дж. Ритхера и его книженции. Его там очень хорошо расхваливали, и как я сам убедился - заслуженно. Скачал я его книгу и по рассмотренному примеру мне удалось сделать инжект. Теперь все прекрасно работает, осталось только помудрить с ANSI и UTF версиями вызовов
Вот результат:
Код:
Var libAddr:PChar; // Путь к внедряемой DLL-ке (необходим полный путь)
libSize:Integer; // Размер нашей строки libAddr
processId:Dword; // Идентификатор процесса
processHandle:THandle; // Описатель (Хэндл) процесса
stringMemoryBlock:Pointer; // Указатель на выделенную память
aThreadAdress:Pointer; // Адрес LoadLibraryA (ANSI)
threadHandle:THandle; // Хэндл созданного потока
// Подгружаемая библиотека (прописаны мои пути)
libAddr := 'D:\KURSOVAJA\WM\dlls\httpHook.dll';
libSize := Length(libAddr)*SizeOf(Pchar);
// Получаем идентификатор процесса (ломаем Оперу)
processId := GetProcessId('opera.exe');
// Получаем хэндл процесса
processHandle := OpenProcess(PROCESS_ALL_ACCESS or PROCESS_VM_WRITE,True,processId);
// Выделяем блок памяти в чужом адресном пространстве
stringMemoryBlock := VirtualAllocEx(processHandle,nil,libSize,MEM_COMMIT,PAGE_READWRITE);
if (stringMemoryBlock <> nil) then ShowMessage('Блок памяти выделен');
// Копируем строку в адресное пространство процесса
if (WriteProcessMemory(processHandle,stringMemoryBlock,libAddr,libSize,writtenProc) <> FALSE) then ShowMessage('Блок памяти записан');
// Получаем адрес LoadLibraryA в kernel32
aThreadAdress := GetProcAddress(GetModuleHandle('kernel32'),'LoadLibraryA');
if (aThreadAdress <> nil) then ShowMessage('Адрес LoadLibraryA получен');
// Создаем удаленный поток
threadHandle := CreateRemoteThread(processHandle,nil,0,aThreadAdress,stringMemoryBlock,0,threadId);
if (threadHandle <> 0) then ShowMessage('Поток создан');
|