Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Proteus Lite v 6.7 SP3 (ISIS)

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: Bitfry <Bitfry IбабакаI land.ru>

ISIS Lite - Виртуальное моделирование электронных схем, то есть отладчик для железа



Думаю, чтоб читать эту статью без труда, нужно всё-таки иметь за спиной пару побед.
Хотя, наверное, можно просто слегка знать Асм.
Статья однозначно будет интересна новичкам, я расскажу многое об Olly и постараюсь вести мысль.
Не исключаю, что кто-то из продвинутых крякеров найдёт в ней что-то и для себя.

Никаких защит и упаковщиков на жертве нет. Для того, чтоб в этом убедиться, достаточно посмотреть,
что скажет PEid.
Программа написана на Visual С++ с использованием оптимизации (это видно из отладчика по характеру кода).

Хочу сразу же предупредить: сама жертва мало привлекательна.
Во-первых, программа весит 15Mb. (http://www.proteuslite.com/)
Во-вторых, версия Pro - более функциональный продукт. Pro - настоящая demo (без функции сохранения, начиная,
видимо, с версии 6.7). Я начал всё это только для того, чтоб разобраться с Pro Demo. О ней будет следующая статья.
В-третьих, сама программа довольно специфическая, придётся сначала рассказать, зачем она вообще мне нужна.

Болтовня

Некоторое время назад, когда начали появляться первые "нормальные" фильмы для просмотра на компе(Mpeg4),
я смотрел кино в большом количестве. Одной прекрасной ночью меня задрало бегать к компьютеру каждый раз,
как только захочется увеличить яркость (чтоб увидеть, кто крадётся в тени) или уменьшить звук (чтоб родители
в соседней комнате не взорвались вместе с астероидом). Тогда я начал искать пульт дистанционного управления
для компьютера (лентяйку) и скоро обнаружил, что такого устройства отдельно не оказалось в свободной продаже
(на тот момент).
Всё, что мне предлагали, ограничивало меня со всех сторон. Софт специальный, пульт особый, подключение через
заднее гнездо или ещё лучше - купите TV-tuner для того, чтоб пользоваться только его лентяйкой, через кучу
странных драйверов.
Интернет сказал мне: почему бы тебе не собрать собственный универсальный приёмник пультов за $10.
Оказалось, что в мире не я один мучался без пульта. Радиолюбители и электронщики решили этот вопрос по-своему.
Они создали схему недорогого устройства под названием UIR (Universal Infra Red receiver). А программисты
написали несколько замечательных программ, для того чтоб команды от этого прибора превращались в любые
действия компьютера (например, Girder или WinLIRC).
Сам я был очень далёк от электроники, однако паяльник в доме у меня был (такой здоровый молоток :).
Интернет убедил меня, что собрать такое устройство может каждая домохозяйка. Я пошёл в магазин и купил детали
по списку. Там было 5-6 разноцветных палочек, одна микросхема, кварц (как объяснил продавец) и две пластинки
из текстолита с медью. Прочитав заклинание, я колдовал две ночи. И ура! Устройство заработало. Радость моя
и гордость держались целый год. Ведь микросхему надо было прошить (запрограммировать), правда, прошивка
была уже готовая, и схему примитивного программатора на сайте расписали по винтикам. Но всё-таки я чувствовал себя
очень крутым. Так обычно чувствует себя человек, который получил результат, не понимая как именно.
Однако время шло, и устройство на COM-порт показалось мне уже не актуальным. Кроме того, захотелось
включать комп с дивана. И я начал разбираться, как работает эта штука. Оказалось, что в ней стоит микроконтроллер
PIC12C509, который и совершает чудо, переводя электрические импульсы с фотоприёмника на формат сигнала COM-порта.
Любое рационализаторство этой схемы или прошивки приводило к порче деталей. Вот тут-то и появилась мечта
найти такую программу, которая могла бы моделировать действия микроконтроллера и схемы - отладчик для железа.
Я тогда испугался больших и сложных программ. Дело было заброшено. Но недавно здесь на форум поступила просьба
ковырнуть демку Proteus’a Pro. Dosikus расписал возможности этой программы. У него даже статья в журнале вышла.
Замечательные уроки будут для новичков в электронном моделировании. Тогда я вспомнил о давней задумке.
Программа оказалась не такая страшная, как все те, которые я видел раньше, а может быть, я изменился. :)
Так ко мне в руки попал Proteus Professional (Demo).
Демо-версия есть демо-версия. И для того, чтобы дописать процедуру сохранения, я сначала скачал облегчённую Lite.
Она оказалась "простым" trial’ом. Пока я ковырялся, нашлась полная ПРО. А взлом Lite я уже описал
довольно подробно. Так родилась эта статья.

Описание жертвы

Программа состоит из двух "независимых" частей.
ISIS - среда виртуального моделирования электрических, электронных и микропроцессорных схем.
ARES - трассировщик печатных плат (автоматически разводит жилки по условным схемам из ISIS).

Подбор ключа - дело мало вероятное, будем патчить. Но патчить придётся много, к этому готовьтесь сразу.

Инструменты

