Шаблонный поиск в дизассемблерном тексте
Нажимаем <CTRL-S> ("search for à sequence of commands" в контекстом меню окна CPU) и вводим шаблон "CALL CONST\TEST EAX,EAX\JCC CONST", располагая каждую команду на новой строке, после чего нажимаем "find" для поиска указанной последовательности машинных команд в дизассемблерном тексте, которую OllyDbg очень быстро находит, намного быстрее, чем при трассировке (см. рис. 6):
Рисунок 6 последовательность команд, найденная OllyDbg в дизассемблерном текстеы
Теперь мы можем нажать <F2>, устанавливая программную точку останова на команду CALL, и продолжить поиск, помечая все обнаруженные комбинации. При живом прогоне программы под отладчиком по <F9> (задействовать режим трассировки здесь совершенно необязательно), OllyDbg будет всплывать на каждом найденном CALL'е, и все, что нам остается — это дождаться появления диалогового окна с сообщением о неправильной регистрации, простроченном испытательном строке, отсутствующем ключевом файле и т. д. С определенной степенью вероятности, последний CALL, сработавший перед "ворчанием" защиты, и будет тем защитным механизмом, который отравляет нашу жизнь и который можно взломать тривиальной инверсией условного перехода, заменив JNZ на JZ (а JZ на JNZ). Конечно, со сложными защитами такой способ уже не прокатывает, но все-таки он срабатывает достаточно часто, поэтому имеет смысл взять его на вооружение.
Оптимизирующие компиляторы могут "разрывать" стандартный шаблон, помещая между инструкциями TEST EAX, EAX другие машинные команды (см. листинг 3). Это увеличивает производительность, за счет устранения простоя конвейера, но затрудняет шаблонный поиск.
004013E4 |. E8 9F180000 CALL TF.00402C88
004013E9 |. 85C0 TEST EAX,EAX
004013EB |. 59 POP ECX
004013EC |. 8907 MOV DWORD PTR DS:[EDI],EAX
004013EE |. 75 13 JNZ SHORT TF.00401403
Листинг 3 оптимизирующий компилятор "разорвал" шаблон, внедрив между TEST EAX, EAX и JNZ две команды: POP ECX и MOV [EDI], EAX
К счастью, OllyDbg поддерживает замечательное количество слово "ANY n", позволяющее пропускать от нуля до n машинных команд. В частности, "ANY 2" эквивалентно любым двум машинным командам, любой одной машинной команде или же отсутствию команд в данном месте. Новая версия шаблона, учитывающая особенности оптимизирующих компиляторов выглядит так: "CALL CONST\TEST EAX,EAX\ANY 3\JCC CONST". Правильный выбор величины n очень важен. Слишком большое значение приведет к ложным срабатываниям, слишком маленькое — к пропуску шаблонов. По своему опыту могу сказать, что оптимальное значение — три. Не слишком больше и не слишком маленькое. Короче, три это в самый раз.