본문 바로가기
개발 및 운영/프로그래밍

CodeVirtualizer 주의점 #1

by Joseph.Lee 2017. 12. 26.

CodeVirtualizer을 한국에서 사용하는 사람들이 별로 없는거 같네요..


제가 사용해 보면서 겪고있는 일들을 기록합니다..



1. 중첩 Virtualizer 금지

VIRTUALIZER_START

....

VIRTUALIZER_FISH_WHITE_START

....

VIRTUALIZER_FISH_WHITE_END

....

VIRTUALIZER_END


이런 식도 그렇고


void function()

{

VIRTUALIZER_START

...

VIRTUALIZER_END

}


int main()

{

VIRTUALIZER_START

...

function();

...

VIRTUALIZER_END

}


이런것도 그렇고 중첩해서 VIRTUALIZER을 하면 CodeVirtualizer프로그램이 Protect적용중에 죽던지 프로그램이 죽던지 합니다...^^



2. VirtualMachine종류도 타고 기타 설정도 좀 탑니다..

특정 코드 + VM 종류에 따라 Code Virtualizer가 죽는 일이 빈번합니다..

SHARK32로 했을때 CodeVirtualizer자체가 Crash날 때 TIGER32으로 하면 오류가 나지 않는 등...

혹은 Fake Emulation을 하면 오류가 나거나 Compress code을 하면 오류가 나거나 Location of Protection Code을 바꾸면 오류가;;;;

쨋든... Code Virtualizer가 만병통치약도 아니고 꽤나 불안정한 부분이 많이 보입니다.



전 지금... Code Virtualizer을 사용하면 동작둥 Illegal Instruction 오류가 나는 문제를 해결하는 중입니다...ㅠㅠ

이건 이 부분만 다른 VM을 사용하니 정상작동하네요...


3. 그런데 또 다른 부분에서 Illegal Instruction오류가 났는데

VIRTUALIZER_START와 VIRTUALIZER_END는 같은 블럭안에서 사용..

예를들어


VIRTUALIZER_START

while(...){

....

VIRTUALIZER_END

}


예시가 이상하긴 하지만.. 쨋든 이렇게 다른 블럭안에서 사용하면 문제가 생길 가능성이 있습니다.



4. 생각난김에


int function()

{

VIRTUALIZER_START

.....

return 1;

VIRTUALIZER_END

}

이런식의 코드 금지. (Code virtualizer에서 END를 인식하지 못합니다.)


int function()

{

int a;

VIRTUALIZER_START

if(aaaa)

 return 1;

a = 2;

VIRTUALIZER_END

return a;

}


이런식으로 맨 마지막 return뒤에는 VIRTUALIZER_END을 쓰지 않습니다.



5. 또 생각난김에

Virtualized된 코드안에 for문이 있으면 쥐약입니다..

물론 수백번정도의 반복은 괜찮지만 수만~수백만의 반복이 발생한다면..

가상화되지 않은 코드는 눈 깜짝할사이의 1/100의 시간안에 작동하겠지만

가상화를 시키면 몇분이 걸려서 프로그램이 무한루프에 빠진것처럼 멈춰버리는 현상이 발생합니다.

해결책은.

1. 이 부분만 가상화를 하지 않거나

2. 이 부분만 빠른 가상화를 시킨다. (FISH32(White)같은거) 빠를수록 복잡성은 감소.

결론. 속도와 복잡성은 반비례한다..

반응형

댓글