OllyDbg_1.10 (http://home.t-online.de/home/Ollydbg)
с плагином CommandBar (http://ollydbg.win32asmcommunity.net/stuph/#plugins)
и OllyScript (http://ollyscript.apsvans.com)

Минус НАГ

Первые впечатления от работы с программой: "Ей чего-то не хватает". Например, она не сохраняет
полноценные файлы, пишет что-то не по-русски.
Чтобы в этом убедиться, откройте дизайн калькулятора (...SAMPLES\8051 Calculator\CALC.DSN) и попытайтесь его
сохранить в другой файл. Кроме того, программа очень медленно загружается/сохраняет. Заставляет нас ждать
и нажимать лишний раз кнопку мыши (дурацкий наг).
Плохие программисты, видимо, писали программу на скорую руку и оставили в ней лишний код.

Сейчас посмотрим, что можно с этим сделать.

Сначала избавимся от нага. Раз он появляется перед загрузкой самой программы, долго мудрить мы не будем.
Открыв isis.exe в Olly, обленившись до предела, я давлю клавишу "F8". Очень быстро olly отдаёт управление
программе. Строка, на которой отладка остановилась, - это вызов главной функции программы (WinMain).
Не обращая внимания на назойливый наг, жму в Olly клавишу "F2" на данной строке, таким образом
запомнив это место для следующего запуска (ставится Break Point на адрес строки 53DB56).
Следующий запуск (<<). Жму F9 и вхожу в WinMain (F7 - трассировка с заходом в функцию).
Далее продолжаю путешествие Ctrl+F8. Появляется картинка, затем исчезает, и чуть ниже опять отладка прерывается.
Так же ставлю бряк (F2) на строке 4053A6.
Повторяю сброс (<<), дважды жму F9, вхожу в эту функцию (F7) и продолжаю автотрэйс Ctrl+F8.
А программисты - с юмором!
Я вижу в отладчике бегущую строку рекламы.
Вот этого нам совсем не нужно. Прервёмся, пока строка не дорисовалась. Вовремя нажав F12, я оказался
в процедуре нага. Убедиться в этом очень просто, дайте этой процедуре доработать. Теперь, если свернуть
все окна, на рабочем столе останется одинокий наг. Сметём-ка мы его с дороги.

Ну, сами посудите, зачем нам функция, в которой копируется строка рекламы? Структура процедуры довольно
проста, и маловероятно, что программисты поместили в функцию нага важный код. Такого я, кстати, пока ещё
не встречал (без протекторов).
Вы, наверное, уже догадались, что я опять ставлю бряк, но теперь на первой команде тормозящей функции
(F2 на строке 4D43D4). То, что это первая команда, видно по прологу, а ещё Olly показывает "скобку" функции.
И опять я сбрасываю прогу (<<), и опять прохожу весь путь (три нажатия F9).
Для того, чтобы оказаться перед выполнением этой функции. Давайте смотреть, что может произойти:


 4D43D4  push    ebp
 4D43D5  mov     ebp, esp                         ; стандартный пролог
 
 4D43D7  mov     eax, 24AC                        ; базовое значение в EAX
 
 ; процедура переключения (похоже, самодельная :) , наверное, вписана на асме)
 4D43DC  call    ISIS.005438C3                    
 
 4D43E1  push    ebx                              ; сохранить регистры
 4D43E2  push    esi
 4D43E3  push    edi
 
 4D43E4  mov     esi, dword ptr ss:[ebp+10]
 
 4D43E7  cmp     dword ptr ss:[ebp+C], 0          ; сопоставить некое значение с нулём
 4D43EB  je      short ISIS.004D43F6              ; прыг на гадость, если совпало
 
 4D43ED  xor     eax, eax                         ; очистить EAX
 4D43EF  pop     edi
 4D43F0  pop     esi
 4D43F1  pop     ebx
 4D43F2  mov     esp, ebp
 4D43F4  pop     ebp
 4D43F5  retn                                     ; и выход по короткому 
 
 И пошла 
 гадость:
 4D43F6  push    ISIS.0056C232                    ;  ASCII "REGISTER.TXT"
 ........
 


Всего один условный переход. Причём переход на строку с кричащим комментарием (Register.txt).
Совершенно ясно, что этого перехода нужно избежать. В принципе достаточно занопить строку 4D43EB.
Но тогда cmp над ней тоже больше не нужна, и её тоже можно занопить. И ещё одна команда не нужна, и ещё...
А давайте посмотрим, вносит ли эта функция хоть какие-то изменения в данные программы.
Для этого я снова прервал ход выполнения (<<) и, нажав трижды F9, оказался в начале этой функции.
Дальше я трэйсил F7 и смотрел на команды внутри процедуры 5438C3.
Я так и не нашел ни одной команды, вносящей изменения, в данные программы. Ведь такая команда
сразу же бросается в глаза. Например, что-то типа:

 mov [регистр или прямой адрес], некое значение
 

Значит, остаётся проследить изменения в стеке и регистрах... Ну, сами посмотрите, ничего полезного
она не делает, кроме обнуления EAX (строка 4D43ED), и ещё сомнительная процедура переключения.
Вероятно, можно было бы вообще не вызывать эту процедуру. Однако неизвестно, сколько раз она вызывается.
Например, Olly утверждает, что четыре (на первой строке функции нажмите Ctrl+R и увидите список).
Вызовы могут быть хитрые, и olly со своим анализом не все из них может отследить. Поэтому я предлагаю
оставить функцию, но срезать её вот до такой:

 004D43D4  /$ 33C0           xor     eax, eax
 004D43D6  \. C3             retn
 

Для ассемблирования в Olly достаточно нажать пробел на нужной строке.
После этого изменения хорошо бы перенести в файл.
Мышиное меню, Copy to executable/All modification, copy all. Затем мышиное меню, Save File.
Всё, этого нага больше мы не увидим.
После модификации файла и сброса (<<) Olly воспринимает этот файл как новую программу,
и заново проводит анализ. Старые бряки ушли в прошлое. Запускаем программу и радуемся отсутствию
стартового недоразумения.
Однако этой оптимизации мало.

Плюс SAVE

Почему она всё-таки не сохраняет файлы с полноценными схемами?
Как я уже сказал, достаточно открыть семпл калькулятора (...SAMPLES\8051 Calculator\CALC.DSN),
и вот тебе на. Вместо сохранения мы увидим иностранные закорючки:

Cannot save animated circuits without registering PROSPICE Lite.

Надо думать, что самый простой способ понять, что происходит, это посмотреть в Olly вызовы
текстовых строк (в коде правой кнопкой мыши "Search for/All referenced text Strings").
И искать там нужную последовательность закорючек(Search for text).
Однако этот способ я буду использовать позже.
Чтоб было интереснее, давайте мыслить.
Если в файле есть полноценная схема, то появляется плохое сообщение.
А если в файле нет "живых" деталей, то появляется диалог сохранения файлов.
Этот диалог - не что иное, как одна стандартная API-функция под названием GetSaveFileName.

Я надеюсь, вы поняли, что надо делать?
Ставим бряк на эту API.
Для этого сбрасываем прогу (<<). У вас должен быть плагин CommandBar. Внизу, в командной строке,
пишем "bpx GetSaveFileNameA", жмём Enter, и если всё в порядке, появится окно с перечислением всех функций,
которые вызывают искомое, это окно можно закрыть, оно для нас бесполезно.
-------------------------
Заметка:
API-функция GetSaveFileName находится в библиотеке comdlg32.dll. Если вы используете SoftIce, возможно,
вам придётся подгружать символы для библиотеки comdlg32.dll. У меня они давно уже есть, и я не помню,
нужны ли они дополнительно.
Если вдруг у вас не получится такой бряк по имени, в этот раз можно ставить просто на адрес вызова
этой функции в коде программы.
bp 50A0C9
-------------------------
Теперь запускаем прогу (F9) и сразу лезем в "сохранить как" (Save As).
Бах! Мы в Olly перед вызовом диалога сохранения файлов.

В CommandBar пишем "bpd GetSaveFileNameA", чтобы снять все бряки с этой функции. Если всё правильно,
опять появится окно-список. Закройте его.

Для того, чтоб понять, где принимается решение не вызывать диалог Save as, я решил поставить бряк
на функцию, в которой оказался.
Для этого нужно нажать F8, что вызовет диалог. Если вы перейдёте к жертве, то увидите стандартный
диалог сохранения файлов.
Даем имя и пытаемся сохранить.
Мы опять в отладчике.
Отрабатываем эту функцию до возврата (Ctrl+F9) и выполняем возврат (F7 или F8).

 509C1C  push    eax
 509C1D  mov     dword ptr ss:[esp], ecx
 509C20  push    0                                         ; /Arg3 = 000000
 509C22  push    1                                         ; |Arg2 = 000001
 509C24  push    dword ptr ss:[esp+10]                     ; |Arg1
 509C28  mov     ecx, dword ptr ss:[esp+C]                 ; |
 509C2C  call    ISIS.00509C38                             ; \ISIS.00509C38
 509C31  add     esp, 4
 509C34  retn    4
 

Вот здесь (509C31) окажется программа после этого.

Видно, что это переходная процедура (короткая и ничего полезного), она нас не может интересовать,
идём дальше (дважды F7). Выходим, таким образом, на уровень выше.

 ...
 0041DE68  call    ISIS.00509C1C
 0041DE6D  mov     esi, eax
 ...
 

Пожалуй, можно поставить бряк (F2) на 0041DE68, чтобы убедиться в правильности пути.
Отпустим прогу (F9), а затем попробуем открыть и сохранить всё тот же калькулятор
(...SAMPLES\8051 Calculator\CALC.DSN).
Save As, и бряк не сработал. Значит, решение не сохранять файл принимается ещё раньше, чем 0041DE68.
Потому что, если б оно принималось позже, бряк должен был бы сработать!
Я надеюсь, вы следите за ходом размышлений.

Давайте посмотрим, что там выше. Для этого вернитесь в Olly. Предположим, что она
показывает уже совсем другой код. Чтоб вернуться на нужное место, в коде нажмите Ctrl+G в появившемся окне,
наберите адрес 0041DE68. После Enter’a Olly покажет его дизасмовое содержание.
Итак, что тут выше?

 41DD92  sub     esp, 270
 41DD98  push    ebx
 41DD99  push    esi
 41DD9A  push    edi
 41DD9B  mov     ebx, dword ptr ss:[esp+280]
 41DDA2  cmp     dword ptr ds:[58C870], 1
 41DDA9  sbb     eax, eax
 41DDAB  neg     eax
 41DDAD  test    dword ptr ds:[ebx+58], eax
 41DDB0  je      short ISIS.0041DDCE
 41DDB2  push    40C                          ; номер сообщения
 41DDB7  call    ISIS.00503150                ; вот она и вызывает плохое сообщение
 41DDBC  add     esp, 4                       ; а затем выполняется эпилог, и бай-бай.
 41DDBF  mov     eax, 1
 41DDC4  pop     edi
 41DDC5  pop     esi
 41DDC6  pop     ebx
 41DDC7  add     esp, 270
 41DDCD  retn
 
 41DDCE  mov     esi, ISIS.0057B26C          ;  ASCII "C:\...\Имя.DSN"
 ......
 

В самом начале этой функции мы видим код, подозрительно похожий на начало функции нага.
Нет, конечно же, это другая функция. Но общее есть. Например:
1. Эта функция имеет возможность завершиться почти сразу.
2. Решение, завершиться или нет, принимает единственный условный переход в начале функции.
3. После перехода кричащий комментарий. В данном случае ASCII-строка, в ней путь и имя будущего файла.


Правильный вывод:
Здесь нам, наоборот, нужно НЕ сократить функцию, а заставить её всегда работать ПОЛНОЦЕННО.

В принципе достаточно поменять переход с условием на безусловный переход. Я так и сделал.
Но, убедившись, что я прав, решил оптимизировать это место. :)

Давайте проанализируем этот кусок кода:

 41DD92  sub     esp, 270                     ; Пролог создаёт стековый запас на всю функцию
 
 41DD98  push    ebx                          ; спасается содержимое регистров
 41DD99  push    esi
 41DD9A  push    edi
 
 41DD9B  mov     ebx, dword ptr ss:[esp+280]  ; аргумент, переданный этой функции, грузится в EBX
 
 ; В следующей строке содержимое переменной сопоставляется с единицей, в результате меняются флаги. 
 Но главное, что меняется С-флаг (если меньше (без знака), C-флаг=1, если больше либо равно, C-флаг=0)
 41DDA2  cmp     dword ptr ds:[58C870], 1     
 41DDA9  sbb     eax, eax                     ; в таком виде sbb отнимает от EAX С-флаг
 41DDAB  neg     eax                          ; получает модуль знакового числа (был -1 (FF), стал 1 и т.д.)
 41DDAD  test    dword ptr ds:[ebx+58], eax   ; сопоставить результат с неким значением из аргумента+58h
 
 41DDB0  je      short ISIS.0041DDCE          ; Если совпал, прыг
 

Теперь понятно, что строки 41DDA2-41DDAD - лишние. Я посмотрел: чуть ниже EBX нужен в таком же виде.
Значит, строка 41DD9B остаётся. И вот что я предлагаю:

 41DD92  sub     esp, 270                     
 41DD98  push    ebx                          
 41DD99  push    esi
 41DD9A  push    edi
 41DD9B  mov     ebx, dword ptr ss:[esp+280]  
 41DDA2  jmp     0041DDCE
 41DDA4  nop
 41DDA5  nop
 41DDA6  nop
 41DDA7  nop
 41DDA8  nop
 41DDA9  nop
 41DDAA  nop
 41DDAB  nop
 41DDAC  nop
 41DDAD  nop
 41DDAE  nop
 41DDAF  nop
 41DDB0  nop
 41DDB1  nop
 41DDB2  push    40C
 41DDB7  call    ISIS.00503150
 41DDBC  add     esp, 4
 41DDBF  mov     eax, 1
 41DDC4  pop     edi
 41DDC5  pop     esi
 41DDC6  pop     ebx
 41DDC7  add     esp, 270
 41DDCD  retn
 

Опять нужно сохранить изменения.
Мышиное меню, Copy to executable/All modification, copy all.
Затем мышиное меню, Save File.
Закрываем Olly, запускаем программу, сохраняем файл calc как что-то своё.
Ура!

Почему я сделал именно такие изменения в коде?
Из соображений стабильности, в случае если что-то пойдёт не так.
В данном случае я могу сказать с уверенностью 99,9999>%, что код после jump’a (41DDA2)
выполняться не будет никогда. Однако, чтобы подстраховаться, предлагаю внести ещё кое-какие изменения
в файле isis.dll.
Закройте программу и Olly.
Откройте Olly заново и в меню View/File загрузите isis.dll.
Найдите строку (Ctrl+B) в ASCII "Cannot save animated circuits without registering PROSPICE Lite".
И замените её вот на это:

 0003331D  43 72 61 63 6B 20 45 52 52 4F 52 2E 20 50 6C 65  Crack ERROR. Ple
 0003332D  61 73 65 20 63 6F 6E 74 61 63 74 20 77 69 74 68  ase contact with
 0003333D  20 42 69 74 66 72 79 2C 20 74 65 6C 6C 20 68 69   Bitfry, tell hi
 0003334D  6D 2C 20 59 6F 75 20 61 72 65 20 44 55 42 21 20  m, You are DUB! 
 

Сохраните изменения.

Так я решил, потому что если всё-таки код после строки 41DDA2 когда-нибудь выполнится,
я буду точно знать, что это произошло. :)
Надеюсь, вы поняли?

