티스토리 뷰
이 포스트를 읽기전에 반드시 앞 포스트를 읽기를 권장한다.
어느 블로그에서 본 비유법인데 굉장히 인상적이여서 한번 적어본다.
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를 담는다. (상수는 그냥 바로 담고!!)
<외부함수 사용>
'Reversing > Anti Debugging' 카테고리의 다른 글
[Anti Debugging] Virtualized Code Programming(VCP) - 리버서 관점 (0) | 2019.05.24 |
---|