злобные асмодеи, напишите пожалуйста как можно больше аналогов к каждой инструкции из нижеприведённого списка. Заранее благодарен всем кто откликнется push reg push val push [reg] mov reg, reg mov reg, [reg+val] add reg, reg add reg, val add [reg+val], val call reg jmp reg jmp rel call rel
CrystalIC, я имел ввиду не это, а то каким макаром можно заменить инструкцию, на другую или несколько других, но чтобы в результате давало тот же самый результат что и оригинал
push можно заменить на sub esp,4 mov [esp], ... call можно заменить на push адрес возврата jmp ... если надо сложить два регистра, например add eax,ecx можно сделать так lea eax,[eax+ecx] или lea eax,[eax+val] jmp можно заменить на push .... addr ret Та дофига чо можно напридумывать
jCronuz ну так это совсем разные вещи, по рету просто происходит джамп, а в случае аналога call адрес должен указывать туда куда надо вернутся, тоесть на следующию инструкцию
mov reg1, reg2 эквивалентно lea reg1,[reg2] mov reg1, reg2 эквивалентно xchg reg1,reg2 если значение в reg2 можно менять эквивалент xchg reg1,reg2 при условии, что reg1 ≠reg2 xor reg1,reg2/xor reg2,reg1/xor reg1,reg2 mov reg1,reg2 эквивалентно push reg2/pop reg1 add reg1,reg2 эквивалентно mov ecx,reg2/a1: inc reg1/loop a1 add reg1,reg2 эквивалентно xadd reg2,reg1 add reg, val эквивалентно val раз комбинация из not reg/neg reg add reg, val эквивалентно sub reg,-val add esi,val можно заменить на lodsd,lodsw или lodsb если можно менять eax/ax/al add edi,val можно заменить на rep scas или rep stos или rep movs Для того чтобы спрятать сумму X и Y от посторонних глаз, помните, что ее эквивалентами являются: 1) (X xor Y)+2*(X and Y) 2) (X or Y)+(X and Y) 3) 2*(X xor Y)–(X or Y) можно часть вычислений спрятать в сопроцессор add -> fadd jmp rel эквивалентно mov reg,0EB rel/jmp $-4 аналоги jmp a 1) push offset a/retn 2) mov eax,offset a; более изощренная загрузка адреса перехода mov dword ptr [esp],eax retn 3) call a ... a: pop ecx; удаляем из стека адрес возврата 4) loop a; если до метки a ±127 байт и ecx ≠0 5) jnc a; если в результате логической или арифметической операции CF не изменялся а до этого СF=0 6) push seg a/push offset a/retf ;аналог jmp far a
аналоги mov reg,reg test ecx,ecx | test ecx,ecx jne a | cmoveq eax,ebx mov eax,ebx | a: ... | jmp a аналог xor ecx,ecx/jecxz a при умелом использовании аналогом mov reg,reg можно сделать cmpxchg reg,reg и cmpxchg8b [mem]
Возникает вопрос, если это будет морфер, то с замена одной инструкции на несколько прийдётся как то раздвигать файл, тоесть там где была одна инструкция две или три не поместятся, а как быть с относительными переходами и т.д. у них же не обсолютный адрес прописан в опкоде а смещение которое поменяется при раздвижке. Всегда мучал этот вопрос, просветите.
2FED Относительные переходы как раз не проблема -- мы знаем на сколько сдвинулся код, и дизассемблировав его можем выловить и пересчитать значения в Jcc.
Я не спец в этих вопросах, но для меня самое сложное -- отделить код от данных. Т.е. если мы пишем "внешний" метаморфер, который работает с уже готовыми исполняемыми, сделанными не тобой, то надо уметь понять, где код, а где данные -- данные не трогать, а код менять.