Плюс SAVE for PRO

Ну что, файл теперь сохраняется.
Этой радостной новостью я попробовал поделиться с Pro-версией этой же программы. Однако она
моего восторга не разделила. Вместо того, чтобы открыть файл, сохранённый в Lite, она мне нахамила.

Nice try, but ISIS Proteus Professional dose not load files saved from Proteus Lite.

Ничего себе сервис! Одна и та же программа не открывает файлы, сохранённые в разных поставках.

Можно, конечно, легко отловить место, где версия Про выводит это сообщение, но в этом случае
вам придётся качать ещё 21 метр с ненужной демкой или искать полную версию.
Давайте придумывать другой способ.

Ну, хорошо, а сможет версия ISIS Pro открыть примеры, находящиеся в Lite-версии (каталог SAMPLES)?
Да легко.
Значит, файл "SAMPLES\8051 Calculator\CALC.DSN" не имеет такого дефекта, который получился
в ходе его пересохранения в новый файл в Lite-версии (назовём его CALC_2.DSN).
Сразу же бросается в глаза, что CALC_2.DSN сохранился вместе с каким-то придатком(CALC_2.PWI),
которого вообще нет у CALC.DSN. Но этот придаток я отложил (можете считать интуицией).
В таких случаях всегда сначала сравнивают файлы.

fc /b CALC.DSN CALC_2.DSN >x.txt
-----------
fc - команда сравнения DOS.
/b - ключ этой команды для сравнения бинарных (в смысле не текстовых) файлов
> - эта закорючка перенаправляет вывод результата команды. В данном случае - в файл x.txt

Посмотрим, что за различия отражены в x.txt:

 Сравнение файлов CALC.DSN и CALC_2.DSN
 0000008B: 32 33
 0000008C: 34 30
 0000008F: 35 34
 00000092: 31 35
 000000A7: 08 5F
 000000A9: F9 9E
 000000AA: 01 02
 000000B1: 10 DD
 000000B2: DF 11
 000000B3: 0C 73
 000000B4: 3B 42
 000000B9: 00 20
 ..........
 ..........
 


У-у-у, как тут всего много. Но это совсем не удивительно, ведь семпл был создан в старой версии
и с тех пор не менялся, новая же версия по-другому сохраняет файл.
Теперь заметьте, что первое различие вовсе не на нулевом байте, а на 8Bh. Значит, заголовок у этих файлов
общий, чего и следовало ожидать, ведь Lite-версия открывает все виды файлов.
Далее я подставил заголовок от старого файла CALC.DSN к только что сохранённому CALC_2.DSN.
Результат был положительный (можете сами перетыкать первые байты, только это не обязательно :).
Давайте посмотрим на начало файла в hex-редакторе (в Olly View/File "any file (*.*)")
Вот начало файла CALC.DSN:

 00000000  49 53 49 53 20 53 43 48 45 4D 41 54 49 43 20 46  ISIS SCHEMATIC F
 00000010  49 4C 45 1A 00 00 00 00 00 00 00 00 00 00 00 00  ILE_............
 00000020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 00000030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 00000040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 00000050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 00000060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30  ...............0
 00000070  35 2F 31 30 2F 39 39 00 00 00 00 00 00 00 00 00  5/10/99.........
 00000080  00 00 00 00 00 00 00 00 00 00 00 32 34 2F 30 35  ...........24/05
 00000090  2F 30 31 00 00 00 00 00 00 00 00 00 00 00 00 00  /01.............
 000000A0  00 00 00 00 00 00 00 08 02 F9 01 00 00 16 2C FA  .......__щ_.._,ъ
 000000B0  37 10 DF 0C 3B 1E 00 01 00 00 00 01 00 01 00 00  7_Я.; ._..._._..
 000000C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 000000D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 000000E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 000000F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 00000100  98 02 00 00 44 45 53 49 47 4E 20 43 4F 4E 46 49  __..DESIGN CONFI
 00000110  47 55 52 41 54 49 4F 4E 20 44 41 54 41 1A 00 00  GURATION DATA_..
 00000120  41 72 69 61 6C 00 00 00 00 00 00 00 00 00 00 00  Arial...........
 00000130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
 


Сразу видно, что первые различия - это дата создания файла (от 8B да 92). Значит, смотрим дальше.
A7-AA. Методом тыка я обнаружил, что это не то (мягко выражаясь).
И когда я уже собирался менять подход, неожиданно был найден правильный ответ. :)
B9
Согласитесь, что он не так уж далеко :).
Этот байт в CALC_2.DSN почему-то имеет значение 20h.
Теперь, когда мы знаем, что в заголовке файла не должно быть 20h по адресу B9, можно найти место
в процедуре сохранения файлов, где добавляется 20h вместо 00.
Можно, конечно, опять поставить бряк на GetSaveFileNameA и дальше долбить F7, проверяя периодически
в папке с файлом, появился он или ещё нет, и потом проверяя, есть ли в нём уже байт B9 или нет.
Но это чисто механический подход. Я же считаю, что кряк должен быть творческий, иначе зачем этим заниматься?

Творчество иногда интуитивно, а иногда вполне может подчиняться законам логики. Давайте ещё раз посмотрим
на заголовок файлов DSN-формата. Перед злобным байтом № B9 идёт всякая ерундистика (для нашей логике).
Но чуть выше мы видим вполне полезные сведения - Дата.

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

Вывод:
В процедуре сохранения, перед тем как будут вписаны интересные значения, программа задаёт
операционной системе извечный вопрос: который час?.
Можно смело ставить бряк на GetLocalTime и смотреть, что будет после,
если не понимаете о чём я, справочник по API в руки - и читать, читать, читать.

Делаем следующее. Грузим калькулятор, пытаемся сохранить, после того как программа прервётся
на GetSaveFileNameA, в командной строке Olly пишем:

bpx GetLocalTime

Отпускаем прогу (F9). Даём имя файлу и благополучно приземляемся на искомую функцию.

 541851  call    dword ptr ds:[<&KERNEL32.GetLocalTime>]  ; \GetLocalTime
 541857  movzx   eax, word ptr ss:[esp+10]
 54185C  mov     dword ptr ss:[esp+14], eax
 541860  movzx   eax, word ptr ss:[esp+E]
 541865  mov     dword ptr ss:[esp+18], eax
 

Если вы смотрели справочник, как я советовал, вы знаете, что функция GetLocalTime возвращает
всего лишь адрес структуры системного времени, а в сохранённом файле мы имеем текстовую дату.
Значит, впереди нас ждут преобразования в такой вид. Значит, можно давить кнопку F8, пока мы не увидим
чего-то похожего на текстовую строку с датой. Только бряк нужно отключить, мало ли где ещё вызывается
эта функция, она обычно на каждом шагу стоит.
Пишем в командной строке Olly " bpd GetLocalTime" и едем дальше. F8,F8,F8...

 4BFF99  push    64                                       ; /MaxFormattedStringSize = 64 (100.)
 4BFF9B  mov     ecx, ISIS.005806FC                       ; |ASCII "17/04/05"
 4BFFA0  push    ecx                                      ; |FormattedString => ISIS.005806FC
 4BFFA1  push    ebx                                      ; |Format
 4BFFA2  lea     edx, dword ptr ss:[esp+24]               ; |
 4BFFA6  push    edx                                      ; |pDate
 4BFFA7  push    esi                                      ; |dwFlags
 4BFFA8  push    400                                      ; |LocaleId = 400
 4BFFAD  call    dword ptr ds:[<&KERNEL32.GetDateFormatA>]; \GetDateFormatA
 4BFFB3  add     esp, 0C
 4BFFB6  mov     eax, ISIS.005806FC                       ;  ASCII "17/04/05"
 4BFFBB  pop     esi
 4BFFBC  pop     ebx
 4BFFBD  add     esp, 14
 4BFFC0  retn
 

Вот это уже значительно ближе к тому месту, где дата вписывается в будущий файл.
Теперь можно выйти из этой процедуры (Ctrl+F9, F8).

 420287  call    ISIS.004BFF20
 42028C  add     esp, 8
 42028F  push    eax
 420290  lea     ecx, dword ptr ds:[esi+4AE]
 420296  push    ecx
 420297  call    ISIS.0053DD70
 42029C  push    0
 42029E  call    ISIS.00541848
 4202A3  mov     dword ptr ds:[esi+4D4], eax
 4202A9  mov     word ptr ds:[esi+4CA], 25F
 4202B2  mov     word ptr ds:[esi+4CC], 29E
 4202BB  mov     word ptr ds:[esi+4DC], 20         ; ну, я так понял, что вы поняли :)
 4202C4  add     esp, 0C
 4202C7  test    ebp, ebp
 4202C9  jnz     short ISIS.004202D4
 


После того как в заголовок будущего файла добавляется дата, туда в явном виде пишутся несколько байт.
И если мы изменим одну строчку 4202BB, то 20h в файл писаться не будет, а будет туда писаться всё,
что вы захотите. :) Советую сделать так:
4202BB mov word ptr ds:[esi+4DC], 00
Потому что, несмотря на то, что там и так нули, нопить эту строку не надо. Мало ли что.

После очередного усовершенствования нужно опять перенести изменения в файл и опять сохранить.
Мышиное меню, Copy to executable/All modification, copy all.
Затем мышиное меню, Save File.

Поверьте мне на слово, если в файле не будет значения 20h по адресу B9,
то такой файл будет считаться полноценным, а не каким-нибудь Lite.
Ну или качайте версию Professional и проверяйте сами.

