Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с внедрением библиотеки  (Прочитано 6043 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zaynyatyi
Гость
« : 05-01-2009 08:37 » 

Пытаюсь внедрить библиотеку в процесс, но вылетает окно системной ошибки с предложением отправить отчет. Исходник взял с www.rsdn.ru, немного поправил но несущественно:
Код:
BOOL InjectDll (HANDLE hProcess, char* lpszDllName)
{
BYTE* p_code;
INJECTORCODE cmds;
DWORD wr, id;

//зарезервировать память в процессе
p_code = (BYTE*)VirtualAllocEx(hProcess, 0, sizeof(INJECTORCODE), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if(p_code==NULL)
    {
MessageBox(NULL, "Unable to alloc memory in remote process", "Error!", 0);
return FALSE;
    }

//инициализировать  машинный код
cmds.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
cmds.loadlibrary_arg = (DWORD)(p_code + offsetof(INJECTORCODE, libraryname));
cmds.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
cmds.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(INJECTORCODE, addr_loadlibrary));
cmds.instr_push_exitthread_arg  = 0x68;
cmds.exitthread_arg = 0;
cmds.instr_call_exitthread = 0x15ff;
cmds.adr_from_call_exitthread = (DWORD)(p_code + offsetof(INJECTORCODE, addr_exitthread));
cmds.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
cmds.addr_exitthread  = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread");
if(strlen(lpszDllName)>99)
{
MessageBox(NULL, "Dll Name too long", "Error!", 0);
return FALSE;
}
strcpy((char*)cmds.libraryname, lpszDllName );
//записать машинный код по зарезервированному адресу
WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);
//выполнить машинный код
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (unsigned long (__stdcall *)(void *))p_code, NULL, 0, &id);
//HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (DWORD (__stdcall *)(void*))p_code, NULL, 0, &id);
//ожидать завершения удаленного потока
WaitForSingleObject(hThread, INFINITE);
//освободить память
if (hThread == NULL)
{
return FALSE;
}
VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);
CloseHandle(hThread);
return TRUE;
}

ну а вызывается функция:
Код:
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;

int main ( int argc, char* argv[] )
{
ZeroMemory(&StartInfo, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);
CreateProcess (NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &StartInfo, &ProcInfo);
Sleep(2000);
InjectDll(ProcInfo.hProcess, "TestDll.dll");
return 0;
}

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-01-2009 10:20 » 

zaynyatyi, ну так...

1. На фига ссылка, если она не ведет к оригинальному коду?
2. Если сам поправил, то, наверно, и отладчиком пользоваться умеешь?
3. Форматирование кода достойное троешника (но это уже лирика).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zaynyatyi
Гость
« Ответ #2 : 05-01-2009 12:43 » 

С ссылкой действительно сглупил
Два процесса ещё не отлаживал
Если честно с форматированием у меня всегда было туго, обещаю исправится
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 05-01-2009 13:31 » 

Так что ты там поправил?
Нельзя в текущий процесс сделать в ставку?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines