Post

LLM 을 활용한 분석 자동화 도구 개발

LLM 을 통해 더 강력한 도구를 만들려고 한다.

LLM 을 활용한 분석 자동화 도구 개발

LLM 을 통한 도구 개발

오픈소스에 생성형 AI 를 활용한 자동화 도구를 만들 수 있다고 한다. 이에 나아가 현재 가장 활발하게 사용하고 있는 툴에 스크립트를 연결하여 LLM 도구를 활용해보고자 한다. 모델을 사용하기 전 API 키를 발급받아 적용해야 하는데 이 페이지에서 해당 내용은 다루지 않는다.

만들고자 하는 내용은 이렇다.

Deobfuscated Code from LLM

툴에서 제공되는 API 를 통해 디컴파일된 코드를 얻는다. 이는 난독화가 되었을 수 있고 그렇지 않을 수 있다. 이때 해당 코드를 포함하여 커스텀 프롬포트를 메세지 바디에 담아서 LLM 모델에 API Query 를 보낼 것이다.

그리고 처리된 응답 메세지에서 코드 부분을 발췌하여 콘솔 창 또는 윈도우 아니면 기존 코드로부터 변경하여 적용해준다.

아래와 같이 변수명이 날라가고 함수명이 날라가고 로직이 이해하기 어렵게 되었을 때 시도해보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static final java.lang.String c(java.lang.String s, java.lang.String s1) {
    if(!jk0.e.k(s)) {
        try {
            java.security.MessageDigest messageDigest0 = java.security.MessageDigest.getInstance("SHA-256");
            byte[] arr_b = s.getBytes(Qi0.a.b);
            kotlin.jvm.internal.m.f(arr_b, "getBytes(...)");
            byte[] arr_b1 = messageDigest0.digest(arr_b);
            return s1 == null || jk0.e.k(s1) ? EQ.V0.p(arr_b1) : EQ.V0.p(arr_b1) + "." + s1;
        }
        catch(java.security.GeneralSecurityException unused_ex) {
        }
    }
    return "";
}

스크립트를 구동하여 결과를 얻으면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Original method name: c
public static final java.lang.String hashStringWithOptionalSuffix(java.lang.String inputString, java.lang.String optionalSuffix) {
    // Original variable name: s
    if(!StringUtils.isEmpty(inputString)) {  // Check if the input string is not empty
        try {
            // Original variable name: messageDigest0
            java.security.MessageDigest sha256Digest = java.security.MessageDigest.getInstance("SHA-256");  // Get SHA-256 MessageDigest instance
            
            // Original variable name: arr_b
            byte[] inputBytes = inputString.getBytes(CharsetUtils.DEFAULT_CHARSET);  // Convert input string to bytes using default charset
            kotlin.jvm.internal.m.f(inputBytes, "getBytes(...)");  // Ensure the conversion to bytes is valid
            
            // Original variable name: arr_b1
            byte[] hashedBytes = sha256Digest.digest(inputBytes);  // Perform the SHA-256 hash computation
            
            // Original variable name: s1
            return optionalSuffix == null || StringUtils.isEmpty(optionalSuffix) ? HashUtils.encodeToBase64(hashedBytes) : HashUtils.encodeToBase64(hashedBytes) + "." + optionalSuffix;  // If optionalSuffix is null or empty, return the hash, otherwise return hash with optional suffix
        }
        catch(java.security.GeneralSecurityException exception) {
            // Catch security exception but do nothing
        }
    }
    return "";  // Return empty string if input string is empty
}

해당 스크립트를 좀 더 다듬어 자동화를 시켜보고자 한다.

사용 후

오히려 더 어려워지는 감이 없지 않아 있고 놓치는 부분들이 많이 보인다. 조금 시간이 걸리더라도 수동으로 하는 게 지금은 좀 더 좋아보인다. 특히 클래스 메소드를 참조한 코드를 보거나 매개변수를 유추할 때 꽤 많이 혼란을 주어 어려움이 더 커지는 경향이 있다.

하지만 사용해보면서 이런 도구도 만들 수 있구나 경험도 해보았으니 이 부분으로 만족해보려고 한다. 좀 더 좋은 삶의 질을 향상할 수 있는 방안이 있다면 해당 프로젝트를 확장하거나 다른 프로젝트를 통해 개발을 진행해보려고 한다.

This post is licensed under CC BY 4.0 by the author.
If you find any errors, please let me know by comment or email. Thank you.

© Ruffalo. Some rights reserved.

I'm

Using the Chirpy theme for Jekyll.