Пробую писать маленький шелл. Все адреса нужных функций в стеке адресация по ebp. Поиск функций в кернеле по известному их хешу из заготовленной. Хеш для каждого имени ищу по такому алгоритму -> Код (Text): main: invoke GetCL,1,addr string_; возьмем первый аргумент командной строки .if eax == 1 ; если нет ни одного аргумента выход .else ; вывод сообщения о правилах использования invoke StdOut,addr Error1 jmp _Exit .endif xor esi,esi mov esi,offset string_ _GetHash: xor eax,eax push eax _CalcHash: ror eax,7 xor [esp],eax lodsb test al,al jnz _CalcHash pop eax xor ebx,ebx mov ebx,eax invoke RtlZeroMemory,ADDR buffer,256 invoke wsprintf,addr buffer,addr template,addr string_, ebx invoke StdOut, addr buffer _Exit: ret end main Сам алгоритм взял тут же у кого-то из раздела "Вирусология" Проблема - две функции имеют одинаковый хеш: Код (Text): CreateFileMapping : 0x9CA63AEAh NlsConvertIntegerToString : 0x9CA63AEAh Сам в математике не силен, теорию чисел пока не изучаем Пожалуйста подскажите еще другие простые алгоритмы нахождения хеш-ей строк. Спасибо.
Попробуйте так разнообразить код: ... mov cl, al ror eax, cl ... На самом деле, коллизии неизбежны. Вопрос только в том, будут они для вашего набора символов или нет
хэш функция - это любая функция, позволяющая однозначно уменьшить неплотное множество больших чисел в сторону повышения плотности. чем меньше коллизий, тем хэш функция лучше. на практике, для 100% отсутствия коллизий это подбирается. для начала нужен словарь всех слов/срок (больших чисел) для которых вы хотите считать хэш без коллизий. ваше максимальное хэш-число должно быть > общего количества ваших строк. далее, вы пишете свои функции или берете готовые, или берете готовые, а потом модифицируете их сами. и прогоняете по вашему списку. не возникнет коллизий - функция найдена.
7mm qqwe Спасибо, будем перебирать. Придется видно перебирать все строки из kernell32.dll Их там примерно около 1000 значит разрядов у хеша должно быть 10. 2^10 = 1024, А у меня (0x9CA63AEAh) как видно - 8, значит коллизии очень вероятны Еще раз спасибо за разъяснение. Кстати статья (http://ru.wikipedia.org/wiki/%D0%A5%D0% … 1%86%D0%B0), таки, доходчиво написана, извините.
_sheva740 ..ваше хэш-число будет колебаться от 0 до >999. 1024 это 10 разрядов. те, в 2 байта должно влезть.
http://blog.harmonysecurity.com/2009/08/calling-api-functions.html Вот тут ещё посмотрите, там авторы используют хеш-функцию наподобие вашей. В конце статьи про коллизии речь идёт - типа на частоиспользуемых библиотеках коллизий не зафиксировано. На самом деле, не совсем понятно, зачем вам сильная хеш-функция, если обычно требуется найти пару-тройку символов, типа VirtualAlloc Смысл же всей этой затеи с хешами имён - это сокращение размера кода и исключение мозолящих глаза строк типа GetProcAddress ))
qqwe сознаю, пупанул. 7mm немного не понял, ну как зачем, не писать же мне открыто имена этих функций. Можно конечно вся кое шифрование, но код так разростается что мне показалось разумным именно выбрать старый путь получения адресов. Да мне вот этот список хотелось Код (Text): CloseHandle_ FindFirstFileA_ FindNextFileA_ CreateFileA_ CreateFileMapping_ MapViewOfFile_ GetFileSize_ UnmapViewOfFile_ VirtualProtect_ ExitProcess_ SetCurrentDirectoryA_ ... а их я из kernell32.dll все нахожу.
А в чём разница, используете вы, например, строку "CloseHandle", или подставляете вместо неё хеш? С точки зрения обнаружения -- и то, и то определённая сигнатура Одно только использование хешей не поможет вам избежать детекта.
согласен, не избавит. Ну тогда, как вариант, - все находится открыто (без всяких хэш-ей) но сверху все покрыть xor - ом. Да просто так вот наметил себе с этим хешем и уперся. Теперь действительно развилка или добить с ним или отказаться а подумать о шифровании.
_sheva740 А без хэша никак? например CloseHandle из kernel32 содержит внутри ZwClose из ntdll внутри которого, по крайней мере для WinXP Код (Text): mov eax,19h mov edx,esp int 2Eh и шифруйте себе на здоровье
Mikl___ ... ооо шайтан, не ребята так далеко я пока не заплываю, глубины боюсь. )) Мне бs хоть одно до конца довести (насладиться прелестью завершенного действа ), а потом непременно вернемся к написанию шелов -вирей через native-api.
взял crc16, все вроде нормально Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib ;-------------------------------------------------------- .data szAPIname BYTE 0 BYTE "CloseHandle",0 BYTE "CreateFileA",0 BYTE "CreateFileMappingA",0 BYTE "ExitProcess",0 BYTE "FindFirstFileA",0 BYTE "FindNextFileA",0 BYTE "GetFileSize",0 BYTE "MapViewOfFile",0 BYTE "SetCurrentDirectoryA",0 BYTE "UnmapViewOfFile",0 BYTE "VirtualProtect",0,0,0 template db "%s_ dd 0%ph",13,10,0 ;шаблон buffer db 256 dup( 0 ) ;для вывода ;-------------------------------------------------------- .code main: lea esi, szAPIname ___load_next_name: lodsb test al, al jnz ___load_next_name mov al, BYTE PTR [esi] test al, al jz __ListDone ;-------------------------------------------------------- ; from Win32.Kriz.asm ; ESI = ASCIIZ / returns AX = CRC16. ;-------------------------------------------------------- Calculate_CRC16: push edx push esi push 0FFFFFFFFh pop edx cld Load_Character: lodsb or al, al jz Exit_Calc_CRC xor dl, al mov al, 8 CRC_Byte: shr edx, 1 jnc Loop_CRC_Byte xor edx, 0EDB88320h Loop_CRC_Byte: dec al jnz CRC_Byte jmp Load_Character Exit_Calc_CRC: xchg edx, eax pop esi pop edx ;-------------------------------------------------------- xor ebx,ebx mov ebx,eax invoke RtlZeroMemory,ADDR buffer,256 invoke wsprintf,addr buffer,addr template,esi, ebx invoke StdOut, addr buffer jmp ___load_next_name __ListDone: invoke ExitProcess,0 ret end main ;--------------------------------------------------------
_sheva740, Вообще говоря, это CRC32. Побитно он небыстрый (из-за partial EFLAGS и по мелочам). С 1 KiB таблицей можно брать CRC32 от первых восьми байт без цикла, может хватить.
Спасибо, не знал , а можно и int 2Eh и call ds:[7FFE0300h] Я имел в виду число, которое передается в eax