Java 난독화

in_ho_·2022년 9월 19일
0

난독화

목록 보기
1/1
post-thumbnail

난독화

업무를 하던 중 솔루션을 다른 업체에게 보내주어야 할 일 있어서 사용이 가능한 것을 정리해 봤습니다.

목적

Java는 바이트 코드로 변환되어 JVM이 실행되게 됩니다.. 바이트 코드 자체가 디컴파일이 용이하기 때문에 코드의 완벽한 난독화는 있을 수 없다고 합니다. 하지만 난독화가 되어 있는 것과 그냥 코드와는 해독하는 비용 자체가 다르다고 할 수 있고, 그렇기 때문에 코드가 유출되는 것을 방지하기 위해 난독화를 사용합니다.

준비

obfuscator

난독화를 하는 라이브러리를 찾으면 대표적으로 proguard가 나오게 된다. 주로 안드로이드에서 난독화를 사용할 때 해당 라이브러리를 사용하고 있었고, Spring Project에서 대표적인 예시를 찾지 못했기 때문에 proguard가 아닌 이를 대신할 라이브러리를 찾다가 obfuscator라는 라이브러리를 찾게 되었습니다.

해당 라이브러리는 GUI 모드, 터미널 모드를 지원합니다.

사용방법

java -jar obfuscator.jar --jarIn 변환할 jar --jarOut 변환 후 생성될 jar명 [--config 난독화 설정파일]

설정파일

  • GUI 모드가 빈약하기도 하고, 설정이 정상적으로 수행이 되기도 안되기도 하므로(가끔 원인 미상의 에러) 아래에 제가 사용한 난독화 설정 파일을 남깁니다.(GUI 모드에서 Config파일 생성 가능)
{
  "input": "변환할 jar명",
  "output": "변환 후 생성될 jar명",
  "script": "function isRemappingEnabledForClass(node) {\n    return false;\n}\nfunction isObfuscatorEnabledForClass(node) {\n    return true;\n}",
  "libraries": [],
  "Crasher": {
    "Enabled": false
  },
  "InvokeDynamic": {
    "Enabled": false
  },
  "HWIDPRotection": {
    "Enabled": false,
    "HWID": "DC514B81D7B7121B99E35E714BC89756"
  },
  "Optimizer": {
    "Enabled": false,
    "Replace String.equals()": false,
    "Replace String.equalsIgnoreCase()": false,
    "Optimize static string calls": false
  },
  "LineNumberRemover": {
    "Enabled": false,
    "Rename local variables": true,
    "Remove Line Numbers": false,
    "Remove Debug Names": true,
    "Add Local Variables": false,
    "New SourceFile Name": ""
  },
  "StringEncryption": {
    "Enabled": false,
    "HideStrings": false,
    "AES": false
  },
  "NumberObfuscation": {
    "Enabled": false,
    "Extract to Array": true,
    "Obfuscate Zero": true,
    "Shift": false,
    "And": false,
    "Multiple Instructions": true
  },
  "ReferenceProxy": {
    "Enabled": false
  },
  "ShuffleMembers": {
    "Enabled": false
  },
  "InnerClassRemover": {
    "Enabled": false,
    "Remap": false,
    "Remove Metadata": false
  },
  "NameObfuscation": {
    "Enabled": false
  },
  "Packager": {
    "Enabled": false,
    "Use MainClass from the JAR manifest": true,
    "Main class": "org.example.Main"
  },
  "FlowObfuscator": {
    "Enabled": true,
    "Mangle Comparisons": true,
    "Replace GOTO": true,
    "Replace If": true,
    "Bad POP": true,
    "Bad Concat": true,
    "Mangle Switches": false,
    "Mangle Return": false,
    "Mangle Local Variables": false
  },
  "HideMembers": {
    "Enabled": false
  },
  "Inlining": {
    "Enabled": false
  }
}

0개의 댓글