Pobieranie adresu EIP

Pobieranie adresu EIP to jedna z ważniejszych czynności w kodzie wirusów, exe-pakerów, exploitów etc., poniższy artykuł prezentuje standardowe metody jak delta offset oraz te mniej znane na uzyskanie własnego adresu EIP.

http://corkami.blogspot.com/2010/03/si-cest-ton-corps-qui-bouge-cest-ton.html

Jeśli ktoś zna inne metody — dopiszcie się do komentarzy.

Alpha blending dla Delphi (MMX)

Alpha blending dla Delphi w assemblerze z wykorzystaniem MMX:

function AlphaBlend(Pixel: dword; Background: dword; Alpha: byte): dword;
begin

  asm

  movzx       eax,Alpha       // kanal alfa 0-255
  imul        eax,01010101h   // 000000xx = xx xx xx xx
  movd        mm6,eax         //
  pxor        mm7,mm7         //
  punpcklbw   mm6,mm7         // rozpakuj do bajtow

  mov         edx,00FFFFFFh
  movd        mm2,edx

  movd        mm0,Background  // pixel z tla
  pand        mm0,mm2         // usun kanal alfa z tla

  movd        mm1,Pixel       // pixel obrazu
  pand        mm1,mm2         // usun kanal alfa z pixela

  punpcklbw   mm0,mm7         // rozpakuj pixel obrazu do bajtow
  punpcklbw   mm1,mm7         // oraz pixel litery do bajtow

  psubw       mm0,mm1         // src - pix
  pmullw      mm0,mm6         // *alpha
  psrlw       mm0,8           // >> 8
  paddb       mm0,mm1         // +

  packuswb    mm0,mm7         // spakuj ponownie do pixela
  movd        eax,mm0         // zapisz do eax

  mov         Result,eax

  end;

end;

To tylko przykład, można to zoptymalizować pod względem konwencji regcall, ale już mi się nie chcę, z dedykacją dla jednego geniusza, który twierdził, że to niemożliwe…

Optymalizacja kodu

binaryArtykuł prezentujący różnice w optymalizacji kodu przez najpopularniejsze kompilatory HLL, cała masa ciekawych snippetów i trików używanych do wyprodukowania optymalnego kodu (również odpowiada na odwieczne pytanie czym zerować rejestry sub-em, xor-em czy inaczej), polecam prawdziwym fanatykom assemblera 🙂

linux-kongress.org/…/compiler_survey_felix_von_leitner.pdf

Przy okazji polecam również ciekawy artykuł autorstwa Gynvaela Coldwinda o branchless code, czyli w skrócie jak pozbyć się z kodu skoków i zastąpić je inną serią instrukcji:

http://gynvael.coldwind.pl/?id=247

Gynvael opisał wszystko na poziomie HLL, więcej przykładów w assemblerze zaprezentował kilka lat temu virii writer z0mbie w artykule Polymorphic Games:

http://vx.netlux.org/lib/vzo43.html

Przy okazji na blogu Gynvaela znalazłem odnośniki do podobnego artykułu:

http://fanael.wordpress.com/…/jak-pisac-branchless-code-czesc-1/

http://fanael.wordpress.com/…/branchless-clamp-to-0-255/