Posts LLVM - 가상화 난독화를 수행하는 pass 제작 (4/4)
Post
Cancel

LLVM - 가상화 난독화를 수행하는 pass 제작 (4/4)

이번 목표 - 가상화 난독화를 수행하는 pass 작성하기

  • switch문에 case 추가
  • 마무리

<< 이전 글에서 이어지는 내용

깃허브 소스코드 ✨

1. Switch문에 case 추가하기

저번에 Switch문을 추가하는 것까지 해 보았다.

그 이후 중복된 작업들을 함수로 정리하고, return 문을 retval을 return할 수 있도록 변경한 후 현재는

img

이만큼까지 왔다.

이번에는 case문을 추가해서 완성해볼 것이다.

(사실 이 부분은 일반적인 코드에도 적용할 수 있게 바꿔줄 때 제일 많이 변경해야 될 부분이라고 생각한다… 일단은 여기서는 이 코드만 고칠 수 있는 난독화 도구를 만들어 볼 것이므로 그냥 iterator를 내 맘대로 이동시키면서 잘 변형했는데 나중에는 어떻게 바꿔야하나ㅠㅠ)

.

case 추가를 위해, 각 케이스들을 split하고 필요한 변수를 넣어주는 작업을 했다. (i값 등)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IRBuilder<> builder_case(case_bb);
deleteInstructionWithPosition(case_bb, (case_bb->size())-1);  //맨 마지막 instruction(기존 branch)를 지워주기 위한 사용자 함수
Value *value_1 = builder_case.getInt32(1);
builder_case.CreateStore(value_1, var_i, false);
builder_case.CreateBr(sw_epliog_bb);

IRBuilder<> builder_case_2(case_2_bb);
deleteInstructionWithPosition(case_2_bb, (case_2_bb->size())-1);
Value *value_2 = builder_case.getInt32(2);
builder_case_2.CreateStore(value_2, var_i, false);
builder_case_2.CreateBr(sw_epliog_bb);

IRBuilder<> builder_case_3(case_3_bb);
deleteInstructionWithPosition(case_3_bb, (case_3_bb->size())-1);
Value *loaded_data = &(*(case_3_bb->begin()));
builder_case_3.CreateStore(loaded_data, var_retval, false);
builder_case_3.CreateBr(return_bb);
//각 case에 대한 작업

img

분리한 뒤에는 addCase함수를 이용한다.

1
2
3
switch_inst->addCase(builder_body.getInt32(0),case_bb);
switch_inst->addCase(builder_body.getInt32(1),case_2_bb);
switch_inst->addCase(builder_body.getInt32(2),case_3_bb);

img

다음과 같이 case가 잘 들어갔다.

2. 결과 확인

(1) input c 파일과 그 LLVM IR

img img

(2) c 파일에 switch문을 직접 추가하여 가상화 난독화한 c 파일과 그 LLVM IR

img img

(3) (1)을 (2)처럼 난독화 해 주는 VirtualPass를 이용한 결과

img img

(case 순서는 VirtualPass에서는 그대로 해 줘서 조금 다른 부분이 있다.)

(2)의 IR결과와 같은 결과가 나왔다. 실제로도 같은 결과가 나오는지 확인을 해 보았고,

같은 결과를 출력하는 것을 볼 수 있다.

3. 앞으로 더 해야 할 것

내가 작성한 코드에 대해서만 난독화를 손으로 해준 것과 다름이 없기 때문에, 모든 코드에 대해서 돌아갈 수 있도록 해주어야 한다. 이러한 코드 개선은 다음에 해 볼 생각이다.

This post is licensed under CC BY 4.0 by the author.

Contents