티스토리 뷰

반응형

이 포스트를 읽기전에 반드시 앞 포스트를 읽기를 권장한다.

 

어느 블로그에서 본 비유법인데 굉장히 인상적이여서 한번 적어본다.

Virtualized Code(영어) → Virtualized Machin CPU(통역사) → My CPU(나) → Program

 

이런식으로 실제 코드를 우리 CPU(예를 들면 Intel)은 알아먹지 못하게 바꾸고, 그걸 읽을 수 있는 루틴(VM)을

프로그램내에 같이 적재해 둠으로써 일반적인 방법으로는 쉽게 접근하지 못하게 난독화 하는 것이다.

 

 

<Virtualized Code 변환하기>

 우선 기본적으로 변환된 Virtualized Code의 생김새를 살펴보겠다. (항상 이렇게 생긴건 아니라고한다.)

가상화 코드 구성(예시)

 

opcode : 기본적으로 각 어셈 Instruction에는 고유한 opcode가 부여되어 있고, 프로그램이 구성될 때

            해당 opcode에 따라서 다른 handler를 호출해 동작하게 된다.

    → 여기서 포인트는 나만의 opcode를 만들어서,  (opcode_handler_table[opcode]의 형태로 handler를 호출한다)
        VM에서 그 opcode따라 서로 다른 나만의 handler를 호출할 것이라는 점이다.

    → 기존 사용하던 Instruction가 워낙 많다. 그렇기 때문에 필요한 Instruction에 대해서만 진행하면 된다.

    → 가장 중요한건, 기존에 없던 Instruction이 하나 추가되어야 한다. 바로 VM에서 기존 CPU로 흐름을 넘기는

        end Instruction를 만들어 줘야 한다. (VM의 실행을 마치고, state switching back을 한 후 흐름을 넘긴다)

operand : Instructure에 대한 operand가 존재하는데, 그 operand의 크기 및 종류에 대해 정의 하는 내용이다.

             기본적으로 1byte기 때문에, 각 bit에 따라 해당 정보를 판단하게 된다.

   6, 7bit : Ref_size를 표현하는 비트

        3, 4, 5bit : operand1의 종류를 표현하는 비트

        0, 1, 2bit : operand2의 종류를 표현하는 비트

    → [Ref_size]

          0 0 : 8bit operand

          0 1 : 16bit operand

          1 0 : 32bit operand

          1 1 : 64bit operand

        [Op_info]

          0 0 0 : register(값)

          0 0 1 : register(주소)

          0 1 0 : constant(값)

          0 1 1 : constant(주소)

          1 0 0 : relocation

operand information : 스택에 내가 Register저장한 곳의 Index를 담는다. (상수는 그냥 바로 담고!!)

 

 

<외부함수 사용>

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함