PDA

Просмотр полной версии : [Информация] Пример инжекта кода в процесс на FASM


Nobody4all
12.07.2012, 20:42
Собсна примеры иньекции кода в сторонний процесс на C, Delphi есть - на FASM нету :forward:. А так я пишу на нём то, в общем пример внедрения кода на FASM.

Чуть подробней:
В данном примере демонстрируется иньекция необходимого нам кода в процесс elementclient - а именно кода показа пвшного уведомления "вы покинули безопасную зону" и "вы входите в безопасную зону" ну и вызов API MessageBoxA. Хочу заметить что перед вызовом API необходимо убедится что нужная нам библа подгружена, в противном случае LoadLibrary/GetProcAddress.

format pe gui 4.0
include 'F:\PATHFASM\inc\win32ax.inc'

IDC_BUTTON = 102

; секция данных
section '.data?' data readable writeable
hwnd dd ?
pid dd ?
did dd ?
hInstance dd ?
hmem dd ?


; Код под иньекцию
ElemProc:

; появляется надпись "вы покинули безопасную зону" когда с писа выходиш
mov ebx,$00432330
mov eax,[$924E0C]
push $40
mov ecx,[eax+$1C]
push ecx
call ebx

; появляется надпись "вы ВХОДИТЕ в безопасную зону. когда входиш в пис"
mov ebx,$00432330
mov ecx,[$924E0C]
push $3F
mov edx,[ecx+$1C]
push edx
call ebx

;; ;;
;;;; Пример вызовы MessageBoxA ;;;;
;; ;;

; Высчитываем дельта смещение
call $+5
pop esi
sub esi, $-ElemProc-1

; вызов мессейдж бокса
push 0
lea eax, [esi+param1-ElemProc]
push eax
lea eax, [esi+param2-ElemProc]
push eax
push 0
call [esi+p_MessageBox-ElemProc]

retn 4

; некоторые данные - текст для мессейджа и адресс апишки
p_MessageBox dd ?
param1 db 'Text',0
param2 db 'Caption',0

ElemSize = $-ElemProc ; ElemSize - размер внедряемого кода

; секция кода
section '.code' code readable writeable executable
entry $
invoke InitCommonControls
invoke GetModuleHandle, 0
mov [hInstance],eax
invoke DialogBoxParam, [hInstance], 1, HWND_DESKTOP, DialogProc, 0
invoke ExitProcess,0

proc DialogProc hwnddlg,umsg,wparam,lparam ; процедура окна
push ebx esi edi
cmp [umsg],WM_COMMAND
je .WMCOMMAND
cmp [umsg],WM_CLOSE
je .WMCLOSE
jmp .FINISH
jmp @f

.WMCOMMAND:
cmp [wparam],IDC_BUTTON
jnz .FINISH

mov eax, [MessageBox] ;
mov [p_MessageBox], eax ; сохроняем адресс функции MessageBoxA

invoke FindWindow,NULL,'Element Client' ; ищем окно PW
cmp eax,0
je @f
mov [hwnd],eax
invoke GetWindowThreadProcessId,[hwnd],pid ; получаем PID процесса
invoke OpenProcess, PROCESS_ALL_ACCESS, 0, [pid] ; открываем процесс c полными правами
test eax, eax
jz @F ; переход на метку с уведомлением о ошибке
mov [did],eax
invoke VirtualAllocEx,eax,0,ElemSize,MEM_COMMIT,PAGE_READ WRITE ; выделяем память
mov [hmem],eax ; сохроняем хендл
invoke WriteProcessMemory,[did],[hmem], ElemProc,ElemSize, 0 ; пишем в память наш код
invoke CreateRemoteThread,[did],0,0,[hmem],0,0,0 ; создаём нить
invoke WaitForSingleObject,eax,0 ; ждём завершения работы

invoke CloseHandle,[did] ; закрываем хендл
invoke VirtualFreeEx,[did],[hmem], 0, MEM_RELEASE ; освобождаем память занятую нами
jmp .FINISH
@@: ; в случае ерора (не удалось открыть процесс) - уведомляем
invoke MessageBox,0,'err','err',0
jmp .FINISH

.WMCLOSE:
invoke EndDialog,[hwnddlg],0
.FINISH:
mov eax,1
pop ebx esi edi
xor eax,eax
.ret:
ret
endp

; секция импорта
section '.idata' import data readable
library kernel32, 'kernel32.dll', \
user32, 'user32.dll', \
comctl32,'COMCTL32.DLL'
include 'F:\PATHFASM\inc\api\kernel32.inc'
include 'F:\PATHFASM\inc\api\user32.inc'
include 'F:\PATHFASM\inc\api\COMCTL32.inc'

; секция ресурсов - создаём стандартное окошко с 1 кнопочкой по нажатию которой будет происходить инжект
section '.rsrc' resource data readable
directory RT_DIALOG,dialogs
resource dialogs,1,LANG_RUSSIAN+SUBLANG_DEFAULT,TestDialog
dialog TestDialog,'Elem Inject / Nobody4all - forum Zhyk.ru',80,120,90,62, WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME+WS_MI NIMIZEBOX
dialogitem 'BUTTON','Inject', IDC_BUTTON, 15, 15, 55, 13, WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
enddialog

код посторался прокомментировать..

VeTaL_UA
12.07.2012, 23:45
Один из немногих людей, которые делают код сами :) Молодец, что не побоялся начинать на "неосвоенном" в этом разделе языке :) Благодарю за работу :)