Долго не решался на эту статью, т.к. не знал с чего начать, если что не так, жду ценных указаний:-)
Для взлома программ рекомендуется иметь 3 вещи:
I. необходимое ПО
II. знания ассемблера и языков высокоуровнего программирования.
III.мозг

I.
1)Дня начала будет необходим SoftIce, который уже лежит в разделе софта или OllyDebugger, который вместе с плагинами лежит там жеJ
2) Hex-редактор, я пользуюсь Hiew 7.25(must have)
3)W32dsm8
4)IDA
5)Распаковщики(Quick Unpack, ASPack Die!, etc), PeiD, PE Tools (корректировки PE файлов), Import REC(восстановщик импорта)… ну и по обстоятельствамJ
Все эти чудеса можно скачать на http://wasm.ru (рекомендую) или на на http://cracklab.ru (не всегда стабильные версии)

II. 1)Знание основ ассемблера. Если Вы с ним еще не познакомились, то есть хороший мануал для новичков от cracklab, чтобы не искать на сайте я выложил все главы здесь http://www.webfile.ru/1218238.
2)Теоретические основы крэкинга – очень полезная можно скачать или здесь или на wasm.ru
3)Голубь «Искусство программирования на ассемблере» http://dl18.rapidshare.de/files/3297...rezteam.ws.rar

А пока качаются файлы я выделю основные моменты, о наличии которых надо знатьJ

Регистры
Процессоры 8086/8088 имеют 14 шестнадцатиразрядных регист*ров, которые используются для управления исполнением команд, адресации и выполнения арифметических операций. Регистр, содер*жащий одно слово, адресуется по имени.

Регистры сегмента CS, DS, SS и ES
Регистр CS - содержит начальный адрес сегмента кода. Этот адрес, суммированный со значением смещения в указателе команд (IP), определяет очередную выполняемую команду.
Регистр DS - содержит начальный адрес сегмента данных. В простейшем случае этот адрес плюс смещение, указанное в инс*трукции, задает адрес в сегменте данных.
Регистр SS - содержит начальный адрес регистра стека.
Регистр ES - используется для адресации памяти в строковых операциях. И этом плане он похож на регистр DI. Регистр ES ини*циализируется программой на ассемблере.
Регистры общего назначения AX, BX, CX и DX
Регистры общего назначения являются основными рабочими ре*гистрами ассемблерных программ. Их отличает то, что к ним можно адресоваться одним словом или однобайтовым кодом. Левый байт считается старшим, а правый - младшим.
Регистр AX - первичный аккумулятор, используется во всех операциях ввода/вывода, в некоторых операциях со строками и в некоторых арифметических операциях.
Регистр BX - базовый регистр, единственный из регистров общего назначения, используемый в индексной адресации. Кроме того, регистр BX используется при вычислениях.
Регистр DX - регистр данных. Используется в некоторых опе*рациях ввода/вывода, в операциях умножения и деления больших чисел совместно с регистром AX.
Любой из регистров общего назначения может быть использо*ван для суммирования или вычитания 8- или 16-разрядных величин.
Регистры указателя SP и BP
Регистры указателя используются для обращения к данным в сегменте стека.
Регистр SP - указатель стека. Используется для временного хранения адресов и иногда данных. Адресует стек аналогично ре*гистру SS.
Регистр BP - указатель базы. Обеспечивает ссылки на пара*метры (данные и адреса, передаваемые через стек).
Индексные регистры SI и DI
Индексные регистры используются для адресации, а также для выполнения операций сложения и вычитания.
Регистр SI - индекс источника. Используется в некоторых операциях со строками или символами, аналогичен регистру DS.
Регистр DI - индекс приемника. Используется в тех же опе*рациях, что и регистр SI. Аналогичен регистру ES.
Регистр указателя команд IP
Регистр IP используется для выборки очередной команды программы с целью ее исполнения.
Регистр флагов Flags
Регистр Flags содержит девять активных битов (из 16), ко*торые отражают состояние машины и результаты выполнения машин*ных команд.
OF (переполнения) - равен 1, если возникает арифмети-
ческое переполнение, т.е. когда
об'ем результата превышает размер
ячейки назначения
DF (направления) - устанавливается в 1 для автомати-
ческого декремента в командах об*работки строк, и в 0 для инкре*мента
IF (разрешения
прерывания) - прерывания разрешены, если IF=1.
Если IF=0, то распознаются лишь немаскированные прерывания
TF (трассировки) - если TF=1, то процессор переходит
в состояние прерывания INT 3 пос*ле выполнения каждой команды
SF (знака) - SF=1, когда старший бит результа-
та равен 1. Иными словами, SF=0 для положительных чисел, и SF=1 для отрицательных чисел
ZF (нулевого
результата) - ZF=1, если результат равен нулю
AF (дополнительный
признак переноса) - этот признак устанавливается в 1
во время выполнения команд деся*тичного сложения и вычитания при необходимости выполнения перено*са или заема между полубайтами
PF (четности) - этот признак устанавливается в 1,
если результат имеет четное чис*ло единиц
CF (переноса) - этот признак устанавливается в 1,
если имеет место перенос или заем из старшего бита результата; он полезен для произведения операций над числами длиной в несколько слов, которые сопряжены с перено*сами и заемами из слова в слово.
Сегменты
Сегментом называется область памяти, которая начинается на границе параграфа, то есть в любой точке, адрес которой кратен 16 (восемь младших битов равны нулю).
Существуют три основных типа сегментов:
- сегмент кода - содержит машинные команды, адресуется ре*гистром CS;
- сегмент данных - содержит данные, то есть константы и рабочие области, необходимые программе. Адресуется регистром DS;
- сегмент стека - содержит адреса возврата в точку вызова подпрограмм. Адресуется регистром SS.
Каждый из упомянутых регистров содержит адрес начала сег*мента (базовый адрес). В программе все адреса записаны относи*тельно начала сегмента, и они определяются как смещение (offset) от начала сегмента. Двухбайтовое смещение (одно слово) может принимать значение от 0000 до 0FFFFh. Для того, чтобы вы*полнить обращение по любому адресу процессор выполняет суммиро*вание адреса, записанного в регистре сегмента, со смещением. При этом, содержимое регистра сдвигается на четыре двоичных разряда влево. Результирующий адрес занимает 20 позиций, что и позволяет адресовать 1 Мбайт памяти.

