난독화를 하는 데 사용되었던 코드를 기록.     (자바)   (SVN, 난독화 관련)

 

 

요약

1. SVN 로그인, 해당 파일 다운로드 JAVA 코드

2. window 혹은 linux에 CLI 명령어 입력하는 JAVA코드

3. 파일에 text입력하는 JAVA 코드

4. 원하는 파일만 문자열로 받아 나머지는 삭제하는 JAVA코드 

5. 빈폴더 삭제하는 JAVA코드 

6. 압축하여 다운로드 받는 JAVA코드

 

 

 


 

            DAVRepositoryFactory.setup();
            String url = ---------url--------------;
            String name =---------id------------;
            String password = -----------pw----------;
            SVNRepository repository = null;
            try {
                repository = SVNRepositoryFactory.create(SVNURL.parseURIDecoded(url));
                ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
                repository.setAuthenticationManager(authManager);
                repository.testConnection();
            } catch (SVNAuthenticationException e) {
                return -1;
            } catch (SVNCancelException e) {
                return -2;
            }

자바 구현체에 url, id, pw를 받아서 SVN에 로그인이 가능한지 확인하는 코드.

(아이디가 없으면 -1을 return한다.)

 

 

 


 

        SVNURL url = -----------------url----------------------;
        SVNClientManager clientManager = SVNClientManager.newInstance(SVNWCUtil.createDefaultOptions(true), id, pw);
        File localRepositoryDir = new File(-----------directory---------------------);
        try {
            long checkoutRevision = clientManager.getUpdateClient().doCheckout(url, localRepositoryDir, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY, true);
        } catch (SVNAuthenticationException e) {
            result = -1;
        } catch (SVNCancelException e) {
            result = -2;
        }

지정된 SVN url에 권한이 있는지 확인 후 해당 url의 파일들을 directory경로에 다운로드 받아줌.

