Рассылка закрыта
При закрытии подписчики были переданы в рассылку "О карьере и профессиональном развитии IT-специалистов" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Сентябрь 2003 → | ||||||
1
|
2
|
3
|
4
|
6
|
7
|
|
---|---|---|---|---|---|---|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
24
|
25
|
26
|
27
|
28
|
|
29
|
30
|
Статистика
+11 за неделю
Низкоуровневое программирование для дZeнствующих # 0042
Информационный Канал Subscribe.Ru |
# Пролог
|
Имеется поддержка нескольких систем контроля версий (включая CVS). Возможностей пакета вполне хватает для конкуренции на равных с VS, а по некоторым параметрам - и превосходить. Что же мы имеем для работы с ассемблером? Легко настраивается подсветка синтаксиса, формата чисел. Возможность запуска внешних приложений с захватом и очень быстрым парсингом вывода - компилятора, например. При этом в случае ошибки к ней можно добраться одним щелчком. Есть поиск и замена. Для проекта на ассемблере есть дерево процедур в стиле MS VS, высвечиваются также глобальные переменные, макросы и структуры, правда, элементы структуры выводятся рядом, как независимые переменные (хотя для структур на C collapsing работает), и как это настроить для ассемблера, я так и не понял (возможно, скрипт переделывать).
4. Итак, последним по списку, но не по значению у меня Source Insight 3.5 (Source Dynamics, Inc.) Сайт - www.sourceinsight.com (Цена - $269).
При размере, на порядок меньшем (как у дистрибутива, так и в установленном виде), чем у SlickEdit функциональность не меньше, а порой и больше, чем у последнего. Хорошая настраиваемость, есть бейсикоподобный макроязык, но нет средств для коллективной работы (хотя я особо не искал). Интерфейс несколько отличается как от остальных, рассмотренных выше IDE, так и от VS. Что мне очень понравилось, так это то, что я могу видеть все процедуры, макросы, etc. как всего проекта, так и каждого файла по отдельности, плюс настроить, что именно я хочу видеть в данный момент - процедуры или константы, и т.д. Очень удобно сделан поиск по части названия (процедуры, например), а не по первым буквам.
Еще понравилась одна вещь, которой нет ни в одном IDE - Source Insight индексирует все мои структурные элементы программы и при наведении на них курсора, показывается нужный кусок кода внизу на панели. Для этой панели можно также задать ее размер и св-ва шрифта, но подсветка синтаксиса сохранится!
О подсветке синтаксиса тоже спою дифирамб - так, как ее можно настроить в Source Insight, я больше нигде не увидел в других продуктах. Очень удобно настраивается навигация по коду - я легко настроил ее как в броузере. Можно вывести статистику об используемых структурных элементах - об их встречаемости в проекте. Есть возможность вывести Relationship для процедур (надо сказать что для ассемблера эта функция работает, но несколько странновато результаты показаны). Для настройки парсинга локальных переменных пришлось написать регулярное выражение, правда, при этом включаются все локальные переменные файла, а не процедуры - не очень удобно, но терпимо. Зато при наборе любого текста появляется всплывающее меню autocompletion, при этом я могу пробежаться по предложенному списку, а все то же окошко внизу мне показывает первый десяток строк процедуры, например. Во время работы делается backup проекта, так что я практически застрахован от всяких неожиданностей, при аварийном завершении мне будет предложено восстановить работу на том месте, где ее прервал сбой. Кнопки сборки и запуска проекта идентичны кнопкам в VS. Из минусов, хоть и не критичных - долгий парсинг вывода, но зато я опять же могу не переходя сразу к коду, просмотреть первые строчки, при парсинге сразу же идет переход к первой ошибке (если они есть). Еще одна приятная мелочь - при печатании выражения, в котором есть несколько вложенных скобок, внешние становятся больше внутренних и сразу видна вложенность (хотя для ассемблера это не часто встречается). Еще одна немаловажная особенность, которой я больше нигде не видел, это подсвечивание строк, в которых произошли изменения - т.е. сразу можно увидеть, что и где я за этот сеанс изменил. Фактически, мне Source Insight напомнил улучшенный вариант VS + Visual Assist, и пока я свой выбор остановил на этом продукте.
4. Заключение
Данная статья отнюдь не претендует ни на полноту описания программ (это объем хорошей книги), ни на объективность, так как это только мое личное мнение. Нынешним и будущим авторам IDE также не стоит воспринимать все вышесказанное, как инструкцию о том, каким должно быть IDE, потому что я, например, после знакомства с Source Insight и не подозревал, как могут пригодиться те, казалось бы, мелочи, которые там есть.
В заключение скажу, что хотя Source Insight меня устраивает больше всего, окончательный выбор я еще не сделал, и верю, что возможно лучшее решение...
Sars
Поиск адресов API в win95-XP
Введение
На эту "избитую" тему написано уже много статей, но представлю
на ваше обозрение еще одну.
Кстати, в этой статье вы не найдете подробного описания полей PE заголовка
и технологии поиска API, предполагается, что в этом вы уже разбираетесь. Так
же не буду останавливаться на очевидных моментах, это уже тысячу раз перетиралось.
Итак, особенности этой статьи заключаются в следующем:
- Код, рассмотренный в данной статье, будет работать на платформах win95-XP, за счет получения Image Base кернела не со стека, а через анализ SEH.
- Для поиска имени API-функции, код использует хеш от имени этой ф-ии. Это не бросается в глаза при рассмотрении зараженного файла в HEX Editor'е, в случае незашифрованного вируса, а так же сокращает размер кода.
- В коде нет переменных, адреса API-функций и другие нужные нам значения помещаются в стек, что бывает полезным в том случае, когда ваш вирус не должен производить запись в переменные до извлечения адресов API.
Итак поехали... (сначала код, потом комментарии)
Start:
Call _Delta
_Delta:
sub dword ptr [esp], offset _Delta
Теперь в стеке находится дельта смещение кода, можно в этом примере не использовать, но мне так захотелось.
_ReadSEH:
xor edx,edx
mov eax,fs:[edx]
dec edx_SearchK32:
cmp [eax],edx
je _CheckK32
mov eax,dword [eax]
jmp _SearchK32_CheckK32:
mov eax,[eax+4]
xor ax,ax
По адресу fs:0, находится seh, цепочка адресов на обработчики исключений. Формат одной записи таков:
next_handler dd ? ; указатель на следующую такую же запись
seh_handler dd ? ; адрес обработчика исключения
Последний указатель на следующую запись имеет маркировку 0FFFFFFFFh, а адрес последнего обработчика находится где-то в kernel. В общем, глядите в отладчик, мы нашли адрес последнего обработчика, а значит и адрес внутри kernel. Дальше выравним полученный адрес на 64 Кбайта, т.к. kernel грузится по адресу кратному этому значению. Теперь нам осталось найти Image Base пресловутого и небезызвестного кернела. Делается это путем поиска сигнатуры MZ и проверки на PE формат...
_SearchMZ:
cmp word ptr [eax],5A4Dh
je _CheckMZ
sub eax,10000h
jmp _SearchMZ
_CheckMZ:
mov edx,[eax+3ch]
cmp word ptr [eax+edx],4550h
jne _Exit
Так, теперь сравним слово по полученному адресу с 'MZ', если не совпало, то отнимем 64Кбайта, и повторим, если совпало, то проверим это заголовок PE или нет. Если да, то можно утверждать, что Image Base Kernel найден, если нет, то выйдем. Существует ли вероятность не найти Kernel? При использовании seh, навряд ли, по крайней мере, я этого не наблюдал при тестировании. В случае, когда адрес внутри Kernel берется со стека, заводится счетчик, чтоб не вылезти черт знает куда, но это описано в др. статьях. Для перестраховки можно завести свой обработчик исключений.
_SearchAPI:
mov esi,[eax+edx+78h] ;Export Table RVA
add esi,eax ;Export Teble VA
add esi,18h
xchg eax,ebx
lodsd ;Num of Name Pointers
push eax
lodsd ;Address Table RVA
push eax
lodsd ;Name Pointers RVA
push eax
add eax,ebx
push eax ;Index
lodsd ;Ordinal Table RVA
push eax
mov edi,[esp+4*5] ;Delta offset
lea edi,[edi+HeshTable]
mov ebp,esp
Здесь я не буду заострять особого внимания, почему, читайте выше. (см. документацию по PE формату).
В результате выполнения первых двух строк, в esi мы получили смещение таблицы экспорта кернела. Далее мы получаем другие необходимые нам значения для поиска адресов API из таблицы экспорта и помещаем их в стек.
В edi у нас смещение таблицы хешей искомых функций.
Т.к. дальше мы будем помещать в стек адреса найденных API ф-ий, то сохраним указатель стека в ebp, через ebp потом и будем обращаться к найденным адресам. Несколько слов, что такое index, первоначально он равен Name Pointers и указывает на таблицу адресов имен экспорта, каждый элемент таблицы равен двойному слову, и указывает на начало ASCII строки с именем API функции, если к Index прибавить 4, то он будет указывать на следующий адрес в таблице адресов имен... Конечно много непонятного, но поглядите в отладчик и половина вопросов отпадет.
_BeginSearch:
mov ecx,[ebp+4*4] ;NumOfNamePointers
xor edx,edx
_SearchAPIName:
mov esi,[ebp+4*1] ;Index
mov esi,[esi]
add esi,ebx
В ecx кол-во экспортируемых функций используем как счетчик, чтоб не найти какую-нибудь муть.
Обнулим edx, там потом будет порядковый номер найденной функции, начиная с нуля. Это понадобится для нахождения адреса. В esi адрес ACSII имени API функции, первоначально указывает на первую.
_GetHash:
xor eax,eax
push eax
_CalcHash:
ror eax,7
xor [esp],eax
lodsb
test al,al
jnz _CalcHash
pop eax
Далее считаем хеш от имени функции, чтобы потом сравнить с хешем от требуемой функции, помните, что на имя у нас указывает esi. На выходе в eax будет хеш.
OkHash:
cmp eax,dword ptr [edi]
je _OkAPI
add dword ptr [ebp+4*1],4 ;I=I+4 (I--Index)
inc edx
loop _SearchAPIName
jmp _Exit
Никаких проблем, сравниваем, если равно, то имя функции найдено, и идем высчитывать ее адрес. Если нет, то прибавляем к Index четыре (чтобы указывал на следующий адрес имени в таблице экспорта) и ищем дальше, если требуемой функции вообще не нашли (неправильно написали имя или неверный хеш), то благоразумнее будет выйти или передать управление жертве, в зависимости от ситуации.
_OkAPI:
shl edx,1
mov ecx,[ebp] ;OrdinalTableRVA
add ecx,ebx
add ecx,edx
mov ecx,[ecx]
and ecx,0FFFFh
mov edx,[ebp+4*3] ;AddressTableRVA
add edx,ebx
shl ecx,2
add edx,ecx
mov edx,[edx]
add edx,ebx
Здесь мы окажемся в том случае, если мы нашли имя искомой функции, а следовательно и ее порядковый номер в edx. Код похож на себе подобный из других статей, потому отсылаю вас туда (см.ссылки внизу), не люблю писать одно и тоже и повторяться. Один момент, здесь работа происходит не с переменными, а в стеке, потому глядите в отладчик, в конце концов.
push edx cmp word ptr [edi+4],0FFFFh ;0FFFFh-End of HeshTable je _FindFirstFile add edi,4 _NextName: mov ecx,[ebp+4*2] ;NamePointersRVA add ecx,ebx mov [ebp+4*1],ecx ;Index jmp short _BeginSearch
Адрес найден!!! Что и требовалось доказать, помещаем его в стек, смотрим последняя ли это требуемая функция из таблицы хешей, если нет, то устанавливаем edi на следующий хеш. Возвращаем Index в первозданное состояние, т.е. что бы он указывал на адрес имени первой функции в таблице экспорта кернела, и повторяемся...
Полностью рабочий пример можно найти здесь.
Пример тестировался на различных платформах Win95-XP, за что отдельное спасибо
Ingrem'у.
Т.к. я не обладаю творческими изысками, в тексте могут содержаться неточности,
о коих прошу сообщать на sars@ukrtop.com Исправлю...
Если кому-нибудь поможет данная статья, не сочтите за труд черкануть пару строк автору, тогда возможно продолжу эту тему. Все вопросы по коду туда же, кроме таких как: "Что такое стек?" и т.д.
Рекомендую отладчики SoftIce и OllyDebugger.
Если данное пособие найдет читателей, то в следующих статьях планирую рассмотреть,
как заразить файл, внедряясь в свободное место в заголовке, а так же другие
способы заражения.
Ссылки:
www.wasm.ru – есть неплохая обучалка по Win32 VX от Billy Belcebu
www.zombie.host.sk – имеется хороший
FAQ для начинающих вирмейкеров и еще много чего
/\ & ()
(алгоритмы и оптимизация)
Циклические счетчики
Несколько реализаций алгоритмов циклического счётчика, который при достижении верхней границы переходят в нижнию, и наоборот, предложили masquer, Fixer, and Black_mirror:
by masquer mov eax, A; initial value
mov edx, X+1 ; upper limit value + 1
mov ecx, -1 ; forward = -1 backward = 1
@@: sub eax, ecx
mov edi, eax
add edi, 1
sbb ebx, ebx
add edi, edx
and edi, ebx
add eax, edi
mov edi, eax
sub edi, 1
sbb ebx, ebx
not ebx
and eax, ebx
mov edi, eax
sub edi, edx
sbb ebx, ebx
and eax, ebx
cmp eax, X
jz @F
; 1 cycle takes 11 clocks
; here we can process the value calculated before
jmp @B
@@: ---------------------------------------------------------------- by Fixer Вероятно самый компактный алгоритм mov eax, A ; initial value mov ebx, X+1 ; upper limit value + 1 mov ecx, step sub eax, ecx _beg_loop: add eax, ecx xor edx, edx add eax, ebx div ebx mov eax, edx ; jmp _beg_loop ---------------------------------------------------------------- by Black_mirror inc eax cmp eax,X+1 sbb ebx,ebx and eax,ebx dec eax sbb ebx,ebx and ebx,X+1 add eax,ebx
По следам FORUM.WASM.RU
И пробуждается поэзия во мне....
KiNDeRЯ заглянул в себя и ужаснулся!... Я попытался разогнать сомненье Но это все иллюзия, не больше... MSDNAquila
Стоны и кpики заполняют уши, Сознанья усталого иссушенный залив Мягкие, мелкие волны,
|
# Эпилог
И я там был, |
###########################################################################
Оригинальное всТупление
|
FatMoon / HI-TECH & Edmond
/ HI-TECH
|
|
------------- |
###########################################################################
Рассылка составлена HI-TECH GROUP 23 сентября 2003 года. |
(c) HI-TECH 2000 - 2003
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||