Показать сообщение отдельно
  #9  
Старый 23.02.2012, 17:34
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 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('Поток создан');
Ответить с цитированием