지난 포스트에서 Tigress의 가상화 난독화의 디스패치 구조중 Switch 구조의 코드의 동작 방식에 대해서 살펴보았다. 이번 포스트에서는 Threaded 구조를 가진 가상화 난독화의 동작 방식에 대해서 살펴볼 예정이다.
먼저 Threaded 구조에 대해서 설명하면 loop-switch 구조를 사용하지 않고 한 핸들러에서 다른 핸들러로 바로 이동하는 방식으로 반복적으로 호출되는 구조가 존재하지 않기 때문에, 분석하는데 어려움이 있다.
이번 포스트에서는 Threaded 구조를 가진 Direct, Indirect 디스패치 옵션을 적용한 코드를 분석한 내용을 설명하도록 하겠다.

direct 디스패치 옵션을 적용한 코드다. goto문을 이용하였으며, 동작 방식은 앞서 설명한 loop-swtich 구조의 핸들러와 동작은 동일하다. Label 부터 핸들러의 시작이며, 핸들러의 마지막에는 VPC 값을 이용하여 다음 핸들러로 이동하는 방식이다.
또 다른 차이점으로는 instruction 구조가 약간 다르다. switch의 경우 배열 각 원소에 opcode와 1byte씩 operand를 담고 있는 구조였지만

direct의 경우 goto문의 label 주소와 operand를 저장하고 있다.
indirect의 경우 direct와 구조는 동일하다. 다만 goto를 실행할 때, jumptable을 참조하여 이동하게 된다.

위 사진은 indirect 디스패치 옵션을 적용한 코드의 일부이며, goto문을 보면 jumpTab_inline_6이라는 배열을 이용하며, 원소로 VPC가 들어가는 것을 볼 수 있다.

jumptabe은 위 사진과 같이 label의 주소를 저장하고 있다.

명령어를 저장하고 있는 배열은 switch와 같은 구조를 하고 있는 것을 볼 수 있다.