
08.08.2008, 15:08
|
|
Новичок
Регистрация: 13.06.2008
Сообщений: 24
С нами:
9426701
Репутация:
4
|
|
Это не метод криса. Это стандартный метод применяемый в вирусах. Только с той разницей что в вирусах не используется плейн название ф-ций а их хеш 32. Полиномы не стоит пробовать для хеширования новые подбирать - все нормальные уже посчтитали. Почитай статьи билли из 29а, на васме есть в вирмейкинге.
|
|
|

08.08.2008, 20:01
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами:
9489537
Репутация:
136
|
|
w_2k на сайте калашникова в какомто уроке есть перехват прерывания
Последний раз редактировалось 0verbreaK; 08.08.2008 в 20:17..
|
|
|

08.08.2008, 20:24
|
|
Новичок
Регистрация: 23.07.2008
Сообщений: 28
С нами:
9369687
Репутация:
1
|
|
О! Нашёл:-) Ток не совсем всё понял)
Код:
Init:
mov ah,35h
mov al,21h
int 21h
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
mov ax,2521h
mov dx,offset Int_21h_proc
int 21h
mov dx,offset Init
int 27h
Это тоже в памяти будет?
з.ы. Не совсем понял с подменой регистров в основной процедуре,ведь адрес прерывания в переменной, а там регистры в стек/из стека
Последний раз редактировалось w_2k; 08.08.2008 в 20:26..
|
|
|

08.08.2008, 22:21
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами:
9489537
Репутация:
136
|
|
w_2k Справочник Ральфа Брауна + Оля в руки и исследуй )
|
|
|

