Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #76, АПРЕЛЬ 2005 г.

Низкоуровневый кодинг

Крис Касперски ака мыщъх

Хакер, номер #076, стр. 076-116-4


CALL LoadLibrary ;// вызов функции

MOV h, EAX ;// EAX содержит возращенное значение

Ассемблерные вставки

Как же сложно программировать на чистом ассемблере! Минимально работающая программа содержит чертовую уйму разнообразных конструкций, непонятным образом взаимодействующих друг с другом и открывающих огонь без предупреждения. Одним махом мы отрезаем себя от привычного окружения. Сложить два числа на ассемблере не проблема, но вот вывести их результат на экран…

Ассемблерные вставки - другое дело. В то время как классические руководства по асму, буквально с первых же строк бросают читателя в пучину системного программирования, устрашая его сложностью архитектуры процессора и операционной системы, ассемблерные вставки оставляют читателя в привычном ему окружении языка Си (и/или Паскаля) и постепенно, безо всяких резких скачков, знакомят с внутренним миром процессора.

Они позволяют начать изучение ассемблера непосредственно с 32-разрядного защищенного режима процессора. Дело в том, что в чистом виде защищенный режим настолько сложен, что не может быть усвоен даже гением, а потому практически все руководства начинают изложение ассемблера с описания морально устаревшего 16-разрядного реального режима. Это не только оказывается бесполезным балластом, но и замечательным средством запутывания ученика (помнишь, "забудьте все, чему вас учили раньше…").

По своему личному опыту и опыту моих друзей могу сказать, что такая методика обучения превосходят все остальные как минимум по двум категориям:

а) Скорость – буквально через три-четыре дня интенсивных занятий человек, ранее никогда не знавший ассемблера, начинает сносно на нем программировать. б) Легкость освоения – изучение ассемблера происходит практически безо всякого напряжения и усилий. Ученика не заваливают ворохом неподъемной и непроходимой информации: каждый последующий шаг интуитивно понятен и с дороги познания заботливо убраны все потенциальные препятствия.

Ну, так чего же мы ждем? Пора программировать. Для объявления ассемблерных вставок в Microsoft Visual C++ служит ключевое слово __asm, а простейшая ассемблерная программа выглядит так:

Вставка, складывающая два числа

main()

{

int a = 1; // объявляем переменную a и кладем туда значение 1

int b = 2; // объявляем переменную b и кладем туда значение 2

int c; // объявляем переменную c, но не инициализируем ее

__asm{ // начало ассемблерной вставки

mov eax, a ;// загружаем значение переменной a в регистр EAX

mov ebx, b ;// загружаем значение переменной b в регистр EBX

add eax, ebx;// складываем EAX с EBX, записывая результат в EAX

mov c, eax ;// загружаем значение EAX в переменную c

} // конец ассемблерной вставки

// выводим содержимое c на экран

// с помощью привычной для нас функции printf

printf("a + b = %x + %x = %x\n", a, b, c);

}

О планах на будущее

В следующих статьях этой рубрики мы докажем, что ассемблер это не заумная теоретическая муть, а самый настоящий хардкор. Самомодифицирующийся код, технологии полиморфизма, противодействие отладчикам и дизассемблерам, экплоиты и shell-коды, генетически модифицированные черви, шпионаж за системными событиями, перехват паролей. Это и многое другое станет твоим.

Назад на стр. 076-116-3  Содержание  Вперед на стр. 076-116-5