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

Дао универсальной распаковки

Крис Касперски

Хакер, номер #089, стр. 089-114-4


[переход на OEP]

:u eip-1

01011A35 POP EBP

01011A36 JMP EAX (01006420h)

А вот на этот раз нам повезло! Регистр EBP выталкивается из стека, и вслед за этим осуществляется переход на OEP посредством команды JMP EAX. Все идет хорошо, вот только ложные срабатывания напрягают. С автоматизацией в этом плане значительно сложнее: у компьютера с интуицией сплошной напряг. А ведь пока мы всего лишь развлекаемся… Про борьбу с протекторами речь еще не идет.

Возьмем более серьезный упаковщик FSG 2.0 by bart/xt (http://xtreeme.prv.pl/, http://www.wasm.ru/baixado.php?mode=tool&id=345) и начнем его пытать.

[многообещающая точка входа в упаковщик FSG]

01000154 XCHG ESP,[010185B4]

0100015A POPAD

0100015B XCHG EAX,ESP

0100015C PUSH EBP

0100015D MOVSB

Разочарование начинается с первых же команд. FSG переназначен для регистра FSP, и хотя через некоторое время восстанавливает его вновь, но особой радости нам это не доставляет. Упаковщик очень интенсивно использует стек, поэтому точка останова на "bpm esp-4" выдает миллион ложных срабатываний, причем большинство из них находится в цикле.

[фрагмент кода, генерирующий ложные срабатывания точки останова]

010001C1 POP ESI

010001C2 LODSD

010001C3 XCHG EAX,EDI

010001C4 LODSD

010001C5 PUSH EAX

010001C6 CALL [EBX+10]

Необходимо ввести какое-то дополнительное условие (к счастью, SoftICE поддерживает условные точки останова!), автоматически отсеивающее ложные срабатывания или хотя бы их часть. Давайте подумаем! Если стартовый код упакованной программы начинается со стандартного пролога типа PUSH EBP/MOV EBP,ESP, то точка останова "bpm esp4 if *(esp)= = EBP" отсеет кучу мусора, но при этом она будет срабатывать на любом стандартном прологе нулевого уровня вложенности, а во-вторых, упакованная программа может иметь оптимизированный пролог, в котором регистр EBP не используется.

А вот другая идея. Допустим, управление на OEP передается через PUSH offset OEP/RETN, тогда на вершине стека окажется адрес возврата, что опять-таки легко запрограммировать в условной точке останова. Еще управление может передаваться через MOV EAX,offset OEP/JMP EAX. Это легко проконтролировать, но вот против "прямых" команд JMP offset OEP или JMP [OEP] мы бессильны. К тому же слишком много вариантов получается. Запаришься, пока всех их переберешь. Ложные срабатывания неизбежны! Попробуй повоевать с FSG. В какой-то момент кажется, что решения нет, но это не совсем так!

Все известные мыщъху упаковщики и значительная часть протекторов, не желая перемешивать себя с кодом упаковываемой программы, размещаются в отдельной секции (или не секции), размещенной либо перед упаковываемой программой, либо после нее! Код упаковщика сосредоточен в одном определенном месте и никогда не пересекается с кодом распаковываемой программы! Вроде бы очевидный факт. Сколько раз мы проходили мимо него, даже не задумываясь, что он полностью позволяет автоматизировать процесс поиска OEP!

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