12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

ВЗЛОМXOR_KEY, между прочим, тоже следует сделать случайным.randomizeXOR_KEY = rndnum mod 0xFFКод перед морфингомd8d1 | fcom st0, st1d8c9 | fmul st0, st1d8d4 | fcom st0, st4d8ed | fsubr st0, st5d8d6 | fcom st0, st6d8c2 | fadd st0, st2Отлично! Теперь группируем, создаем макрос gen_trash, принимающийпараметром количество генерируемых инструкций. Улучшить этот макросможно, сделав параметром не количество инструкций, а максимальныйразмер в байтах. Еще лучшим ходом будет параметр, являющийся пределомслучайному количеству инструкций/размеру в байтах. Реализуемпервый, упрощенный, но немного уступающий другим вариант:macro gen_trash length {repeat lengthrandomizevariant = randseed mod VARIANTSif variant = 0gen_leaelse if variant = 1gen_fpuend ifend repeat}Теперь для генерации 10 случайных инструкций указываем в коде:gen_trash 10. Следует расширить этот макрос, что не составиттруда. Добавляй как можно больше инструкций\вариантов: ветвления;статистику повторения инструкций; порядок следования (кучаFPU-инструкций вперемешку с обычным кодом — это подозрительно,ты не находишь? Или десяток инструкций lea, идущих подряд? А бесконтрольныйгенератор вполне может творить такое). Идей в процесседолжно возникать великое множество — пробуй все, что придет вголову, не ограничивай себя. Теперь пара слов об использованиимакроса gen_trash. Сделаем простой расшифровщик, разбавленныймусором:gen_trash 15mov eax, .CodeStartUSEDREG1 = REAXgen_trash 27mov ecx, CodeSizeUSEDREG2 = RECXgen_trash 20.again:xor byte[eax], XOR_KEYgen_trash 37inc eaxgen_trash 10loop .againgen_trash 43058При большом количестве мусора и при достойном его качестве не такпросто будет разобраться, что же в коде происходит, и как отделить егоот мусора. Улучшить генератор можно, добавив работу с локальными\глобальными переменными, различные переходы, ветвления, процедуры,различные варианты инструкций, сложные инструкции видаlea eax,[ ecx*4+100 ]... Но — главное!.. Самое главное — не забывай,что код должен быть схожим с генерируемым нормальным компилятороми одновременно хитрым, запутанным. Изучи частоту повторенийинструкций в распространенных или входящих в состав операционнойсистемы программ, а затем примени эту статистику в своем генераторе.0XACED1A ÀÍÒÈÎÒËÀÄÊÀНи одна защита кода просто не представляется без антиотладочныхтрюков. Добавим и мы, но будем хитрее. Сделаем вставку случайногоантиотладочного трюка в случайном месте, то есть просто добавим кмакросу gen_trash, и трюк будет генерироваться наравне с инструкциями.Простой пример — если отладчик обнаружен, выполняетсяпереход на случайный адрес в пределах секции кода.macro adbg {randomizevariant = rndnum mod Nrandomizedestination = (rndnum mod ((ENTRY_POINT + 0x1000)- ENTRY_POINT)) + ENTRY_POINTif vatiant = 0invoke IsDebuggerPresenttest eax,eaxjnz $+destinationelse if variant = N.....}Также трюки следует разбавлять мусором. Добавляй больше антиотладки— больше сюрпризов исследователю.0XACE ÈËÈ ÐÀÍÄÎÌÈÇÀÖÈß API-ÂÛÇÎÂÎÂПомимо бинарного мусора, код следует сделать высокоуровневым.Вполне послужит для этого Windows API. Функции могут не нестисмысла, а могут быть и неотъемлемой частью программы. Простойпример вставки случайного API-вызова:macro gen_trash_api {randomizeRandomParam1 = rndnum mod 0xFFFFFFFFrandomizeRandomParam2 = rndnum mod 0xFFFFFFFFrandomizevariant = rndnum mod 4if variant = 0invoke IsBadReadPtr,RandomParam1,RandomParam2else if variant = 1invoke IsBadWritePtr,RandomParam1,RandomParam2else if variant = 2invoke IsBadCodePtr,RandomParam1else if variant = 3invoke GetLastErrorend if}Не стоит забывать, что API-функции не сохраняют регистры Eax, EcxXÀÊÅÐ 08 /139/ 10

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!