(아이디 혹은 권한이 없으면 -1 반환)

 

 

 


 

    public static void execute(String cd, String path, String command, String source, String output, String savePath, String domain) {
        Process process = null;
        Runtime runtime = Runtime.getRuntime();
        StringBuffer successOutput = new StringBuffer(); // 성공 스트링 버퍼
        StringBuffer errorOutput = new StringBuffer(); // 오류 스트링 버퍼
        BufferedReader successBufferReader = null; // 성공 버퍼
        BufferedReader errorBufferReader = null; // 오류 버퍼
        String msg = null; // 메시지

        List<String> cmdList = new ArrayList<String>();

        // 운영체제 구분 (window, window 가 아니면 무조건 linux 로 판단)
        if (System.getProperty("os.name").indexOf("Windows") > -1) {
            cmdList.add("cmd");
            cmdList.add("/c");
        } else {
            cmdList.add("/bin/sh");
            cmdList.add("-c");
        }

        cmdList.add(cd + " " + path + " " + "&&" + " " + command + " " + source + " " + output + " " + savePath + " " + " " + domain);

        String[] array = cmdList.toArray(new String[cmdList.size()]);

        try {

            // 명령어 실행
            process = runtime.exec(array);

            // shell 실행이 정상 동작했을 경우
            successBufferReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "EUC-KR"));

            while ((msg = successBufferReader.readLine()) != null) {
                successOutput.append(msg + System.getProperty("line.separator"));
            }

            // shell 실행시 에러가 발생했을 경우
            errorBufferReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), "EUC-KR"));
            while ((msg = errorBufferReader.readLine()) != null) {
                errorOutput.append(msg + System.getProperty("line.separator"));
            }

            // 프로세스의 수행이 끝날때까지 대기
            process.waitFor();

            // shell 실행이 정상 종료되었을 경우
            if (process.exitValue() == 0) {
                System.out.println("성공");
                System.out.println(successOutput.toString());
            } else {
                //shell 실행이 비정상 종료되었을 경우
                System.out.println("비정상 종료");
                System.out.println(successOutput.toString());
            }
            // shell 실행시 에러가 발생
            if (errorOutput.length() > 0) {
                //shell 실행이 비정상 종료되었을 경우
                System.out.println(errorOutput.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                process.destroy();
                if (successBufferReader != null)
                    successBufferReader.close();
                if (errorBufferReader != null)
                    errorBufferReader.close();

            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

window 혹은 linux에 CLI 명령어를 입력하는 코드.

 

 


 

 

        String obFile = ----------필요한 파일들 파일명---------------;

        File f = new File(--------svn에서 받아온 파일들 경로----------------);
        ArrayList<String> subFiles = new ArrayList<String>();

        if (!f.exists()) {
            return -1;
        }
        //하위 디렉토리 검색
        findSubFiles(f, subFiles);

        File file = null;

        //파일 화이트리스트에 없으면 삭제
        for (String filePath : subFiles) {
            file = new File(filePath);
            if (file.exists() && file.isFile()) {
                try {
                    if (obFile.contains(file.getName())) {

                        //JS에 주석달기 start----------------------------------------------
                        String dummy = ""; // 새로 써지는 텍스트 저장 변수

                        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
                        Date time = new Date();
                        String dt = format1.format(time);

                        String c_dt = "/*20210314*/";
                        String c_obIp = "/*100.000.000*/";
                        String c_obProjectNm = "/*jodonggu*/";
                        String c_userId = "/*jodongddng*/";

                        try {
                            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

                            String line;

                            for (int i = 0; i < 50000; i++) { // 5만줄까지 제한
                                line = br.readLine(); // 읽으며 이동

                                if (null == line) { // 읽을 것이 없으면 break
                                    break;
                                }

                                String temp_text = "";

                                if (i == 0) { // 첫번째 줄이라면
                                    temp_text = line;
                                    line = c_userId + "\r\n" + c_obProjectNm + "\r\n" + c_obIp + "\r\n" + c_dt + "\r\n" + temp_text; // 새 문장을 넣고 기존문장은 아랫줄에
                                }
                                dummy += (line + "\r\n"); // dummy에 저장
                            }

                            FileWriter fw = new FileWriter(file.getCanonicalPath());
                            fw.write(dummy);

                            fw.close();

                            br.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                      //JS에 주석달기 end----------------------------------------------
                    } else {
                        //삭제
                        File deleteFile = new File(file.getCanonicalPath());
                        deleteFile.delete();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

 

폴더 구조에서 필요한 js파일은 맨 윗줄에 주석을 달아 남기고 

필요 없는 파일은 삭제를 하는 재귀 코드

 

 

 

 

 

 

        //디렉토리에 파일 없으면 삭제
        for (String filePath : subFiles) {
            file = new File(filePath);
            if (file.exists() && file.isDirectory()) {
                try {
                    File fileList = new File(file.getCanonicalPath());
                    String[] files = fileList.list();

                    if (files.length > 0) {
                    } else {
                        fileList.delete();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

그 후 디렉토리에 파일이 없다면 디렉토리를 삭제하여 빈 폴더를 정리 

 

 

 

 

        // 압축
        String zipPath = --------------압축할 zip파일 경로---------------;

        ZipUtil.pack(new File(zipPath), new File(zipPath + ".zip"));

그 후 정리된 폴더를 압축.

압축은 ZipUtil이라는 라이브러리를 다운받아 사용

 

 

 

 

    public void dwFile(Map<String, Object> params) throws Exception {

        OutputStream outStream = null;
        FileInputStream fis = null;
        StringBuffer sb = new StringBuffer();
        sb.append(--------------zip경로 -----------------------);
        sb.append(File.separator);
        String target = ---------zip 파일 이름 -------------------------;
        try {
            outStream = response.getOutputStream();
            File file = new File(sb.toString() + target + ".zip");
            fis = new FileInputStream(file);
            response.setContentType("application/zip");
            DownloadUtils.setDisposition(target + ".zip", request, response);
            //response.setHeader("Content-Transfer-Encoding", "binary");
            String downFileNm = new String(target.getBytes("UTF-8"), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment; filename=" + downFileNm + ".zip;");
            FileCopyUtils.copy(fis, outStream);
            outStream.flush();
            response.setHeader("Set-Cookie", "fileDownload=true; path=/");

        } catch (Exception e) {
            LOGGER.error("파일 다운로드 오류");
            throw new BusinessException("파일 다운로드에 실패하였습니다.");

        } finally {
            if (fis != null) {
                fis.close();
            }
            if (outStream != null) {
                outStream.close();
            }
        }
    }

마지막으로 zip 파일 다운로드 받기 

'Project > obfuscator' 카테고리의 다른 글

javascript-obfuscator 난독화 1  (0) 2021.05.16

+ Recent posts