본문으로 바로가기

UserAssist 레지스트리 분석

category Language/Python 2022. 4. 3. 04:45
728x90
반응형
레지스트리 분석으로 사용했던 프로그램을?
윈도우 레지스트리 정보에는 사용했던 프로그램 정보들을 가지고 있는 항목이 있습니다. 윈도우 10에서 확인해 본 결과 경로는 다음과 같습니다. 
 
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\Count}
 
레지스트리 정보는 "Windows" 를 누르신 후, reg 까지 입력하면 자동으로 레지스트리 편집기를 찾아줍니다. 
 
암호화 되어있는 레지스트리 정보
아래의 사진은 제가 쓰고 있는 실제 컴퓨터에서 사용했던 프로그램 목록이 들어있는 레지스트리 정보입니다. 보시는 바와 같이 알 수 없는 문자열로 되어있습니다.

이유는 ROT13을 이용해 암호화 되어있기 떄문입니다. ROT13 암호화 방식이 궁금하신 분은 따로 찾아보시길 바라고 이번 포스팅은 이 암호화된 정보를 디코딩한 코드만 올려놓겠습니다.

 
Description
lowerLETTERS = [chr(x) for x in range(97, 123)];
upperLETTERS = [chr(x) for x in range(65, 91)];
우선 복호화 시켰을 무슨 어떤 문자랑 일치하는지 확인하기 위해 소문자와 대문자를 컴프리헨션을 통해 리스트로 만들어줍니다.
def encrypt(char, letters):
    retString = '';
    originalIndex = letters.index(char)
    newIndex = originalIndex + 13
    retString += letters[newIndex % len(letters)]
    return retString
encrypt 함수는 rot13() 이라는 함수에서 사용될 함수입니다.
def rot13(String):
    resultString = "";
    for str_ in String:
        if str_.isupper():
            resultString += encrypt(str_, upperLETTERS);
        elif str_.islower():
            resultString += encrypt(str_, lowerLETTERS);
        else:
            resultString += str_;
    return (resultString)
rot13() 이라는 함수는 매개변수로 받은 문자열 값을 복호화 시킬 때 사용합니다. for문을 통해 문자열을 대문자와 소문자랑 일치하는지 확인한 뒤 있으면 resultString에 추가해주는 방식이고 반복문이 끝나면 복호화 시킨 문자열을 리턴합니다.
from winreg import *

varSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" \
            "\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count"
Key = CreateKey(HKEY_CURRENT_USER,varSubKey)

for x in range(0,100):
    try:
        a, b, c = EnumValue(Key, x)
        ExecuteFile = rot13(a)
        if ".exe" in ExecuteFile:
            print(ExecuteFile)
    except Exception as e:
        print(e)
제가 올린 포스팅 중에 레지스트리를 다루는 파이썬 모듈에 대해 소개한 적이 있습니다 그 포스팅을 참조하셔서 위 내용을 이해하시면 편합니다.
 
Result!

코드를 실행해본 결과 제가 어떤 프로그램을 사용했는지 잘 확인 됩니다.

 
더보기
# userasist 레지스트리
# 암호화 된 레지스트리 키 값 복호화 시키기

lowerLETTERS = [chr(x) for x in range(97, 123)];
upperLETTERS = [chr(x) for x in range(65, 91)];

def rot13(String):
    resultString = "";
    for str_ in String:
        if str_.isupper():
            resultString += encrypt(str_, upperLETTERS);
        elif str_.islower():
            resultString += encrypt(str_, lowerLETTERS);
        else:
            resultString += str_;
    return (resultString)

def encrypt(char, letters):
    retString = '';
    originalIndex = letters.index(char)
    newIndex = originalIndex + 13
    retString += letters[newIndex % len(letters)]
    return retString

def hexToDecimal(param1):
    byteToHexString = param1.hex()
    total = int()
    for x in range(0, len(byteToHexString)):
        if x %2 == 0:
            testA = byteToHexString[x:x+2]+''
            total += int(testA,16)
    return total

from winreg import *

varSubKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" \
            "\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count"
Key = CreateKey(HKEY_CURRENT_USER,varSubKey)

for x in range(0,100):
    try:
        a, b, c = EnumValue(Key, x)
        ExecuteFile = rot13(a)
        if ".exe" in ExecuteFile:
            ExecuteNumber = hexToDecimal(b[4:8])
            print(ExecuteFile,ExecuteNumber)
    except Exception as e:
        print(e)


 

 

728x90
반응형