Долго не решался на эту статью, т.к. не знал с чего начать, если что не так, жду ценных указаний:-) 
Для взлома программ рекомендуется иметь 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, и адрес указателя прерывания находится путем умножения номера типа на четыре.