역난독화와 다른 조사를 하면서 떠올린 난독화 기법이 몇 개 있었다. 단순히 읽기 어렵게 하려면 이런 방법도 좋지 않을까 해서 떠올린 방법이다.
Uglyfier (띄어쓰기, 엔터 및 주석 지우기)
사실상 코드가 보기 편하라고 짜 놓은 거니까 이것들을 지워버릴 시 코드가 읽기 어렵게 될 거라고 생각했다. 만드는 방법도 그렇게 어렵지는 않을 것 같다. 띄어쓰기와 엔터는 예전 컴파일러 시간에 배웠던 일종의 코드 beautifier인 pretty printer와 같은 방식으로 반대로 적용하면 될 것 같고, 주석은 주석을 읽어 들이는 방법에서 리턴을 ““로 함으로써 주석을 지우는 방식으로 하면 될 것 같다.
따라서 Uglyfier는 크게 아래의 두 기능으로 나눌 수 있다.
Ugly printer
리스너를 하나 생성하고, 이 리스너를 이용해 코드를 출력할 때 문법에 지장을 주지 않을 만큼 최대한 엔터와 띄어쓰기를 다 없애 버린다. 중첩해서 난독화를 적용하는 우리의 난독화 도구에서 이 방법을 활용하기 위해서는 꼭 이 난독화 방법을 마지막 옵션으로 지정해 주어야 제대로 ugly하게 출력해 준다. (예시 : -Var -MBA -Ugly)
문법에 지장을 주지 않는 필요 없는 엔터와 띄어쓰기가 주로 어디서 발생하는지를 알고, 리스너에서 해당 부분을 출력하는 부분을 overwrite하는 방식으로 코드를 작성하였다.
다음과 같은 코드를 input으로 넣고 결과 코드를 보면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int
main ()
{
printf ("%d", adderTest (1, 2));
return 0;
}
int
adderTest (int a, int b)
{
int result = 0;
result = a + b;
return result;
}
↓
코드는 문법적으로 이상이 없어 정상 작동하지만, 같이 띄어쓰기나 엔터가 존재하지 않아 읽기가 불편하게 된다.
Comment eraser
주석을 지우는 것은 간단하다. C리스너에서 주석을 읽었을 때 리턴을 ““로 하면 된다. 리스너의 코드를 살펴 보면, 이미 주석이 있을 경우 넘어가는 것으로 되어 있어,
다음과 같이 주석을 작성한 C코드를 넣었을 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int
main ()
{
printf ("%d", adderTest (1, 2));
return 0;
}
// adder TESTing Code
int
adderTest (int a, int b)
{
int result = 0;
result = a + b;
/* This is comment!!!!!!!
Comment~~~~ */
return result;
}
↓
이렇게 주석이 없어지는 것을 볼 수 있다.
~결과~
원본 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
int
main ()
{
printf ("%d", adderTest (1, 2));
loopTest ();
etcTest ();
logicTest ();
return 0;
}
int
adderTest (int a, int b)
{
int result = 0;
result = a + b;
return result;
}
void
loopTest ()
{
int i = 0;
if (i == 0)
{
for (int f = 0; f < 2; f++)
{
printf ("for");
}
}
else if (i == 1)
{
int w = 0;
while (w < 3)
{
printf ("while");
w++;
}
}
else
{
printf ("nothing");
}
}
void
etcTest ()
{
int a, b, c;
}
void
logicTest ()
{
int num1 = 5;
int num2;
num2 = num1 ? 100 : 200;
printf ("%d", num2);
}
↓
-Ugly 옵션 적용 코드