Spring 자바 코드 난독화 (Java Code Obfuscation)
Back-End/Spring 2019. 6. 28. 14:25-자바 코드 난독화 (Java Code Obfuscation)-
- 자바 프로그램은 디컴파일 (decompile), 디스어셈블 (disassemble)이 가능하므로 코드 난독화가 필요함 - 프로가드 (proguard) : 대표적인 바자 난독화 라이브러리 - 변수명, method name을 읽기 어렵게 변환함 - 난독화를 해도 근본적으로 디컴파일은 막기 어려움 - Spring 프로젝트보다는 자바 프로젝트에 적합 (war 파일보다는 jar 파일로 export 할 경우에 적합함, 어노테이션, xml 설정 등에는 난독화 적용이 어려움) - java 코드를 읽기 어렵게 변경하는 것. - 상용프로그램 같은 경우는 배포하기 전에 난독화를 한번 하고 배포를한다. (보안때문에) |
자바 디컴파일러를 다운로드
압축을 풀기 => jd-gui.exe 클릭 (클래스 파일을 주고 자바 소스파일을 얻어내는 프로그램)
프로그램을 실행하고 File => Open File를 클릭
디컴파일할 파일을 누른 후 열기 버튼을 누름 (마찬가지로 jar 파일도 확인가능)
class파일을 열면 그 class가 속해있는 프로젝트가 통째로 열리게 된다.
자바 코드 난독화 실습
-jad (자바 디컴파일러), 자바 실습소스
-자바 실습소스를 이클립스로 import 한 후 jar 파일로 export
-jad에서 export한 jar 파일을 열어서 디컴파일된 소스 코드 확인
-프로가드 사이트 : http://proguard.sourceforge.net
proguard 6.0.3 다운로드 주소 : https://sourceforge.net/projects/proguard/files/
jar 파일 준비 ( jsp 프로젝트보다는 java 프로젝트로 테스트하는 것이 더 좋음), jar 파일을 찾기 쉬운 경로에 미리 복사함
- 난독화 테스트할 java project 생성
- 프로젝트 이름 : java_test
-proguard 다운로드-
다운로드 받은 압축파일의 압축을 풀고, 압축을 푼 파일을 D드라이브로 이동시킨다.
-실습하기-
자바 프로젝트 생성 => Jumin.java 클래스 생성하고 아래 코드를 작성
Jumin.java
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
package java_test2;
import java.util.Scanner;
public class Jumin {
private String jumin; // 주민등록번호
private int age; // 나이
private char gender; // 성별
private String strGender; // 성별저장
private String nation; // 국가
public Jumin() {
}
public void input() {
Scanner scan = new Scanner(System.in); // 주민등록번호를 입력받기위해 Scanner객체 선언
System.out.print("주민등록번호 : ");
jumin = scan.nextLine(); // 입력받은 주민등록번호를 jumin변수에 저장
}
public void setAge() { // 나이를 저장하는 메소드
int base = 0; // 초기값을 0으로 선언
gender = jumin.charAt(7); // index값은 항상 0부터 시작하므로 주민등록번호의 8번재값이 jumin에 저장
switch (gender) {
// gender에 저장된 숫자에 따라 다른 switch문이 실행됨
case '1':
case '2':
case '5':
case '6':
base = 1900;
break;
case '3':
case '4':
case '7':
case '8':
base = 2000;
break;
}
age = 2019 - (base + Integer.parseInt(jumin.substring(0, 2)));
// 나이를 계산하기 위해서 index의 0번째부터 4번째값까지를 리턴하고 base값과 더하고
// 2019에서 그 값을 빼주면 현재 나이가 계산이된다.
// ex) 나이가 28일때 2019-(1900+92)를 하면 27이된다. (만나이 이기 때문)
}
public void setNation() {
// 주민등록 번호의 8번째 자리의 숫자의 값에따라 내국인과 내국인을 판별함.
if (gender >= '1' && gender <= '4') {
nation = "내국인";
} else if (gender >= '5' && gender <= '8') {
nation = "외국인";
}
}
public void setStrGender() {
// 주민등록 번호의 8번째 자리의 숫자의 값에따라 성별을 판별함.
switch (gender) {
case '1':
case '3':
case '5':
case '7':
strGender = "남";
break;
case '2':
case '4':
case '6':
case '8':
strGender = "여";
break;
}
}
public String toString() {
// 입력한 주민등록번호로 판별된 데이터들을 취합해서 result에 저장하고,
// result를 리턴.
String result = "국적 :" + nation + "\n" + "나이:" + age + "\n" + "성별:" + strGender;
return result;
}
public static void main(String arg[]) {
Jumin ex = new Jumin(); // Jumin클래스를 사용하기 위해 ex변수에 Jumin 객체를 생성
ex.input(); // 주민등록번호 입력 메소드 실행
ex.setAge(); // 나이 저장 메소드 실행
ex.setNation(); // 내, 외국 판별 메소드를 실행
System.out.println(ex); // ex변수에 저장된 result를 출력함.
// 나머지 메소드들은 void이기 때문에 리턴값이 없음.
}
}
|
cs |
cmd창을 열고 d: => cd proguard6.0.3\lib => java -jar proguardgui.jar 을 입력
STS4로 돌아가서 아까 만든 프로젝트를 우클릭 => Export => Java => JAR file 실행
아래 그림과 같이 만듦
저장후 next => finsh 클릭,
바탕화면에 jar파일이 생성된것을 확인하고 아까 cmd로 실행한 ProGuard를 연다.
Input/Output => Add input... => jar파일 클릭 하고 ok를 클릭
input파일 추가를 완료했으므로 이 파일을 난독화 한 후에 출력할 output파일을 지정해야 한다.
Add output => 이름 output.jar로 한다. => OK 클릭
output.jar 파일이 지정되었으면 Next 버튼을 클릭하고 마지막에 Process! 버튼을 클릭함
클릭하면 난독화가 끝나고 패키징까지 되서 output.jar 파일이 만들어진다.
만들어진 output.jar 파일을 디컴파일러로 열어보면 변수이름과 메소드이름이 난독화가 되서 변수 이름이 a,b,c,d,e로 바뀐것을 확인할 수 있다.
실행은 정상적으로 된다.
Jumin.class (output.jar)
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
60
61
62
63
64
65
66
67
68
69
|
package java_test2;
import java.io.PrintStream;
import java.util.Scanner;
public class Jumin
{
private String a; //변수 이름이 난독화되어서 a,b,c,d,e로 되었다.
private int b;
private char c;
private String d;
private String e;
public String toString()
{
String str;
return str = "국적 :" + this.e + "\n나이:" + this.b + "\n성별:" + this.d;
}
public static void main(String[] paramArrayOfString)
{
Object localObject = paramArrayOfString = new Jumin();
Scanner localScanner = new Scanner(System.in);
System.out.print("주민등록번호 : ");
((Jumin)localObject).a = localScanner.nextLine();
localObject = paramArrayOfString;
int i = 0;
Object tmp42_41 = localObject;
tmp42_41.c = tmp42_41.a.charAt(7);
switch (((Jumin)localObject).c)
{
case '1':
case '2':
case '5':
case '6':
i = 1900;
break;
case '3':
case '4':
case '7':
case '8':
i = 2000;
}
((Jumin)localObject).b = (2019 - (i + Integer.parseInt(((Jumin)localObject).a.substring(0, 2))));
localObject = paramArrayOfString;
if ((paramArrayOfString.c >= '1') && (((Jumin)localObject).c <= '4')) {
((Jumin)localObject).e = "내국인";
} else if ((((Jumin)localObject).c >= '5') && (((Jumin)localObject).c <= '8')) {
((Jumin)localObject).e = "외국인";
}
localObject = paramArrayOfString;
switch (paramArrayOfString.c)
{
case '1':
case '3':
case '5':
case '7':
((Jumin)localObject).d = "남";
break;
case '2':
case '4':
case '6':
case '8':
((Jumin)localObject).d = "여";
}
System.out.println(paramArrayOfString);
}
}
|
cs |
아래 책은 제가 공부할때 활용했던 책으로 추천드리는 책이니 한번씩 읽어보시는것을 추천드립니다!! ㅎㅎ
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
'Back-End > Spring' 카테고리의 다른 글
jQuery 이벤트 바인딩 (0) | 2019.06.30 |
---|---|
드래그앤드롭, ajax 방식의 파일 업로드 (0) | 2019.06.28 |
Spring 자바스크립트 난독화 (0) | 2019.06.28 |
인터셉터 (Interceptor) (0) | 2019.06.27 |
AOP와 트랜잭션 처리 실습 (코드로 테스트) (0) | 2019.06.26 |