Плюс Debugging 1

Для чего вообще эта программа? Для того, чтоб отлаживать схемы.
Так давайте попробуем теперь запустить симуляцию всё того же калькулятора (SAMPLES\8051 Calculator\CALC.DSN).
Меню "Debug/ Start/Restart Debugging" и кнопку "play" (>). Работает.
А теперь остановим симуляцию и произвольно добавим любой элемент в схему, даже не подключая его,
например, транзистор. Это такой маленький треугольничек с двумя ножками и шеей без головы. :)
Попытка повторить симуляцию приводит нас к сообщению
"’KEYPAD.DLL’ failed to authorize for ’KEYPAD-CALCULATOR’"
И далее "Product Key does not match Customer Key".
Вот теперь можно и по тексту искать, ищем в папке программы строку про ключ. И находим её
только в файле LICENCE.DLL, в общем-то, это не удивительно.
В отладчике смотрим запущенные модули (View/Executable Modules или Alt+E). Выбираем "LICENCE.DLL",
дальше в коде правой кнопкой мыши жмём "Search for/All referenced text Strings".
"Search for text" всё той же искомой строки

Product Key does not match Customer Key

Находим всего один вызов этой строки. Посмотрим, а для этого тыкнем в него дважды:

 10003D98  push   LICENCE.100163D4          ; ASCII "Product Key does not match Customer Key"
 10003D9D  lea    ecx,dword ptr [esi+E0]
 10003DA3  push   ecx
 10003DA4  call   LICENCE.10005B58
 

Дальше лично я поставил бряк через CommandBar
bp 10003D98
Сначала, конечно, просто нажал F2 на строке и установил точно такой же бряк, но после исключения
и перезагрузки пришлось заново искать адрес. Потому что бряк этот не в основном exe-файле, а в LICENCE.DLL.
А вот через командную строку можно вызывать предыдущие команды. Поэтому "bp 10003D98".

После исключения я заново загрузил прогу в Olly. Повторил бряк и начал симуляцию калькулятора
с моим бесполезным транзистором.
Вот мы и прервались на 10003D98.
Дальше нужно посмотреть, что и куда.
Разобрать весь код и внимательно изучить каждую команду... А впрочем, ну его!
Нажму Ctrl+F8, и будь что будет.
Так, мы опять прервались там же, интересно зачем?
Опять Ctrl+F8 и опять прерываюсь. И так я насчитал 7 вызовов этой странной текстовой строки.
Ну, особо разбираться я не буду, ведь мне эта строка просто мешает, а сделаю я вот что.
После седьмого Ctrl+F8 (авто-трэйса) я заметил, что управление вернулось к жертвенной программе.
Если вы ещё не попытались к ней перейти и не вызвали тем самым исключения, то можно просто смотреть на код,
а если уже что-то поменяли - повторяйте приседанья.

