자체 수정 코드라는 것을 사용하는 예시에는 멀리 갈것도 없이 바이러스가 그렇습니다.
또는 실행파일 자체를 압축해서 실행시 자신을 압축 해제하는 프로그램도 그렇습니다.
그냥 실행도중에 자기 자신을 재프로그램하는 프로그램이라고 생각하시면 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
좀더 자세히 설명하자면 기계어 레벨에서 메모리상의 원래 기계어 코드를 자신이 원하는
기계어 코드로 실시간으로 바꾸도록 프로그램을 만드는 것입니다. 어렵지는 않습니다.
운영체제에서 제공하는 API를 이용하여 자신(프로세스)의 코드영역 메모리를 write 할수 있는
권한을 얻고 코드영역 메모리의 포인터를 얻은 다음에 그냥 기록하면 됩니다. 경우에 따라서
루트 권한이 필요할 수도 있겠네요.
그런데 문제는... 우리가 보편적으로 사용하는 인텔계열 CISC CPU는 명령어(기계어) 길이가
가변적입니다. 따라서 어떤 특정한 기계어 코드 하나를 완전 다른 코드로 바꾸려면 명령어 길이가
다르기 때문에 변경한 코드 이후의 모든 코드를 재정렬 해야하는 문제점도 있습니다.
뭐 못바꾸는건 아니지만 좀 번거럽죠.
그렇지 않고 같은 길이 명령어끼리 바꾸는건 크게 어렵지는 않습니다.
아래분이 말씀하신대로 특수한 상황에서 쓰이지 잘 쓰이지 않습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
C언어로 소스를 생성하는 코드를 만듭니다.
cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.
그에 따라 변화된 소스를 생성시킵니다.
또다시 cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.
python, ruby 같은 동적 언어를 이용하면 컴파일 과정없이 소스 생성하고 로딩하여 실행시킬 수 있습니다.
언어에서 지원해주는 메타프로그래밍 기법을 이용하는 다양한 방법도 있습니다.
파일을 직접 수정한 후 재실행하는 방법도 있을 것이고 코드를 DB에 저장해 놓았다고 필요할 때 인출하여 실행시키고 코드를 재가공한 후 DB에 저장하는 방법도 있을 겁니다.
각종 인공지능 알고리즘을 이용하면 스스로 수정해가면서 진화해가는 코드를 만들 수도 있을 겁니다.
위에 써놓은 예는 자기가 스스로 수정하는 코드이지만
영문 위키백과에서 말하는 self-modifying code를 의미하는지는 저는 잘 모르겠습니다.
검색의 생활화
실행되는 동안 코드 자체를 수정하는 코드입니다
검색 귀찮다고 대충대충 하지 마시고 꼼꼼히 잘 해보세요
검색하면 자세한 설명 수없이 나옵니다 예시도 많아요
설마 한글 문서만 검색하시는 건 아니죠?;;;;
물론이죠 ^^;
찾아보면서 질문을 올린거죠.ㅋ
더 찾아보고 다 읽어보세요
더 찾아보고 다 읽어보세요
죄송하지만...
죄송하지만 논지와 상관없는 답변은 사양하겠습니다.
자체 수정 코드라는 것을 사용하는 예시에는 멀리
자체 수정 코드라는 것을 사용하는 예시에는 멀리 갈것도 없이 바이러스가 그렇습니다.
또는 실행파일 자체를 압축해서 실행시 자신을 압축 해제하는 프로그램도 그렇습니다.
그냥 실행도중에 자기 자신을 재프로그램하는 프로그램이라고 생각하시면 됩니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
답변 감사드립니다. ^^; 얼마 전에 이런 프로그램을
답변 감사드립니다. ^^;
얼마 전에 이런 프로그램을 만든적이 있습니다.
바이너리의 특정 영역을 압축 해서 평소에는 사용을 안하다가
필요할 때만 압축을 풀어서 분기 했습니다.
이러한 경우도 self-modifying 이라고 할 수 있는건가요?
CS에서 사용하는 용어인거 같은데 자기 자신을 재프로그램한다는 의미가 확 와닿질 않네요.
좀더 자세히 설명하자면 기계어 레벨에서 메모리상의
좀더 자세히 설명하자면 기계어 레벨에서 메모리상의 원래 기계어 코드를 자신이 원하는
기계어 코드로 실시간으로 바꾸도록 프로그램을 만드는 것입니다. 어렵지는 않습니다.
운영체제에서 제공하는 API를 이용하여 자신(프로세스)의 코드영역 메모리를 write 할수 있는
권한을 얻고 코드영역 메모리의 포인터를 얻은 다음에 그냥 기록하면 됩니다. 경우에 따라서
루트 권한이 필요할 수도 있겠네요.
그런데 문제는... 우리가 보편적으로 사용하는 인텔계열 CISC CPU는 명령어(기계어) 길이가
가변적입니다. 따라서 어떤 특정한 기계어 코드 하나를 완전 다른 코드로 바꾸려면 명령어 길이가
다르기 때문에 변경한 코드 이후의 모든 코드를 재정렬 해야하는 문제점도 있습니다.
뭐 못바꾸는건 아니지만 좀 번거럽죠.
그렇지 않고 같은 길이 명령어끼리 바꾸는건 크게 어렵지는 않습니다.
아래분이 말씀하신대로 특수한 상황에서 쓰이지 잘 쓰이지 않습니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
...
특별한 환경에서 특별한 목적으로 사용됩니다.
현대의 일반적인 OS환경에서는 비추입니다.
1) 메모리에서 코드 영역의 코드를 바꾸는( WRITE) 동작이 보호모드 오류를 발생하는 경우
2) 멀티쓰레딩 환경에서 무의미
등
생각해보면 몇가지 문제가 있습니다.
질문하신분께 답변은
예를 들면 어셈블리어로 INC AL 명령을 필요에 따라 1바이트 수정하면 DEC AL 로 바뀌는것 같은것...
하나의 코드이지만 상황에 따라 변경시켜버리면 하나의 코드로 if 문이 참일 경우와 거짓일 경우에 모두 다 사용할 수 있게되죠.
아... 명령어는 무조건 read only라고만
아... 명령어는 무조건 read only라고만 생각을 했었는데 메모리에 로딩 된 상태에서
텍스트 영역이 보호 되지 않는다면 조건에 따라 특정 비트의 수정만으로 명령어 자체를 변경 시킬수 있겠군요.
이제 좀 감이 오네요.
감사합니다. ^^;
http://blog.jundols.com/xe/in
http://blog.jundols.com/xe/index.php?mid=textyle&vid=jundols&page=3
글 내용과 완벽하게 관련이 없을 순 있지만, 관련된 내용이라 참고해보세요~
C언어로 소스를 생성하는 코드를 만듭니다. cc로
C언어로 소스를 생성하는 코드를 만듭니다.
cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.
그에 따라 변화된 소스를 생성시킵니다.
또다시 cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.
python, ruby 같은 동적 언어를 이용하면 컴파일 과정없이 소스 생성하고 로딩하여 실행시킬 수 있습니다.
언어에서 지원해주는 메타프로그래밍 기법을 이용하는 다양한 방법도 있습니다.
파일을 직접 수정한 후 재실행하는 방법도 있을 것이고 코드를 DB에 저장해 놓았다고 필요할 때 인출하여 실행시키고 코드를 재가공한 후 DB에 저장하는 방법도 있을 겁니다.
각종 인공지능 알고리즘을 이용하면 스스로 수정해가면서 진화해가는 코드를 만들 수도 있을 겁니다.
위에 써놓은 예는 자기가 스스로 수정하는 코드이지만
영문 위키백과에서 말하는 self-modifying code를 의미하는지는 저는 잘 모르겠습니다.
http://code.entropywave.com/p
http://code.entropywave.com/projects/orc/
이게 그 예가 되지 않을까요?
qemu 도 host와 다른 이키텍쳐에 대해서 비슷하게 동작한다는 것 같던데, 확실치 않네요...
댓글 달기