Clerk недавно читал, что человеческий геном наполовину из заразивших когдато предков и потом ассимилированых вирусов. что даже разум возник изза нарушений от них в плане выживаемости + задержки раннего развития. я в этом плохо понимаю. по моему, достаточно сделать его более похожим на обычный код, что выдают компилеры. и, опять же по моему, лучше не вешать все на легкопонятный машкод, а использовать нечто свое. опять же свое оно гибче гораздо. в принципе, уже был такой разговор.
Задача успешна решилась использованием дазассемблера длин от sars он же Catchy32. По поводу релоков Clerk все верно говорит, просто в контексте данной задачи код между метками хоть и доступен, но рассматривается как недоступный. Чуть позже выложу реализацию, хотя из предложения kweed и так все понятно.
REx07 Просто ваша задача очень проста - на сколько я понял вам известен диапазон адресов кода(начало и конец его), для этого кода нужно поправить смещения. Вы проходите дизасмом длин и правите смещения в ветвлениях, не используя в этом коде непосредственно ссылок на данные. Это уже не морфинг, граф то не меняется. Тогда и не нужен никакой дизасм длин - это простой перемещаемый код(пикод). По мойму задача бредовая.
Код (Text): ; + ; Eax - число префиксов. ; Ecx - последний префикс. ; o Размер инструкции не проверяем(16). ; QueryPrefixLength proc uses esi edi Ip:PVOID Local PrefixesTable[12]:BYTE mov dword ptr [PrefixesTable],02EF3F2F0H mov dword ptr [PrefixesTable + 4],06426363EH mov dword ptr [PrefixesTable + 8],000676665H mov esi,Ip cld lea edx,PrefixesTable @@: lodsb mov edi,edx mov ecx,11 repne scasb jz @b dec esi xor eax,eax movzx ecx,byte ptr [esi - 1] sub esi,Ip .if Zero? xor ecx,ecx .else mov eax,esi .endif ret QueryPrefixLength endp ; + ; o Не проверяем Pfx 0x66. ; o Не выполняем поправку фиксапов. ; MoveBlock proc uses ebx esi edi FirstIp:PVOID, LastIp:PVOID, Buffer:PVOID mov ebx,Buffer mov esi,FirstIp mov edi,ebx cld sub ebx,esi ; Dt Next: invoke QueryPrefixLength, Esi mov ecx,eax rep movsb ; Pfx mov al,byte ptr [esi] sub al,0E8H ; Jump/Call near rel. jz @f dec al jz @f Call VirXasm32 mov ecx,eax rep movsb jmp Check @@: movsb lodsd sub eax,ebx stosd Check: cmp LastIp,esi ja Next xor eax,eax ret MoveBlock endp Можно прикрутить сюда парсер, который будет находить фиксапы для целевого участка кода и выполнять их поправки(это например если в копируемом коде есть калбэки).
2REx07 М.....да... Бред конечно)) Но тема...! и пища для размышления для таких кодокопателей как я)) Но 7-е чувство мне подсказывает что сей механизм антиотладки далеко не пойдет,..... хотя все может быть, всё...
REx07 - на счет DEP, если внимательно почитаете, дажет беглым взглядом, то поймете что вы ошибаетесь.. Clerk если добиться автоматизации конвертации в пикод, все антивирусные базы, будут писать вновь )). Кстати, ведь код на стеки будет жить только время его выполнения, а дальше он перезатрется, так что это весьма хороший упаковщик.(Конечно же если оригинал криптофан, а по мере помещения на стек декриптовка)
IceCrashLdr Для аверского эмулятора пользовательский стек это проекция памяти в его ап. Посему джамп на стек ничем не отличается от джампа в кодосекцию.