Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2013, 15:04   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас есть хендл уже между прочим, выкиньте OpenProcess, и кто будет проверять результат функций?(вас OpenProcess посылает же)

далее, ваш поток работать не будет, строка между прочим в вашем потоке, а не в чужом.
я же давал ссылку на книгу, там рассписано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.02.2013, 17:29   #12
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Про VirtualAllocEx да забыл,это у Рихтера написано. А вот насчет OpenProcess не пойму, как же без него? У нас CreateProcess отправляет в структуру pi идентификатор (PID),а нужно получить дескриптор (хэндл) процесса и подставить его в CreateRemoteThread. Почему же надо выкидывать OpenProcess?
calypso вне форума Ответить с цитированием
Старый 25.02.2013, 23:07   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
Почему же надо выкидывать OpenProcess?
Почитайте документацию на PROCESS_INFORMATION...
waleri вне форума Ответить с цитированием
Старый 27.02.2013, 15:43   #14
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Получилось вот что.Сам загрузчик:
Код:
void __fastcall TForm14::Button1Click(TObject *Sender)
{
wchar_t* biblioteka=L"E:\\WorkSoft\\Election Day\\VMManager.dll";
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi,sizeof(pi));
//StringToWideChar(dumpfolder,Wdump,30);
//Открываем файл дампа (создаем процесс) с минимальным набором модулей
CreateProcess(L"E:\\WorkSoft\\Election Day\\Program1.exe",NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);
int oshibka=GetLastError();
ShowMessage(IntToStr(oshibka));
//Открываем процесс в памяти (получаем его хэндл)
HANDLE dumphand=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId);
if (dumphand==NULL) {
				  ShowMessage("Произошла ошибка при открытии процесса!");
}
int cch=1+lstrlenW(biblioteka);
int cb=cch*sizeof(wchar_t);
PWSTR pszLibFileRemote=(PWSTR)VirtualAllocEx(dumphand,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
if (pszLibFileRemote==NULL) {
						  ShowMessage("Ошибка при выделении памяти под имя DLL");
}
WriteProcessMemory(dumphand,pszLibFileRemote,(PVOID)biblioteka,cb,NULL);
//Получаем адрес в памяти функции LoadLibraryW в модуле KERNEL32
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW");
//Создаем поток в чужом процессе (инжектирование DLL),pszLibFileRemote - указатель на выделенную память имени DLL
HANDLE potok=CreateRemoteThread(dumphand,NULL,0,pfnThreadRtn,pszLibFileRemote,0,NULL);
//возобновляем первичный поток процесса,созданного в режиме SUSPENDED
ResumeThread(dumphand);
}
Загрузчик работает (доходит до DLL_ATTACH).Проблема при выполнении кода инжектируемой DLL:
Код:
library VMManager;

uses
  System.SysUtils,
  System.Classes,
  Windows,
  Vcl.Dialogs;


{$R *.res}

//входная точка DLL
procedure DLLEntryPoint(dwReason:DWORD);
var
modulename:PChar;
sectionname,libname: PWideChar;
dumphandle,vmhandle,vmmapping,libhandle:hFile;
sectionsize,libsize:int64;
  oshibka,offset,startaddr:int64;
  name_len,zapisano:DWORD;
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
     //код при инициализации DLL
     ShowMessage('Библиотека успешно загружена и проинициализирована!');
     libname:='E:\WorkSoft\Election Day\audiere.dll';
     libhandle:= CreateFile(libname,GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE,FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
     libsize:=GetFileSize(libhandle,0);
     startaddr:=$03000000;
     //startaddr:=$004D0000;
     modulename:='E:\WorkSoft\Election Day\audiere.dll';
     //dumphandle:=GetModuleHandle(modulename);
     oshibka:=GetLastError;
     ShowMessage('Получили хэндл '+ IntToStr(oshibka));
     //VirtualAllocEx(dumphandle,Pointer(startaddr),libsize,MEM_COMMIT,PAGE_READWRITE);
     VirtualAlloc(Pointer(startaddr),libsize,MEM_COMMIT,PAGE_READWRITE);
     LoadLibrary(libname);
     sectionname:='C:\Dump_00E66000_00C80000.bin';
     offset:=$40000000;
     //открываем секцию на диске
     vmhandle:=CreateFile(sectionname,GENERIC_READ or GENERIC_WRITE or GENERIC_EXECUTE,FILE_SHARE_READ or FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
     //получаем размер секции (нужен виртуальный размер??)
     sectionsize:=GetFileSize(vmhandle,0);
     //создаем проекцию блока памяти
     vmmapping:=CreateFileMapping(vmhandle,0,PAGE_EXECUTE_READWRITE,0,sectionsize,0);
     //проецируем данные по адресу offset
     MapViewOfFileEx(vmmapping,FILE_MAP_ALL_ACCESS,0,0,0,Pointer(offset));
     end;
    DLL_PROCESS_DETACH:
    begin
     //код при выгрузке DLL из памяти
    end;
  end;
end;
begin
//запуск библиотеки (можно сюда сразу написать код,или указать процедуру DLL_PROCESS_ATTACH)
DllProc:=@DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
При нахождении на DLL_ATTACH видимо не определены адреса функций из kernel32.Или сам модуль не загружен. Как тут правильно сделать?
calypso вне форума Ответить с цитированием
Старый 27.02.2013, 17:30   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Так проверьте - создайте процесс обычным а не suspended подождите пару секунд и попробуйте - тогда kernel32 дожен быть загружен.

А в чем собственно состоит проблема?
waleri вне форума Ответить с цитированием
Старый 27.02.2013, 17:37   #16
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Для чего нужно именно SUSPENDED? Чтобы родительский процесс (т.е. мой лоадер) мог изменить память процесса дочернего (который приостановлен и которого мы стартуем через ResumeThread).
В данном исходнике задача - поменять адрес загрузки audiere.dll

PS Не в ту степь похоже опять залезли.С кернел32 всё нормально,а проблема в CreateFile - возникает нарушение совместного доступа т.к. файл одним процессом открыт только на чтение,а я его пытаюсь открыть на чтение+запись

Последний раз редактировалось calypso; 27.02.2013 в 20:45.
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AppInit_DLLs и инжект в определенный процесс nls Win Api 2 01.02.2013 09:17
Hibernate. Java. Загрузить список только из одного поля таблицы KBI Java Базы данных (JDBC, JPA, Hibernate) 1 26.07.2012 19:32
Загрузить библиотеку вместе сразу вместе с программой Anekdot Общие вопросы Delphi 4 26.01.2010 23:14
Загрузить процесс в память, но не допустить запуска Crivel Общие вопросы Delphi 8 28.05.2009 11:17
Как загрузить свою DLL в атакуемый процесс, который не знает о ее существовании - Создание хуков KleoY Win Api 18 30.03.2009 14:31