Итак, код:

 468EC9  call    dword ptr ds:[<&KERNEL32.FreeLib>   ; FreeLibrary
 468ECF  add     esp, 0C
 468ED2  jmp     ISIS.00468F65
 468ED7  cmp     dword ptr ss:[esp+218], 0
 468EDF  jnz     short ISIS.00468F20
 468EE1  push    dword ptr ds:[ebx+240]
 468EE7  mov     ecx, dword ptr ds:[57B24C]
 468EED  mov     edx, dword ptr ds:[ecx]
 468EEF  call    dword ptr ds:[edx+28]
 468EF2  test    eax, eax
 468EF4  jnz     short ISIS.00468F20
 468EF6  mov     ecx, dword ptr ds:[57B24C]
 468EFC  mov     edx, dword ptr ds:[ecx]
 468EFE  call    dword ptr ds:[edx+3C]
 468F01  push    eax
 468F02  push    esi
 468F03  lea     ecx, dword ptr ss:[esp+14]
 468F07  push    ecx
 468F08  push    2004
 468F0D  call    ISIS.00503150
 468F12  push    1
 468F14  mov     ecx, ebx
 468F16  call    ISIS.00468F77
 468F1B  add     esp, 10
 468F1E  jmp     short ISIS.00468F65
 
 468F20  push    0
 

Мы сейчас на строке
00468F0D call ISIS.00503150
Именно в этом вызове выводится плохое сообщение.
А что нас привело сюда?
Правильно, нас сюда привели эти два условных перехода - оба не выполнились.
Вот если б хоть один из них сработал...
Но не всё здесь так просто, давайте поставим бряк на строку
468ED7 cmp dword ptr ss:[esp+218], 0
И запустим всё по-новой.
По адресу понятно, что этот бряк в isis.exe, поэтому он запомнится, даже если будет исключение.
Сбрасываю прогу (<<), далее F9, и опять загружаю CALC.DSN, и опять добавляю транзистор, и опять начинаю симуляцию.
Показалась Olly.

 468ED7  cmp     dword ptr ss:[esp+218], 0
 468EDF  jnz     short ISIS.00468F20             ; этот переход я пока не трону
 468EE1  push    dword ptr ds:[ebx+240]
 468EE7  mov     ecx, dword ptr ds:[57B24C]
 468EED  mov     edx, dword ptr ds:[ecx]
 468EEF  call    dword ptr ds:[edx+28]           ; а вот функцию надо посмотреть
 468EF2  test    eax, eax
 468EF4  jnz     short ISIS.00468F20
 

Если после функции EAX равен нулю, то перехода не произойдёт - это плохо. Для проверки
я поставил обязательный прыг (468EF4 jmp 00468F20). В результате сообщения изменились в лучшую сторону.
Вывод: результат работы процедуры из строки 468EEF должен быть положительным в виде
ненулевого EAX’a.
Итак, вот она, процедура (вызванная, заметьте, косвенно):

 100039E0   push    ebp
 100039E1   mov     ebp, esp
 100039E3   mov     eax, dword ptr [ecx+C8]
 100039E9   test    eax, eax
 100039EB   je      short LICENCE.100039FF
 100039ED   cmp     dword ptr [eax+2C], 0
 100039F1   je      short LICENCE.100039FF
 100039F3   mov     eax, dword ptr [eax+28]
 100039F6   test    eax, eax
 100039F8   je      short LICENCE.10003A03
 100039FA   cmp     eax, dword ptr ss:[ebp+8]
 100039FD   je      short LICENCE.10003A03
 100039FF   xor     eax, eax
 10003A01   jmp     short LICENCE.10003A08
 10003A03   mov     eax, 1
 10003A08   pop     ebp
 10003A09   retn    4
 

Позволю себе поиграть с читателем.
В качестве самостоятельной работы я предлагаю вам разобрать эту процедуру.
...
Ну что, поняли?
Предполагаю, что большинство из вас сделало ошибочный вывод, будто эта функция однозначна,
и если плохо, то EAX=0, а если хорошо, то EAX=1.
Я тоже сначала так подумал. Ведь данный вызов этой функции сам подсказывает такой ответ.
Этот ответ ошибочный!

Сделайте (пока не задумываясь) следующее:

На строке 100039E0 нажмите правую кнопку мышки и Follow in Dump/Selection.
Затем байт в байт повторите вот это:

 6A 00 E8 07 00 00 00 45 52 52 4F 52 21 00 E8 0D
 00 00 00 43 61 6C 6C 20 42 69 74 66 72 79 21 00
 6A 00 90 FF 15 68 25 00 10 C2 04 00            
 

Можно просто скопировать через буфер этот текст, в Olly мышкой выделить в Hex Dump три строки
100039E0
100039F0
10003A00
Нажать Ctrl+E.
Вставить из буфера текст.
OK.
Теперь в коде это должно выглядеть так:

 100039DF   CC               int3
 выше ничего не должно меняться
 100039E0   6A 00            push    0
 100039E2   E8 07000000      call    LICENCE.100039EE
 100039E7   45               inc     ebp
 100039E8   52               push    edx
 100039E9   52               push    edx
 100039EA   4F               dec     edi
 100039EB   52               push    edx
 100039EC   2100             and     dword ptr ds:[eax], eax
 100039EE   E8 0D000000      call    LICENCE.10003A00
 100039F3   43               inc     ebx
 100039F4   61               popad
 100039F5   6C               ins     byte ptr es:[edi], dx            ; I/O command
 100039F6   6C               ins     byte ptr es:[edi], dx            ; I/O command
 100039F7   2042 69          and     byte ptr ds:[edx+69], al
 100039FA   74 66            je      short LICENCE.10003A62
 100039FC   72 79            jb      short LICENCE.10003A77
 100039FE   2100             and     dword ptr ds:[eax], eax
 10003A00   6A 00            push    0
 10003A02   90               nop
 10003A03   FF15 68250010    call    dword ptr ds:[<&USER32.MessageBo>; USER32.MessageBoxA
 10003A09   C2 0400          retn    4
 ниже ничего не должно меняться
 10003A0C   55               push    ebp
 

Если всё правильно, сохраните изменения в файле.
Как я уже неоднократно писал:
Мышиное меню, Copy to executable/All modification, copy all. Затем мышиное меню, Save File.

!Изменения будут в файле LICENCE.DLL.

Я сказал "пока не задумываясь", а вот теперь самое время подумать, что вы только что сделали!
Эта задача не такая простая для новичка, и если вы поймёте, что происходит в изменённых байтах,
то оценка за домашнее задание будет 5+.

Debugging калькулятора сделали, но теперь isis вообще не грузится :(

Да
я знаю, программа теперь не грузится,
я знаю, что выводится MessageBox.

Так и задумано (насчет бокса), теперь мы можем отследить все вызовы этой процедуры.
И без отладчика программа будет сообщать нам, что вызвана гадость из LICENCE.DLL.
Данные байты можно интерпретировать так:

     push    0            ; простой стиль с кнопкой OK
     call    M1           ; перескакивает через строку текста и толкает в стек адрес текста
 db ’ERROR!’,0            ; Титульная строка для бокса
 M1: call    M2           ; перескакивает через строку текста и толкает в стек адрес текста
 db ’Call Bitfry’,0       ; текст внутри бокса
     push    0            ; без родительского окна
 M2: call    MessageBox   ; догадайтесь сами
     ret   4              ; возврат с очисткой стека
 


Если вдруг что-то мы забудем изменить сейчас по поводу этой функции, потом оно аукнется звуковым сигналом
и нужным сообщением. Мы с лёгкостью, зная что к чему, найдём вызов этой функции.

Итак, программа теперь не грузится и выдаёт сообщение:
ERROR!
Call Bitfry!

Расскажу по секрету, как ко мне пришла эта идея, дело в том, что в старых версиях
(которыми я тоже заинтересовался ради излечения новой демы) эту процедуру в LICENCE.DLL
достаточно было заставить выводить 1 в EAX всегда, и программа работала.
А тут, как вы сейчас увидите, картина немного другая.


Значит, при загрузке программы эта функция тоже вызывается.

Думаю, что большинство читателей знают как 2х2 способ отследить такое сообщение.
Просто ставим бряк на MessageBox только в рамках LICENCE.DLL:

Alt+E

двойной щелк в LICENCE.DLL
bpx MessageBoxA

Запускаем прогу и выходим из самодельной функции, чтобы узнать, кто её вызвал.
Не забывайте нажимать OK на сообщении :).

 41A3F9   mov     ecx, dword ptr ds:[57B24C]       ; в ECX грузится указатель на адрес
 41A3FF   mov     eax, dword ptr ds:[ecx]          ; снимается косвенность (получается адрес)
 
 ; этот базовый адрес+28h, и оттуда извлекается адрес вызова бокс-процедуры.
 41A401   call    dword ptr ds:[eax+28]            
 
 ; её результат xor’ится с другим переменным значением
 41A404   xor     eax, dword ptr ds:[58C86C]       
 
 41A40A   mov     ecx, dword ptr ss:[ebp+8]         ; в ECX грузится следующий базовый адрес
 41A40D   mov     dword ptr ds:[ecx+A0], eax        ; и сохраняется EAX
 
 41A413   mov     dword ptr ss:[ebp-258], 1
 

Теперь надо узнать, кто будет извлекать поXORеное значение из памяти.
Для этого ставим бряк на чтение из памяти.
В момент выполнения строки

41A40D mov dword ptr ds:[ecx+A0], eax

нужно правой кнопкой мышки нажать на [ecx+A0] и Follow in Dump/Memory address.
Далее, выделяем в Hex Dump’е четыре байта, и опять правой мышкой на них Breakpoint/memory, on access.

Теперь смело запускайте программу (F9).
Здесь происходит обращение к спорным байтам.

 41B23D   cmp     dword ptr ds:[eax+A0], 0         ; сверить байты с 0
 41B244   jnz     short ISIS.0041B250              ; если не ноль, прыг
 
 41B246   cmp     dword ptr ss:[ebp-48], 0
 41B24A   je      ISIS.0041AD51
 
 41B250   call    ISIS.004D2620                    ; вот сюда
 

Мы ведь уже знаем, что это значение связано с LICENCE.DLL. И теперь можем предположить,
что действие, приводящее к нормальной загрузке программы, должно быть противоположным.
Но менять переход здесь нельзя! Эта главный цикл программы, и менять нужно это значение.
Для этого запомним, что 1 в данном случае - это плохо, а 0 - это хорошо.

Прерываем выполнение, и опять всё от Alt+E (в смысле ставим такой же бряк).

 41A3F7   push    0                                ; в стек помещается аргумент для функции
 41A3F9   mov     ecx, dword ptr ds:[57B24C]       ; в ECX грузится указатель на адрес
 41A3FF   mov     eax, dword ptr ds:[ecx]          ; снимается косвенность (получается адрес)
 
 ; этот базовый адрес+28h, и оттуда извлекается адрес вызова самодельной процедуры.
 41A401   call    dword ptr ds:[eax+28]            
 
 ; её результат xor’ится с другим переменным значением, и получается плохая единица
 41A404   xor     eax, dword ptr ds:[58C86C]       
 
 41A40A   mov     ecx, dword ptr ss:[ebp+8]         ; в ECX грузится следующий базовый адрес
 41A40D   mov     dword ptr ds:[ecx+A0], eax        ; сохраняется плохой EAX
 

Я предлагаю написать так:

 0041A3F7     33C0           xor     eax, eax
 0041A3F9     8B4D 08        mov     ecx, dword ptr ss:[ebp+8]
 0041A3FC     8981 A0000000  mov     dword ptr ds:[ecx+A0], eax
 0041A402     EB 0F          jmp     short ISIS.0041A413
 0041A404     90             nop
 0041A405     90             nop
 0041A406     90             nop
 0041A407     90             nop
 0041A408     90             nop
 0041A409     90             nop
 0041A40A     90             nop
 0041A40B     90             nop
 0041A40C     90             nop
 0041A40D     90             nop
 0041A40E     90             nop
 0041A40F     90             nop
 0041A410     90             nop
 0041A411     90             nop
 0041A412     90             nop
 

Сохраните изменения в файл.

Сбрасываем прогу и запускаем уже переделанную.

Программа запустилась, и симуляция работает даже с нашим транзистором.
Только что-то недоделали :), раз трижды вызывается ERROR MessageBox.

Грузим заново программу в Olly, открываем калькулятор, добавляем транзистор.

Опять ставим бряк на MessageBox в рамках LICENCE.DLL:
Alt+E
двойной щелк в LICENCE.DLL
bpx MessageBoxA

И теперь попробуем симуляцию.
Меню "Debug/ Start/Restart Debuging".

Мы должны прерваться в нашей процедуре перед вызовом сообщения. В принципе совсем не обязательно
так изгиляться и создавать процедуру MessageBox, но в данной программе это здорово облегчает отлов вызова
этой функции.
Теперь нужно снять бряк с MessageBox, пока.
bpd MessageBoxA
И поставить бряк на строку ниже (на ret 4).
Только поставьте его через CommandBar.
bp 10003A09
Потому что бряк находится в LICENCE.DLL, а не в isis.exe и как я уже писал, после перезагрузки он теряется.
Запустим программу (F9) и нажмём ОК на появившейся мессаге.
Тут же нас вернуло в Olly. Выполним возврат из процедуры (F7) и посмотрим, где мы оказались.
Нынче мы на строке 468EF2.

 468EEF   call    dword ptr ds:[edx+28]          ; вызов нашего МеssageBox’a
 468EF2   test    eax, eax                       ; проверить EAX на ноль
 468EF4   jnz     468F20                         ; если не ноль (как сейчас), прыг
 
 468EF6   mov     ecx, dword ptr ds:[57B24C]     ; а вот этого нам совсем не нужно
 468EFC   mov     edx, dword ptr ds:[ecx]
 468EFE   call    dword ptr ds:[edx+3C]
 
 468F01   push    eax
 468F02   push    esi
 468F03   lea     ecx, dword ptr ss:[esp+14]
 468F07   push    ecx
 468F08   push    2004
 468F0D   call    ISIS.00503150                  ; потому что здесь выводится плохое сообщение 
 468F12   push    1
 468F14   mov     ecx, ebx
 468F16   call    ISIS.00468F77
 468F1B   add     esp, 10
 468F1E   jmp     short ISIS.00468F65
 
 468F20   push    0                              ; отсюда уже всё хорошо
 


Ну, тут всё понятно, у нас и так EAX ненулевой после вызова нашего MessageBox’a. Именно поэтому
и выполнялась симуляция. Но вызов этой процедуры, как мы знаем, совершенно бесполезен для программы,
поэтому посмотрим чуть выше, что нужно поменять, чтобы сразу же прыгнуть на 468F20.

 468EA9   mov     dword ptr ds:[ebx+244], eax      ; сохранить EAX
 468EAF   test    eax, eax                         ; проверить на ноль
 468EB1   jnz     468ED7                           ; если модуль есть, значит не ноль - прыг
 468EB3   push    esi
 468EB4   lea     ecx, dword ptr ss:[esp+10]
 468EB8   push    ecx
 468EB9   push    2003                             ; ID сообщения об отсутствии модуля
 468EBE   call    ISIS.00503150                    ; как мы уже знаем, она выводит сообщения
 
 468EC3   push    dword ptr ds:[ebx+240]           ; /hLibModule
 468EC9   call    dword ptr ds:[<&KERNEL32.FreeLib>; \FreeLibrary
 468ECF   add     esp, 0C
 468ED2   jmp     ISIS.00468F65
 
 468ED7   cmp     dword ptr ss:[esp+218], 0      ; сравнить со значением в стеке
 468EDF   jnz     short ISIS.00468F20            ; если лицензия есть, прыг
 468EE1   push    dword ptr ds:[ebx+240]
 468EE7   mov     ecx, dword ptr ds:[57B24C]
 468EED   mov     edx, dword ptr ds:[ecx]
 
 468EEF   call    dword ptr ds:[edx+28]          ; вызов нашего МеssageBox’a
 468EF2   test    eax, eax                       ; проверить EAX на ноль
 468EF4   jnz     468F20                         ; если не ноль (как сейчас), прыг
 
 .........
 
 468F20   push    0                              ; ну и отсюда всё хорошо
 


В принципе достаточно сделать переход в строке 468EDF безусловным,
но тогда не нужна строка выше, и вообще на неё прыгать не надо.
Поэтому я предлагаю после проверки модуля на наличие прыгать сразу к строке 468F20.

Еще раз:

 468EA9   mov     dword ptr ds:[ebx+244], eax    ; сохранить EAX
 468EAF   test    eax, eax                       ; проверить на ноль
 468EB1   jnz     00468F20                       ; если модуль есть, значит не ноль - прыг
 

Таким образом, мы избегаем вызова ненужной части кода.

Сохранили изменение в файле, сбросили программу (<<), открыли+изменили калькулятор,
и запустили симуляцию заново.

Уже лучше. Вызов "ERROR!" происходит только один раз.

Теперь можно сразу ставить бряк не на MessageBox, а из буфера командной строки.
bp 10003A09

Жмём ОК на ERROR-сообщении и отправляемся в Olly. Опять выходим из процедуры (F7).
Попадаем на строку 09A9B3F0.
Давайте осмотримся (у вас адреса могут быть другие).

 09A9B3C3   mov     dword ptr ds:[ebx+15C], eax
 09A9B3C9   test    eax, eax
 09A9B3CB   jnz     short PROSPICE.09A9B3E3          ; если DSIM model создана, прыг
 09A9B3CD   push    edi
 09A9B3CE   lea     ecx, dword ptr ss:[esp+18]
 09A9B3D2   push    ecx
 
 ; ASCII "%s failed to create DSIM model for primitive type ’%s’."
 09A9B3D3   push    PROSPICE.09AC2E72            
 09A9B3D8   push    ebx
 09A9B3D9   call    PROSPICE.09A9BAE8
 09A9B3DE   add     esp, 10
 09A9B3E1   jmp     short PROSPICE.09A9B419
 
 09A9B3E3   push    dword ptr ds:[ebx+14C]
 09A9B3E9   mov     ecx, esi
 09A9B3EB   mov     edx, dword ptr ds:[esi]
 
 09A9B3ED   call    dword ptr ds:[edx+28]            ; вызов нашего MessageBox’a
 09A9B3F0   test    eax, eax                         ; проверка его деятельности
 09A9B3F2   jnz     short PROSPICE.09A9B419          ; и правильный прыжок
 09A9B3F4   mov     ecx, esi
 


Опять я предлагаю срезать ненужный вызов. Всё по аналогии предыдущего случая.
Меняем
09A9B3CB jnz short PROSPICE.09A9B3E3 ; если DSIM model есть, прыг
На
09A9B3CB jnz short PROSPICE.09A9B419
И сохраняем изменения в файл, только это уже другой файл - PROSPICE.DLL.
Загружаем калькулятор - вуаля, симуляция стартует без всяких сообщений.
Ну что же, вроде бы калькулятор дествительно работает, сказал я, и пошел симулировать
по-настоящему (уже без Olly).
Меню "Debug/ Start/Restart Debuging" и кнопку "play" (>).

Минус Сюрприз 1

И вдруг через минуту я натыкаюсь на сообщение

ERROR!
Call Bitfry!

А чего меня звать? Я тут, что случилось? Почему тебя вызвали?
Ну не дают покоя эти хитрецы нормальному крякеру. Придумали тоже - через минуту вызывать лицензию.
Теперь вы понимаете, зачем я создал эту мессагу?
Ладно, будем разбираться.

 09A6FE1F   call    dword ptr ds:[edx+28]         ; вызов нашего MessageBox’a
 09A6FE22   or      dword ptr ds:[9AA9A60], eax   ; мы сейчас тут
 

Видно сразу, что мы опять в PROSPICE.DLL этот файл помогает симуляции.
Давайте посмотрим, где выше есть условные переходы (лучшие друзья реверсёра)

 09A6FDC1   call    PROSPICE.rts_terminate        ; чего-то там terminate
 09A6FDC6   mov     eax, dword ptr ds:[9A9FD24]   ; в EAX загрузить счётчик
 09A6FDCB   inc     dword ptr ds:[9A9FD24]        ; увеличить счётчик
 
 09A6FDD1   cmp     eax, 4B0                      ; сравнить EAX c 04B0h (= 1200d) единиц.
 09A6FDD6   je      short PROSPICE.09A6FDE1       ; если равно, прыг через 2 строки
 
 09A6FDD8   cmp     dword ptr ds:[9A9FD20], 19    ; сверить другое значение с 19h(= 25d)
 09A6FDDF   jnz     short PROSPICE.09A6FE2D       ; если не равно, прыг на метку
 
 09A6FDE1   call    <jmp.&LICENCE.#1>
 09A6FDE6   mov     ebx, eax
 09A6FDE8   lea     ecx, dword ptr ss:[ebp-20]
 09A6FDEB   push    ecx
 09A6FDEC   call    dword ptr ds:[<&KERNEL32.QueryPerformanceCounter>]
 09A6FDF2   mov     edi, dword ptr ss:[ebp-20]
 09A6FDF5   and     edi, 0FFF0FFF
 09A6FDFB   or      edi, B000B000
 09A6FE01   push    0
 09A6FE03   mov     ecx, ebx
 09A6FE05   mov     edx, dword ptr ds:[ebx]
 09A6FE07   call    dword ptr ds:[edx+24]
 09A6FE0A   push    78
 09A6FE0C   push    edi
 09A6FE0D   mov     ecx, ebx
 09A6FE0F   mov     edx, dword ptr ds:[ebx]
 09A6FE11   call    dword ptr ds:[edx]
 09A6FE13   or      dword ptr ds:[9AA9A60], eax
 09A6FE19   push    0
 09A6FE1B   mov     ecx, ebx
 09A6FE1D   mov     edx, dword ptr ds:[ebx]
 09A6FE1F   call    dword ptr ds:[edx+28]
 09A6FE22   or      dword ptr ds:[9AA9A60], eax   ; а мы-то сейчас тут
 09A6FE28   call    <jmp.&LICENCE.#2>
 Метка:
 09A6FE2D   mov     dword ptr ss:[ebp-4], -1
 09A6FE34   jmp     short PROSPICE.09A6FE67
 09A6FE36   mov     eax, dword ptr ss:[ebp-14]
 


Давайте в этот раз использовать самый распространённый метод взлома.
Научный тык.
Переходов всего 2 и вариантов всего два (jmp либо там, либо там).
Нам не надо менять переход на противоположное условие, потому что этот случай выглядит примерно так:
0 Запуск
1 Симуляция
2 Увеличить счетчик
3 Если счетчик не больше чего-то, то прыг на шаг 1
4 Прервать симуляцию

Это, конечно, только догадка, но она не пуста.
Симуляция работала минуту и вдруг прервалась.
Минута - это много для компьютера, и мне больше по душе первый переход из-за значения 1200d.
Давайте его заNOPим.

В коде жмём Ctrl+G, и набираем 09a6fdd6, чтоб запомнить в буфере адрес.
Правой кнопкой мыши жмём Binary/Fill with NOP’s
Сохраняем изменения в файл.
И сбрасываем программу (<<).

Плюс Debugging 2

Что я всё калькулятор да калькулятор. Давайте попробуем другой пример. Да, слова тут всякие непонятные.
Поскольку я в электронике знаю две вещи - PIC и калькулятор, естественно, что следующим объектом
для меня стал семпл PICCALC.DSN (...SAMPLES\PIC Calculator\PICCALC.DSN).
Эта штука, судя по кнопочкам, устроена проще. Давайте симулировать.
Только я нажал на меню "Debug/ Start/Restart Debuging", как тут же наткнулся на свою мессагу ERROR!.

Открываю Olly, запускаю прогу (F9) и повторяю из буфера бряк на строку выхода из процедуры Call Bitfry.
bp 10003A09
Опять же можно и MessageBoxA ловить только в LICENCE.DLL.
Теперь, при попытке симуляции PICCALC.DSN после нажатия на Ok в боксе, смотрим - кто вызывал.
Для этого выполняем ret (F7).
Хочу отметить. У меня так получилось, что этот код загружался по разным адресам (dll на то и динамическая).


 09A6B2BB   mov     dword ptr ds:[ebx+154], eax
 09A6B2C1   test    eax, eax
 09A6B2C3   jnz     short PROSPICE.09A6B2DE   ; проверили модель и прыгнули на проверку лицензии 
 09A6B2C5   push    edi
 09A6B2C6   lea     ecx, dword ptr ss:[esp+18]
 09A6B2CA   push    ecx
 09A6B2CB   push    PROSPICE.09A92DAE         ; ASCII "%s failed to create MIXED model for primitive type ’%s’."
 09A6B2D0   push    ebx
 09A6B2D1   call    PROSPICE.09A6BAE8
 09A6B2D6   add     esp, 10
 09A6B2D9   jmp     PROSPICE.09A6B419
 09A6B2DE   push    dword ptr ds:[ebx+14C]
 09A6B2E4   mov     ecx, esi
 09A6B2E6   mov     edx, dword ptr ds:[esi]
 09A6B2E8   call    dword ptr ds:[edx+28]
 09A6B2EB   test    eax, eax                  ; сейчас мы здесь
 09A6B2ED   jnz     short PROSPICE.09A6B319
 09A6B2EF   mov     ecx, esi
 09A6B2F1   mov     edx, dword ptr ds:[esi]
 09A6B2F3   call    dword ptr ds:[edx+3C]
 09A6B2F6   push    eax
 09A6B2F7   lea     ecx, dword ptr ss:[esp+18]
 09A6B2FB   push    ecx
 09A6B2FC   push    PROSPICE.09A92DE7         ; ASCII "mixed model %s failed to authorize - %s."
 09A6B301   push    ebx
 09A6B302   call    PROSPICE.09A6BAE8
 

Опять элементарная логика. Нажали OK на боксе, EAX стал не нулевым, симуляция началась.
Значит, условие для прыжка со строки 09A6B2ED нас устраивает (флаг нуля выключен).
Только прыжок на 09A6B319 можно совершать и выше, раз вызов бокса есть плохо (или хотя бы бесполезно).
Я предлагаю исправить так:

 09A6B2BB   mov     dword ptr ds:[ebx+154], eax
 09A6B2C1   jnz     short PROSPICE.09A6B319     ; Здесь раньше был test eax,eax
 09A6B2C3   nop                                 ; А здесь прыжок на проверку лицензии,
 09A6B2C4   nop                                 ; при условии если модель микрухи вообще найдена
 09A6B2C5   push    edi
 

Проверка подтвердила, что сообщение теперь больше не появляется.
После того как я перенёс изменения в файл (Copy to executable/All modification, copy all),
выглядеть это стало так:

 000198BB   8983 54010000    mov     dword ptr ds:[ebx+154], eax
 000198C1   75 56            jnz     short 00019919
 000198C3   90               nop
 000198C4   90               nop
 000198C5   57               push    edi
 

И затем я сохранил ещё раз исправленный PROSPICE.DLL (мышиное меню, Save File).

Раз так получается, придётся проверять все примеры подряд, вдруг там сложности возникнут.
Первая сложность возникла, когда я обыграл примитивные микросхемы в шахматы. Все, кроме одной.
PICCHESS.DSN не захотела грузиться, потому что модель микры PIC18 с Lite вообще не поставляется.
Что, впрочем, не помешало мне скопировать файл PIC18.DLL из демы Pro-версии. После этого
я обыграл и эту микросхему. Насколько я понял, программа у них одна и та же. Причём с огромным
количеством недоработок и просто ошибок. Отвлёкся.
Я пересмотрел всё. Некоторые сэмплы не симулировались, но причина, видимо, в незаконченных схемах.
Сообщения ERROR! я больше не увидел.

Минус Сюрприз 2

Теперь вроде всё. Только что-то меня всё-таки ещё тревожит... А, вспомнил: программа-то триальная.
А значит, у неё должен быть какой-то период, после которого она перестаёт работать.
Хотя странно, неужели кто-то захочет ею пользоваться с такими урезанными возможностями весь период триала.
Да я бы просто стёр её, если б узнал, что она не может отлаживать микросхемы :).
Погляжу, на всякий пожарный, одним глазком, нет ли ограничения по времени использования.
Сделал машину времени, в 2010 году она всё ещё триалится.
Потом случайно заглянул в текстовые строки файла isis.exe и нашел там вот какую штуку.
"ISIS_EXPIRED"
Я потихоньку набираю для себя словарь полезных для реверса слов. :)
Слово EXPIRED в этом списке одно из первых. Если другие методы не помогают - мне кажется, оно не лишнее.