12.08.2008, 23:30
|
|
Познающий
Регистрация: 02.08.2008
Сообщений: 55
С нами:
9354619
Репутация:
30
|
|
Пробовал все что советовали по скрытию апи, всеравно палится антивирями. Вот только руки не дошли до 29а.
Еще есть способ выташить апи через SEH:
----------------------------------
Код:
.386
.model flat,stdcall
option casemap:none
INCLUDE \masm32\include\windows.inc
INCLUDE \masm32\include\comdlg32.inc
INCLUDELIB \masm32\lib\comdlg32.lib
; ------ STRUCTS ------
sSEH STRUCT
OrgEsp DD ?
OrgEbp DD ?
SaveEip DD ?
sSEH ENDS
; ------ EQU'S ------
MIN_KERNEL_SEARCH_BASE EQU 070000000h
MAX_API_STRING_LENGTH EQU 150
; ------ CONST ------
.CONST
szLoadLibrary DB "LoadLibraryA",0
szGetProcAddress DB "GetProcAddress",0
szExitProcess DB "ExitProcess",0
szUser32 DB "user32",0
szMessageBox DB "MessageBoxA",0
szwsprintf DB "wsprintfA",0
szInfoCap DB "- Kernel -",0
szInfoText DB "The following information were obtained",13,10
DB "without the help of an Import Table !",13,10
DB 13,10
DB "Kernel32.dll ImageBase: 0x%08lX",13,10
DB "User32.dll ImageBase: 0x%08lX",13,10
DB 13,10
DB "API Addresses:",13,10
DB "LoadLibraryA: 0x%08lX",13,10
DB "GetProcAddress: 0x%08lX",13,10
DB "ExitProcess: 0x%08lX",13,10
DB 13,10
DB "MessageBoxA: 0x%08lX",13,10
DB "wsprintfA: 0x%08lX",0
; ------ DATA ------
.DATA
_LoadLibrary DD 0
_GetProcAddress DD 0
_ExitProcess DD 0
_MessageBox DD 0
_wsprintf DD 0
cBuff DB 200 DUP (0)
SEH sSEH <0>
dwKernelBase DD 0
dwUserBase DD 0
; ------ CODE ------
.CODE
main:
ASSUME FS : NOTHING
;INT 3
;---- GET ImageBase of kernel32.dll ----
PUSH [ESP]
CALL GetKernelBase
OR EAX, EAX
JZ QUIT
MOV dwKernelBase, EAX
;---- GET SOME KERNEL API ADDRESSES ----
;-> LoadLibraryA
PUSH OFFSET szLoadLibrary
PUSH dwKernelBase
CALL GetProcAddr
OR EAX, EAX
JZ QUIT
MOV _LoadLibrary, EAX
;-> GetProcAddress
PUSH OFFSET szGetProcAddress
PUSH dwKernelBase
CALL GetProcAddr
OR EAX, EAX
JZ QUIT
MOV _GetProcAddress, EAX
;-> ExitProcess
PUSH OFFSET szExitProcess
PUSH dwKernelBase
CALL GetProcAddr
OR EAX, EAX
JZ QUIT
MOV _ExitProcess, EAX
;---- LOAD USER32.DLL ----
PUSH OFFSET szUser32
CALL _LoadLibrary
OR EAX, EAX
JZ QUIT
MOV dwUserBase, EAX
;---- GET SOME USER API ADDRESSES ----
;-> MessageBoxA
PUSH OFFSET szMessageBox
PUSH dwUserBase
CALL GetProcAddr
OR EAX, EAX
JZ QUIT
MOV _MessageBox, EAX
;-> wsprintfA
PUSH OFFSET szwsprintf
PUSH dwUserBase
CALL GetProcAddr
OR EAX, EAX
JZ QUIT
MOV _wsprintf, EAX
;---- BUILD AND SHOW THE INFORMATION MSG ----
PUSH _wsprintf
PUSH _MessageBox
PUSH _ExitProcess
PUSH _GetProcAddress
PUSH _LoadLibrary
PUSH dwUserBase
PUSH dwKernelBase
PUSH OFFSET szInfoText
PUSH OFFSET cBuff
CALL _wsprintf
ADD ESP, (9 * SIZEOF(DWORD))
PUSH MB_ICONINFORMATION OR MB_SYSTEMMODAL
PUSH OFFSET szInfoCap
PUSH OFFSET cBuff
PUSH 0
CALL _MessageBox
;---- EXIT ----
CALL _ExitProcess ;)
QUIT:
RET ; exit to OS
;---- AN UNUSED IMPORT ----
; The Win32 Loader of Win2k (maybe also of WinNT) won't call the EntryPoint of files which don't
; have an Import Table :(
; So here's an unused Import to make MASM compile an Import Table.
PUSH NULL
CALL GetOpenFileName
; ------ ROUTINES ------
; returns NULL in the case of an error
GetKernelBase PROC USES EDI ESI, dwTopStack : DWORD
; install SEH frame
PUSH OFFSET SehHandler
PUSH FS:[0]
MOV SEH.OrgEsp, ESP
MOV SEH.OrgEbp, EBP
MOV SEH.SaveEip, OFFSET ExceptCont
MOV FS:[0], ESP
; start the search
MOV EDI, dwTopStack
AND EDI, 0FFFF0000h ; wipe the LOWORD !
.WHILE TRUE
.IF WORD PTR [EDI] == IMAGE_DOS_SIGNATURE
MOV ESI, EDI
ADD ESI, [ESI+03Ch]
.IF DWORD PTR [ESI] == IMAGE_NT_SIGNATURE
.BREAK
.ENDIF
.ENDIF
ExceptCont:
SUB EDI, 010000h
.IF EDI < MIN_KERNEL_SEARCH_BASE
MOV EDI, 0BFF70000h
.BREAK
.ENDIF
.ENDW
XCHG EAX, EDI
; shutdown SEH frame
POP FS:[0]
ADD ESP, 4
RET
GetKernelBase ENDP
; returns address or NULL in the case of an error
GetProcAddr PROC USES ESI EDI ECX EBX EDX, dwDllBase : DWORD, szApi : LPSTR
; install SEH frame
PUSH OFFSET SehHandler
PUSH FS:[0]
MOV SEH.OrgEsp, ESP
MOV SEH.OrgEbp, EBP
MOV SEH.SaveEip, OFFSET @@BadExit
MOV FS:[0], ESP
; check PE Signarue
MOV ESI, dwDllBase
CMP WORD PTR [ESI], IMAGE_DOS_SIGNATURE
JNZ @@BadExit
ADD ESI, [ESI+03Ch]
CMP DWORD PTR [ESI], IMAGE_NT_SIGNATURE
JNZ @@BadExit
; get the string length of the target Api
MOV EDI, szApi
MOV ECX, MAX_API_STRING_LENGTH
XOR AL, AL
REPNZ SCASB
MOV ECX, EDI
SUB ECX, szApi ; ECX -> Api string length
; trace the export table
MOV EDX, [ESI+078h] ; EDX -> Export table
ADD EDX, dwDllBase
ASSUME EDX : PTR IMAGE_EXPORT_DIRECTORY
MOV EBX, [EDX].AddressOfNames ; EBX -> AddressOfNames array pointer
ADD EBX, dwDllBase
XOR EAX, EAX ; EAX AddressOfNames Index
.REPEAT
MOV EDI, [EBX]
ADD EDI, dwDllBase
MOV ESI, szApi
PUSH ECX ; save the api string length
REPZ CMPSB
.IF ZERO?
ADD ESP, 4
.BREAK
.ENDIF
POP ECX
ADD EBX, 4
INC EAX
.UNTIL EAX == [EDX].NumberOfNames
; did we found sth ?
.IF EAX == [EDX].NumberOfNames
JMP @@BadExit
.ENDIF
; find the corresponding Ordinal
MOV ESI, [EDX].AddressOfNameOrdinals
ADD ESI, dwDllBase
PUSH EDX ; save the export table pointer
MOV EBX, 2
XOR EDX, EDX
MUL EBX
POP EDX
ADD EAX, ESI
XOR ECX, ECX
MOV WORD PTR CX, [EAX] ; ECX -> Api Ordinal
; get the address of the api
MOV EDI, [EDX].AddressOfFunctions
XOR EDX, EDX
MOV EBX, 4
MOV EAX, ECX
MUL EBX
ADD EAX, dwDllBase
ADD EAX, EDI
MOV EAX, [EAX]
ADD EAX, dwDllBase
JMP @@ExitProc
ASSUME EDX : NOTHING
@@BadExit:
XOR EAX, EAX
@@ExitProc:
; shutdown SEH frame
POP FS:[0]
ADD ESP, 4
RET
GetProcAddr ENDP
SehHandler PROC C pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD
MOV EAX, pContext
ASSUME EAX : PTR CONTEXT
PUSH SEH.SaveEip
POP [EAX].regEip
PUSH SEH.OrgEsp
POP [EAX].regEsp
PUSH SEH.OrgEbp
POP [EAX].regEbp
MOV EAX, ExceptionContinueExecution
RET
SehHandler ENDP
end main
--------------------------
вот только как бы я его не изменял, не упаковывал, не шифровал все равно палится анти вирями. Шифровал XORом. Что посоветуете?
Последний раз редактировалось Juda; 12.08.2008 в 23:42..
|
|
|

18.08.2008, 20:58
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами:
9489537
Репутация:
136
|
|
Juda
1) не храни строки в открытом виде
2) можно использовать адреса API
3) контрольные суммы функций
4) измени инструкции на подобные
5) морфи код
|
|
|

