자체 수정 코드(self-modifying code)란?

mhhong의 이미지

우연찮게 자체 수정 코드라는 용어를 접하게 되었습니다.
구글링을 통해 위키를 읽어 봤는데 명확하게 이해가 되지 않네요.
좋은 예를 하나 들어주시면 감사하겠습니다. ^^;

익명 사용자의 이미지

실행되는 동안 코드 자체를 수정하는 코드입니다
검색 귀찮다고 대충대충 하지 마시고 꼼꼼히 잘 해보세요
검색하면 자세한 설명 수없이 나옵니다 예시도 많아요
설마 한글 문서만 검색하시는 건 아니죠?;;;;

mhhong의 이미지

찾아보면서 질문을 올린거죠.ㅋ

익명 사용자의 이미지

더 찾아보고 다 읽어보세요

mhhong의 이미지

죄송하지만 논지와 상관없는 답변은 사양하겠습니다.

chadr의 이미지

자체 수정 코드라는 것을 사용하는 예시에는 멀리 갈것도 없이 바이러스가 그렇습니다.
또는 실행파일 자체를 압축해서 실행시 자신을 압축 해제하는 프로그램도 그렇습니다.

그냥 실행도중에 자기 자신을 재프로그램하는 프로그램이라고 생각하시면 됩니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

mhhong의 이미지

답변 감사드립니다. ^^;
얼마 전에 이런 프로그램을 만든적이 있습니다.
바이너리의 특정 영역을 압축 해서 평소에는 사용을 안하다가
필요할 때만 압축을 풀어서 분기 했습니다.
이러한 경우도 self-modifying 이라고 할 수 있는건가요?

CS에서 사용하는 용어인거 같은데 자기 자신을 재프로그램한다는 의미가 확 와닿질 않네요.

chadr의 이미지

좀더 자세히 설명하자면 기계어 레벨에서 메모리상의 원래 기계어 코드를 자신이 원하는
기계어 코드로 실시간으로 바꾸도록 프로그램을 만드는 것입니다. 어렵지는 않습니다.
운영체제에서 제공하는 API를 이용하여 자신(프로세스)의 코드영역 메모리를 write 할수 있는
권한을 얻고 코드영역 메모리의 포인터를 얻은 다음에 그냥 기록하면 됩니다. 경우에 따라서
루트 권한이 필요할 수도 있겠네요.

그런데 문제는... 우리가 보편적으로 사용하는 인텔계열 CISC CPU는 명령어(기계어) 길이가
가변적입니다. 따라서 어떤 특정한 기계어 코드 하나를 완전 다른 코드로 바꾸려면 명령어 길이가
다르기 때문에 변경한 코드 이후의 모든 코드를 재정렬 해야하는 문제점도 있습니다.

뭐 못바꾸는건 아니지만 좀 번거럽죠.

그렇지 않고 같은 길이 명령어끼리 바꾸는건 크게 어렵지는 않습니다.

아래분이 말씀하신대로 특수한 상황에서 쓰이지 잘 쓰이지 않습니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

simpid의 이미지

특별한 환경에서 특별한 목적으로 사용됩니다.

현대의 일반적인 OS환경에서는 비추입니다.

1) 메모리에서 코드 영역의 코드를 바꾸는( WRITE) 동작이 보호모드 오류를 발생하는 경우
2) 멀티쓰레딩 환경에서 무의미

생각해보면 몇가지 문제가 있습니다.

질문하신분께 답변은
예를 들면 어셈블리어로 INC AL 명령을 필요에 따라 1바이트 수정하면 DEC AL 로 바뀌는것 같은것...
하나의 코드이지만 상황에 따라 변경시켜버리면 하나의 코드로 if 문이 참일 경우와 거짓일 경우에 모두 다 사용할 수 있게되죠.

mhhong의 이미지

아... 명령어는 무조건 read only라고만 생각을 했었는데 메모리에 로딩 된 상태에서
텍스트 영역이 보호 되지 않는다면 조건에 따라 특정 비트의 수정만으로 명령어 자체를 변경 시킬수 있겠군요.
이제 좀 감이 오네요.
감사합니다. ^^;

익명 사용자의 이미지

http://blog.jundols.com/xe/index.php?mid=textyle&vid=jundols&page=3

글 내용과 완벽하게 관련이 없을 순 있지만, 관련된 내용이라 참고해보세요~

익명 사용자의 이미지

C언어로 소스를 생성하는 코드를 만듭니다.
cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.
그에 따라 변화된 소스를 생성시킵니다.
또다시 cc로 컴파일하여 동적으로 .so를 로딩하여 실행시킵니다.

python, ruby 같은 동적 언어를 이용하면 컴파일 과정없이 소스 생성하고 로딩하여 실행시킬 수 있습니다.
언어에서 지원해주는 메타프로그래밍 기법을 이용하는 다양한 방법도 있습니다.
파일을 직접 수정한 후 재실행하는 방법도 있을 것이고 코드를 DB에 저장해 놓았다고 필요할 때 인출하여 실행시키고 코드를 재가공한 후 DB에 저장하는 방법도 있을 겁니다.
각종 인공지능 알고리즘을 이용하면 스스로 수정해가면서 진화해가는 코드를 만들 수도 있을 겁니다.

위에 써놓은 예는 자기가 스스로 수정하는 코드이지만
영문 위키백과에서 말하는 self-modifying code를 의미하는지는 저는 잘 모르겠습니다.

Hyun의 이미지

http://code.entropywave.com/projects/orc/

이게 그 예가 되지 않을까요?
qemu 도 host와 다른 이키텍쳐에 대해서 비슷하게 동작한다는 것 같던데, 확실치 않네요...


나도 세벌식을 씁니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.