Придётся опять в отладчик лезть.
Гружу прогу и сразу же ищу вызов этой строки.
В коде правой кнопкой мыши "Search for/All referenced text Strings", затем "Search for text"
и ввожу "ISIS_EXPIRED"... Действительно, есть такой вызов, смотрим что там:

 0041A725   call    ISIS.004CBE44
 0041A72A   add     esp, 0C
 0041A72D   test    eax, eax
 0041A72F   jnz     short ISIS.0041A73E
 0041A731   push    ISIS.0055DA5B                    ;  ASCII "ISIS_EXPIRED"
 0041A736   call    ISIS.004FC348
 0041A73B   add     esp, 4
 


Ставлю бряк на условный переход 0041A72F. Делаю я это для того, чтоб убедиться, что при каждом запуске
вызывается это место и ещё для того, чтоб посмотреть, что будет, если переход реверснуть.

Сбрасываю (<<) и опять запускаю.
Да, место это вызывается при каждом старте программы. Переход, наверное, всегда срабатывает.
Давайте поменяем флаг нуля, тогда в этот раз переход не произойдёт. Для того, чтобы это сделать
достаточно в Olly дважды щёлкнуть по значению напротив Z (будет Z 1), и под кодом мы увидим пояснение:
Jump is NOT taken

Теперь отпускаем прогу (F9).
Ну, программисты шутники.
Интересно у меня получилось. Во-первых, выскочило сообщение о том, что ключ устарел
и программа нуждается в дополнительной финансовой подпитке (заплати и получишь сервис обслуживание).
А во-вторых, опять появился MessageBox с вызовом Битфрая.