Стеки
Во многих случаях программе требуется временно запомнить информацию, а затем считывать ее в обратном порядке. Эта проб*лема в ПК решена посредством реализации стека LIFO ("последний пришел - первый ушел", Например : стопка дисков на шпинделе, первым диск положил, последним снимешь), называемого также стеком включения/из*влечения (stack – кипа). Наиболее важное ис*пользование стека связано с процедурами. Стек обычно рассчитан на косвенную адресацию через регистр SP - указатель стека. При включении элементов в стек производится автоматический декре*мент указателя стека, а при извлечении - инкремент, то есть стек всегда "растет" в сторону меньших адресов памяти. Адрес последнего включенного в стек элемента называется вершиной сте*ка (TOS).
Физический адрес стека формируется из SP и SS или BP и SS, причем SP служит неявным указателем стека для всех операций включения и извлечения, а SS - сегментным регистром стека. Со*держимое SS является самым младшим адресом (границей) области стека и называется базой стека. Первоначальное содержимое SP считается наибольшим смещением, которого может достигать стек. Регистр BP предназначен, главным образом, для произвольных об*ращений к стеку.
Прерывания
Иногда необходимо выполнить одну из набора специальных процедур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, сти*мулирующее выполнение одной из таких процедур, называется пре*рыванием, поскольку основной процесс при этом приостанавливает*ся на время выполнения этой процедуры. Существует два общих класса прерываний: внутренние и внешние. Первые инициируются* состоянием ЦП или командой, а вторые - сигналом, подаваемым от других компонентов системы. Типичные внутренние прерывания: де*ление на нуль, переполнение и т.п., а типичные внешние - это запрос на обслуживание со стороны какого-либо устройства ввода/ вывода.
Переход к процедуре прерывания осуществляется из любой программы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре прерывания должно быть сохранено состояние всех ре*гистров и флагов, используемых процедурой прерывания, а после окончания прерывания эти регистры должны быть восстановлены.
Некоторыми видами прерываний управляют флажки IF и TF, ко*торые для восприятия прерываний должны быть правильно установ*лены. Если условия для прерывания удовлетворяются и необходимые флажки установлены, то микропроцессор завершает текущую коман*ду, а затем реализует последовательность прерывания:
- текущее значение регистра Flags включается в стек (экви*валентно команде pushf);
- текущее значение кодового сегмента CS включается в стек (эквивалентно команде push CS);
- текущее значение указателя инструкции IP включается в стек (эквивалентно команде push IP);
- сбрасываются флажки IF и TF.
Новое содержимое IP и CS определяет начальный адрес выпол*няемой процедуры прерывания (обслуживание прерывания). Возврат в прерванную программу осуществляется командой, которая извле*кает из стека содержимое для:
- IP (эквивалентно pop IP);
- CS (эквивалентно pop CS);
- Flags (эквивалентно popf).
Двойное слово, в котором находится новое содержимое IP и CS, называется указателем прерывания, или вектором. Каждому ти*пу прерывания назначено число из диапазона 0...255, и адрес указателя прерывания находится путем умножения номера типа на четыре.