23.08.2008, 13:10
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
С нами:
9489537
Репутация:
136
|
|
Также есть вариант (может уже был озвучен, но приведу все равно) получение базы кернела (kernel32.dll) через адрес возврата, после загрузки программы в отладчик
на верхушке стека лежита адрес возврата на kernel32.dll
Следующая картина:
Код:
0012FFC4 77E7EB69 RETURN to kernel32.77E7EB69
0012FFC8 00000007
0012FFCC 00566ED0
0012FFD0 7FFDF000
0012FFD4 F4262CF4
0012FFD8 0012FFC8
0012FFDC 80536A0E
0012FFE0 FFFFFFFF End of SEH chain
0012FFE4 77E9BB86 SE handler
Используем следующий код для получения базы
Код:
start:
pop ebp ;Return to kernel32.dll
; (ошибка) адрес внутри кернела
Используя таблицу экспорта можно искать API функции по ординалу, просмотри в иде
таблицу экспорта, в ней можно получить адреса API функций и их ординалы, достаточно дизассемблировать kernel32.dll
Последний раз редактировалось 0verbreaK; 23.08.2008 в 16:28..
|
|
|

23.08.2008, 13:45
|
|
Познающий
Регистрация: 08.08.2008
Сообщений: 55
С нами:
9346084
Репутация:
54
|
|
после загрузки программы в отладчик на верхушке стека лежита адрес возврата на kernel32.dll
не обязательно в отладчик
; т.е. мы извлекаем базу кернела
не базу, а какойто адрес внутри kernel32.dll
можно искать API функции по ординалу
ненадежно, ординал может отличатся в зависимости от весии библиотеки, лучше по хешу от имени
|
|
|

26.08.2008, 23:41
|
|
Новичок
Регистрация: 23.07.2008
Сообщений: 28
С нами:
9369687
Репутация:
1
|
|
Народ, кто нить подскажите плиз простейший генератор чисел в 16 битах? Пытался использовать миллисекунды, но функция 2c прерывания 21 ничего не возвращает 
|
|
|

26.08.2008, 23:53
|
|
Постоянный
Регистрация: 05.01.2007
Сообщений: 508
С нами:
10182506
Репутация:
1393
|
|
Сообщение от w_2k
Народ, кто нить подскажите плиз простейший генератор чисел в 16 битах? Пытался использовать миллисекунды, но функция 2c прерывания 21 ничего не возвращает 
тебе нужен код генерации псевдо-случайных чисел для дос?
|
|
|
|
 |
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
Вопросы для новичков! (faq)
|
PEPSICOLA |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
92 |
14.05.2010 17:59 |
|
ОС с нуля
|
z01b |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
36 |
03.07.2008 15:30 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|