Что касается первого, то вряд ли ключ может истечь, если его вообще нет. Да и сообщение невинное.

Про второе... Сам пока не понимаю, зачем именно сейчас вызывать лицензионную проверку, когда ключ истёк.
Пока я думал, а делаю я это обычно за едой, сообщение "ERROR! Call Bitfry" выскочило ещё несколько раз.
В течение получаса я насчитал 4 сообщения, а нет - уже 5.
Да, блин! Не зря я вставлял этот поплавок. Видимо, это очередная хитрая проверка. Вот вам и по-быстрому.
Напомню, после MessageBox’a EAX не пустой. И при данных вызовах это ошибочно.
Достаточно нажать хоть один раз на "OK", и программа тут же завершится.

Буду опять ставить бряк на адрес в процедуре Call Bitfry.
Он всё ещё должен был остаться в буфере командной строки.
bp 10003A09

Пускаю прогу и жду, жду, жду.
Чего-то не вызывается...?...?...?
Есть подозрение, что из-за отладчика.
Блин, мне показалось, что прошёл целый час, пока я дождался очередного вызова.
Что я только не пробовал за это время, так точно и не выяснил, почему оно вызывается не на 100%.
Заметил, что после "значительной" паузы в отладчике и отпускания проги гадость вызывается точно.
Я уже и так угробил на эту программу кучу времени, а настоящей целью для меня является Pro.
Короче говоря, подловил-таки. Думаю, что вы тоже сможете дождаться, если подобные фокусы для вас интересны.
Выхожу из процедуры и смотрю, кто её тревожил так хитро.

 4059D1   mov     ecx, dword ptr ds:[57B24C]
 4059D7   mov     eax, dword ptr ds:[ecx]
 4059D9   call    dword ptr ds:[eax+28]                  ; Вот здесь она вызывается
 4059DC   or      dword ptr ds:[57B9E0], eax        ; А вот здесь сейчас должны быть мы     
 4059E2   mov     eax, dword ptr ds:[57C0C0]
 4059E7   or      dword ptr ds:[57B9E0], eax
 4059ED   push    7                                 ; /TimerID = 7
 4059EF   mov     eax, dword ptr ss:[esp+24]        ; |
 4059F3   push    dword ptr ds:[eax+4]              ; |hWnd
 4059F6   call    dword ptr ds:[<&USER32.KillTimer>]; \KillTimer
 4059FC   xor     eax, eax
 4059FE   pop     edi
 4059FF   pop     esi
 405A00   pop     ebx
 405A01   add     esp, 7D0
 405A07   retn    10
 

Опять какой-то таймер :Х . Значит, фокус на время.
И опять мы должны найти переход, который приводит к этому коду. Ведь в реверсинге всё сводится к ДА/НЕТ.
А обычные программы без протекторов практически не используют хитрые свичи или навороченные ветвления.
Я знаю по себе, что сначала каждая строка кажется хитрой ловушкой, но очень скоро вы поймёте степень сложности,
выше которой не стоит даже воображать в абсолютном большинстве жертв.
В Olly кнопка Enter, на строке перехода, кидает по назначению, а клавиши "-" и "+" серфят курсор.
"*" - вернёт вас на выполняемую строку.
Перебрав по-быстрому 7 переходов (чуть выше), я обнаружил, что только один может привести нас к гадости.

 4058C1   movzx   eax, word ptr ss:[esp+7E8]
 4058C9   cmp     eax, 2
 4058CC   je      004058DC                    ; В результате всё равно будет обход гадости
 4058CE   cmp     eax, 7
 4058D1   je      00405983                 ; А вот этот прыг даёт гадость по-любому
 4058D7   jmp     0040666C                   
 

Все понятно, после прыжка на 00405983 неотвратимо вызывается "Call Bitfry".
Значит, 4058CC будем безжалостно перекраивать. Но перед этим посмотрим, нет ли ещё прыжков туда же.
На строке 00405983 жму Ctrl+R. Больше вызовов нет, по крайней мере, явных.
Значит переписываем:

 4058C1   movzx   eax, word ptr ss:[esp+7E8]
 4058C9   cmp     eax, 2
 4058CC   je      004058DC
 4058CE   jmp     0040666C                 ; просто прыжок будет раньше
 4058D3   nop
 4058D4   nop
 4058D5   nop
 4058D6   nop
 4058D7   jmp     0040666C
  

Здесь, я думаю, объяснять не нужно, если вы вдруг не поняли, что я сделал, забирайтесь с головой в отладчик
и сидите там месяцами, как это делаю я. Или бросайте крякерство. :)

Здесь отловили. Но есть вероятность, что подобных "таймеров" в программе понаставили как грязи на дорогах.
Если б можно было закейгенить... Но в данной программе это дохлый номер.

Остаются два варианта: либо как рыбаки с удочкой ждать очередного поклёва, либо думать, как найти рыбу в воде.
Давайте анализировать 3 известных сюрприза:
Первый был, когда программа перестала грузиться.

 41A3F9   mov     ecx, dword ptr ds:[57B24C]       ; в ECX грузится указатель на адрес
 41A3FF   mov     eax, dword ptr ds:[ecx]          ; снимается косвенность (получается адрес)
 ; этот базовый адрес+28h, и оттуда извлекается адрес вызова бокс-процедуры.
 41A401   call    dword ptr ds:[eax+28]
 

Второй, когда симуляция через минуту обрывалась.

 09A6FE0F   mov     edx, dword ptr ds:[ebx]
 09A6FE11   call    dword ptr ds:[edx]
 09A6FE13   or      dword ptr ds:[9AA9A60], eax
 09A6FE19   push    0
 09A6FE1B   mov     ecx, ebx
 09A6FE1D   mov     edx, dword ptr ds:[ebx]
 09A6FE1F   call    dword ptr ds:[edx+28]
 


Ну и третий вы только что видели.

У всех этих вызовов есть общее - "Call [???+28h]". В OllyDbg есть замечательная возможность найти
Все такие команды в модуле. Это значит, что хорошо бы сбросить программу и перед запуском сделать так:
Мышиное меню, Search for/All commands, и далее пишем "call dword ptr [EAX+28]".
В этот раз нам, скорее всего, подойдёт именно "[EAX+28]", потому что в модуле isis.exe,
все вызовы противной процедуры были сделаны именно так. Хотя можно было поставить и на "все" регистры:
"call dword ptr [R32+28]"
Где R32 означает "любой" регистр.
Но я ставлю только на EAX.
Теперь бездумно ставим бряки на всё найденное (в списке Set Breakpoint on every command).
Естественно, что прога будет сразу же после запуска брякаться на часть из того, что мы поставили.
Делать нужно следующее:
1 после бряка входим в функцию (F7)
2 если это не наш MessageBox, выходим (Ctrl+F9, F7) и снимаем этот бряк (на строку выше, F2)
3 запускаем прогу (F9) и после бряка переходим к шагу 1

