tags: windows - malware
Трюк с фейковым EP
Идея проста: После загрузки нашей программы, мы динамически меняем входную точку у загруженного PE образа на другой адрес в нашем коде (В этом примере на вызов messagebox). Поэтому, когда какой-нибудь реверсер сдампит наш файл, он получит модифицированный адрес точки входа и при его запуске поведение изменится. Этот трюк с заголовками PE я сделал для обучения своих студентов, чтобы они лучше поняли формат PE на практике на занятиях по анализу вредоносных файлов. Данный способ позволяет справиться с дампом от:
- Process Dump v2.1 (https://github.com/glmcdona/Process-Dump)
- OllyDumpEx
- Любого другого дампера, который парсит заголовок
Мы изменяем путь к файлу, чтобы добиться анти-анализа от Scylla.
format PE GUI 4.0
entry start
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; includes
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
include '%fasm%\INCLUDE\win32a.inc'
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
section '.text' code readable writeable executable
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; если файл был дампнут из памяти инструментом, который достает загруженный образ,
; то входная точка изменится на адрес этих инструкций
push 0
push szTitle
push szFuckOff
push 0
call [MessageBoxA]
push 0
call [ExitProcess]
start:
invoke GetModuleHandleA, 0 ;получаем imageBase
mov [mHandle], eax
mov ebx, eax ;сохраняем в ebx
add ebx, 0xa8 ;EP (входная точка)
invoke VirtualProtect, ebx, 4, PAGE_EXECUTE_READWRITE, Old
mov byte[ebx], 0x00 ;Меняем EP на адрес кода с messagebox
invoke VirtualProtect, ebx, 4, PAGE_EXECUTE_READ, Old
; Теперь мы переименовываем файл, чтобы Scylla не смогла найти его на диске (MoveFileA)
invoke GetModuleFileNameA,0,szfileName, 255 ; возвращаем длину в eax
add eax, szfileName ; eax теперь в конце имени PE файла
;Делаем поиск до перового символа '\' с конца, чтобы получить имя файла
@@:
dec eax
cmp byte[eax],'\'
jne @B
inc eax ;пропускаем слеши
mov ebx, eax ;сохраняем, чтобы переименовать файл снова
invoke MoveFileA, eax, tmpName, NULL
;нормальное поведение, просто messagebox, если файл дампается тут, то наша ловушка активируется
push 0
push szTitle
push szExample
push 0
call [MessageBoxA]
;переименовываем на оригинальное имя
invoke MoveFileA, tmpName, ebx, NULL
push 0
call [ExitProcess]
error:
push 0
call [ExitProcess]
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
section '.data' data readable writeable
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
szExample db 'Original file',0
szFuckOff db 'Hands off asshole',0
szTitle db 'Fake EP trick',0
mHandle dd ?
szfileName rb 250
tmpName db "1.exe",0
Old dd ?
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data import
library kernel,'KERNEL32.DLL',\
user32,'USER32.DLL'
import user32, MessageBoxA,'MessageBoxA'
import kernel, ExitProcess,'ExitProcess',\
GetModuleHandleA,'GetModuleHandleA',\
GetModuleFileNameA,'GetModuleFileNameA',\
MoveFileA,'MoveFileA',\
VirtualProtect,'VirtualProtect'
end data
Вверх