지난 주 난독화 팀의 세미나를 진행하면서 앞으로 개발 방향에 대한 이야기를 나누었다. 키를 이용해서 난독화하고 난독화한 코드를 키를 이용하면 다시 난독화 해제 할 수 있는 도구를 개발하는 방향으로 진행하게 되었는데, 학교 수업 과제 제출 같은 경우에 과제 코드를 다른 사용자가 베끼지 못하도록 하는 데 사용될 수 있을 것 같다. 또한 코드를 채점하는 사람과 같이 제한된 사용자에게만 키를 제공해 난독화를 해제할 수 있게 한다면 좋을 것 같다고 이야기하였다.
방향성을 잡은 뒤 이번 주에는 본격적인 협업 개발을 위한 깃허브 저장소를 만들었다. 깃허브 저장소의 주소는(https://github.com/ObfusKorea/Obfuscator)이다. 각 팀원이 지금까지 개발하면서 서로 같이 활용하면 좋은 난독화 기술들도 있고 겹치는 부분들도 있었어서 이번 주에 여기에 다 합쳐 둔 뒤 앞으로의 개발을 진행할 것 같다!
또한 이번 주에는 저번 주에 이어서 나만의 난독화 기술 아이디어를 생각해 보았다. 몇 가지는 아직 구현까지는 진행하지 못했지만, 방법과 구체적인 구현 방법을 기술해 두었다.
1. 형변환을 사용한 난독화
x*x>0과 같이 뻔한 코드를 좀더 어렵게 꼬인 코드로 만들 수 있는 일종의 dump 코드 삽입 방식이라고 생각하여 떠올린 방법이다. 예를 들어 int형의 숫자들을 연산할 경우, 이 숫자들을 int에 저장하는 것이 아닌 String의 특정 위치에 저장해 두는 것이다. 나중에 연산을 다시 할 때에도 이 위치의 숫자를 String의 부분을 가져오는 방식으로 꺼내와서 연산하는 방법인데, 방법을 생각하고 나서 C언어에는 String 타입이 없다는 것을 떠올렸다. 하지만 char배열로 해서 진행해도 비슷할 것 같다. (이 방법과 비슷하게 배열에 있는 데이터를 string에 담아서 사용하는 방법도 떠올렸는데, String 타입이 없어서 불가능할 것 같다. char 배열에 넣는 것은 의미가 없을 것 같고..)
이를 직접 구현해보면,
1
2
3
4
5
6
int main(int a, int b)
{
int result = 0;
result = a + b;
return result;
}
다음의 난독화 전 코드에서 result = a + b;부분을 변환하는 것이다. 이 부분을 쪼개어서 a+b에 대한 위 방법의 난독화를 진행하고 결과값을 char배열로 나오게 한 뒤 이 배열에서 부분을 가져와 result에 넣어주는 방식이다.
- exitExpr 메소드에서 a와 b에 대해 먼저 난독화를 진행하는데, char배열을 선언한 뒤 a b 각각을 char 배열의 일부분에 저장하도록 한다.
- char배열에서 a b를 꺼내 형변환한 후 연산을 수행한 후 다시 char배열에 넣는다.
- result에 char배열에 저장된 결과값을 꺼내어 넣는다.
1
2
3
4
5
6
7
8
9
10
11
int main(int a, int b)
{
int result = 0;
result = 0;
char temp[10] = "qwerqwerq";
temp[0] = a+'0';
temp[1] = b+'0';
temp[2] = temp[0]-'0' + temp[1]-'0';
result = temp[2]-'0';;
return result;
}
▲변환 후 코드
이 방법이 처음에는 자바를 생각하고 작성하여 C에서 형변환이 익숙하지 않았다. 이 코드 또한 그런 점을 생각하고 작성하지 않아서 작동하지 않는 경우도 있다. 이 방법이 더 응용시키기 좋을 만한 방법이라면 이 방법을 그런 점을 char배열을 응용하여 한자리수 이상일 경우에도 대응할 수 있게 한다던지 해서 좀더 자동적으로 진행이 될 수 있도록 변환할 수 있을 것 같다.
2. 1번에서 응용할 수 있는 아스키 코드로의 변환
String 타입이 불가능해서 char배열 관련으로 구현을 하다가 아예 아스키 코드로 변환해 저장해도 좋을 것 같았다. 형변환을 하면서 atoi, itoa같은 함수를 봤는데, 이 함수는 2진수로 변환이 가능하다고 한다. 이를 이용해도 좋을 것 같다.