Чувствуете, как скриптом запахло :) ? Ради такого дела не грех и посмотреть, удобны ли скрипты в Olly.

 var  E             // будет одна переменная E
 
 Start:
 run                // (F9)
 mov E,eip          // сохранить место, где мы брякнулись
 sti                // (F7)
 cmp eip, 100039E9  // проверить, действительно ли мы в искомой процедуре (адрес её первой строки)
 je Yes             // если да, прыг
 bc  E              // если нет, снять бряк с того места
 jmp Start          // и на старт
 
 Yes:
 pause              // пауза в скрипте (продолжать через меню)
 jmp Start          // тут тоже на старт 
 


Скопируйте это в файл и запустите его из-под плага (Plugins/OllyScript/Run).
Конечно, этот плаг у вас должен быть установлен :).

Каждый раз, когда скрипт сработает, Olly выскочит на передний план, но скрипт сам продолжит программу.
Он совершит паузу только если в регистре текущей команды окажется адрес нашей процедуры бокса.

Ну, согласитесь, что это очень удобно. Вы можете не поверить, но это мой первый скрипт для Olly.
Дока просто прелесть, я потратил на её чтение 5 минут. И теперь могу заглядывать в неё лишь изредка.
И отладка заняла 15 секунд. Было всего 2 ошибки:
1. Все команды набирайте строчными.
2. jz здесь нет, только je.
Я большой любитель SoftIce’a, но даже несмотря на это, уже давно его не использовал в подобных программах.
Olly (в прикладных вещах) мне нравится всё больше и больше.

Перетыкав несколько меню, загр./сохр. несколько файлов, я посмотрел список выживших бряков (View/Breakpoints).
Теперь пора вспомнить о ещё одной закономерности. Посмотрите:

 mov     ecx, dword ptr ds: [57B24C]      ; в ECX грузится указатель на адрес
 mov     eax, dword ptr ds:[ecx]          ; снимается косвенность (получается адрес)
 call    dword ptr ds:[eax+28]
 

Вряд ли мы встретим в этом модуле другие адреса в памяти, из которых вынимается "таблица вызовов".
Значит, надо быстро просмотреть глазами всё что осталось.

 Breakpoints
 Address    Module    Disassembly                     Comment
 004059D9   ISIS      call    dword ptr ds:[eax+28]   - здесь мы были
 0040E87A   ISIS      call    dword ptr ds:[eax+28]
 0040F762   ISIS      call    dword ptr ds:[eax+28]
 0040F7EC   ISIS      call    dword ptr ds:[eax+28]
 0041CCDD   ISIS      call    dword ptr ds:[eax+28]
 0043043E   ISIS      call    dword ptr ds:[eax+28]
 004304FB   ISIS      call    dword ptr ds:[eax+28]
 00455AFC   ISIS      call    dword ptr ds:[eax+28]
 00456A0E   ISIS      call    dword ptr ds:[eax+28]     всё не то
 00456A1A   ISIS      call    dword ptr ds:[eax+28]
 00456D3C   ISIS      call    dword ptr ds:[eax+28]
 0045734E   ISIS      call    dword ptr ds:[eax+28]
 0045DEED   ISIS      call    dword ptr ds:[eax+28]
 0049F195   ISIS      call    dword ptr ds:[eax+28]
 004E4CBF   ISIS      call    dword ptr ds:[eax+28]
 004F1557   ISIS      call    dword ptr ds:[eax+28]
 

Вы знаете, мне показалось, что нашей рыбки здесь нет. Хотя время покажет.
Но даже если она где-то прячется, выловить её будет делом двух минут.
Поэтому я даже не буду здесь описывать, как можно найти похожий список и в другом спорном модуле (PROSPICE.DLL).

Подведу итог
1. Нага больше нет.
2. Сохраняются нормальные файлы, а не Lite. Сохраняются и циклические схемамы.
3. Отладка схем со сложными компонентами проходит успешно. Причём модули можно добавлять из Pro-версии.
4. Произведена дезинсекция, и на первый взгляд, паразитов больше нет.

Возможно с ключом человек получает что-то ещё, но точно, что не всё это. :)
Хотя надо заметить, что Lite далеко не Pro. Цена у неё всего $20, а у Professional
более $2000 в зависимости от возможности что-либо делать (хитрая политика ключей).

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

P.S.:
Дорогие читатели, напишите мне, пожалуйста, что было в статье не так.
Если вам понравилось, я расковыряю ARES из этого же пакета (разводка печатных плат). И само собой, как только
разберусь с демо-версией, напишу и о ней. Если, конечно, вам понравилось.
Любая критика (в разумных пределах) для меня очень важна, прошу вас, пишите, где я дал маху.

Bitfry IбабакаI land.ru

:)


Обсуждение статьи: Proteus Lite v 6.7 SP3 (ISIS) >>>


Комментарии к статье: Proteus Lite v 6.7 SP3 (ISIS)

Автор 26.04.2005 19:23:26
Обсуждения здесь на форуме.
http://www.cracklab.ru/f/index.php?action=vthread&forum=2&topic=2050

---
ViNCE [AHTeam] 27.04.2005 11:50:51
Программа ломается намного проще. Зачем разводить столько воды?
---
Автор 28.04.2005 07:36:55
Насколько проще? Только ВСЕ ОБСУЖДЕНИЯ желательно НА ФОРУМЕ.
---
-= ALEX =- 28.04.2005 19:51:17
Offtop: по поводу ИК ресивера... ну ты ёпта и загнул... приемник собираеЦЦа из одной детали, ИК приемника TSOP вроде бы (в телеках приминяеЦЦа) стоит один бакс. ПонадобиЦЦа еще стабилизатор типа КРЕН, т.е. питаеЦЦа он от 5 вольт, а на COM порте можно подавать сигнал +12 вольт.... вот тебе и вся схема, это чудо используеЦЦа через Girder... у самого такое стоит....
короче твой девиз я смотрю - не как лучше - а как заебаЦЦа :) .. а так молодец
---
Автор 29.04.2005 13:23:25
Советчиков я посмотрю, развелось :).
-= ALEX =-, я пробовал подобную схему, но она не работала ни где (дело было на P166). У Girder\’a тогда был один модуль устройств – UIR. Мало того я месяц Инет перерывал, чтоб найти самую стабильную и удобную схему. Поверь мне, сотни тысяч радиолюбителей во всём мире не стали бы зря собирать UIR для себя и на продажу. Наверное, себестоимость в таких предприятиях самое важное :).

ViNCE [AHTeam]
Я смотрю, ты здесь даже на форуме не зарегистрирован.
Молодо зелено, подрастёшь, поймёшь, как неприятно читать подобные не обоснованные высказывания.

Ребята, здесь не забор пишите, пожалуйста, дельности.
---
ViNCE [AHTeam] 30.04.2005 11:34:28
А то что я незареген на этом форуме - это показатель? ;) Был зареген, только когда у кряклаба был ещё самый первый форум... не знаю как сейчас, но моя учётка то ли удалена с того времени... то ли х.з. Обоснование будет чуток позже...

p.s: насчёт зелёности не тебе судить ;) \"пиписьками\" не стану с тобой меряться... ;)
---
Благодарный читатель 21.05.2005 19:22:26
Понравилось. Поучительно. Про Ares тоже почитал бы.
---
ed 25.05.2005 02:34:07
Да блин - критиков тут я смотрю много собралось только кроме как языками чесать не толку от них 0 мухи навозные короче .
Ты их не слушай с кривыми руками только критику разводить а дело ты сделал нужное и большое тебе спасибо от всех электроньшиков без таких программ мы всю жизнь будем мультивибраторы конструировать и когда все будут жить на марсе мы наконец создадим супер мультивибратор только вот нахер он им всем нужен будет.
PS просьба только выложить патчер а то геморно это.
---
Автор 25.05.2005 15:12:32
Я уже сделал патч для всех версий (и Про и Lite) нужно правда ещё и файлы с CD поставки.
Только я никогда ещё не релизил. Попробую отправить куда-нибудь.
ViNCE меня направил на мысль. Грамотно надо было патчить регистрацию (то есть licence.dll).
Правда, не могу сказать, что это было проще.
---
zhengv 11.06.2005 08:44:49
Very good guide for beginers,Thanks again.
---
Электронщик 11.06.2005 19:04:34
Все это замечательно. Если не затруднит брось готовый патч для Pro 6.7 на telefon@rambler.ru , а то я мало чего понял.
---
Автор 11.06.2005 19:42:50
Затруднит. Патч 3kb, а вот файлы полные с CD 1,3Mb (в архиве).
Я отправил на cracks.am но они пока не выложили.
По первым двум адресам отправлял вместе с cracks.am. Должно было придти. ?
Может, знаете куда выложить на постоянной основе доступно для поиска?

---
Автор 04.07.2005 14:04:58
Кому нужны готовые решения для Pro
http://keygen.us/
---
dosikus 31.07.2005 15:09:47
-= ALEX =- ::: 28 Apr 2005 19:51:17 MSK
Offtop: по поводу ИК ресивера... ну ты ёпта и загнул... приемник собираеЦЦа из одной детали, ИК приемника TSOP вроде бы (в телеках приминяеЦЦа) стоит один бакс. ПонадобиЦЦа еще стабилизатор типа КРЕН, т.е. питаеЦЦа он от 5 вольт, а на COM порте можно подавать сигнал +12 вольт.... вот тебе и вся схема, это чудо используеЦЦа через Girder... у самого такое стоит....
короче твой девиз я смотрю - не как лучше - а как заебаЦЦа :) .. а так молодец

Не знаю как ты в реверсинге ,
но радиоэлектронике ты точно ЛОХ ,
именно с большой буквы.

Описываемый тобой приемник хоть и работает , но грузит комп .

Там же дешифрация RC5 идет програмно.
А ДЕВАЙС который Bitfry собирал , аппаратный декодер.

МЛЯ..... СПЕЦ ТО ЖЕ МНЕ.

---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS