;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Трюк с фейковым EP ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ; Идея проста: После загрузки нашей программы, мы динамически меняем входную точку у ; загруженного PE образа на другой адрес в нашем коде (В этом примере на вызов messagebox). ; ; Поэтому, когда какой-нибудь реверсер сдампит наш файл, он получит модифицированный адрес ; точки входа и при его запуске поведение изменится. Этот трюк с заголовками PE я сделал ; для обучения своих студентов, чтобы они лучше поняли формат PE на практике на занятиях ; по анализу вредоносных файлов. ; ; Данный способ позволяет справиться с дампом от: ; - Process Dump v2.1 (https://github.com/glmcdona/Process-Dump) ; - OllyDumpEx ; - Любого другого дампера, который парсит заголовок ; ; Мы изменяем путь к файлу, чтобы добиться анти-анализа от Scylla. ; ; SWaNk 2020 - VX ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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