Malware

Lazarus Keylogger (HSMBalance.exe) (+복호화 추가)

wsoh9812 2021. 3. 3. 14:48

 

분 석


 

 

MD5 34404a3fb9804977c6ab86cb991fb130

SHA256 : c6930e298bba86c01d0fe2c8262c46b4fce97c6c5037a193904cfc634246fbec

 

 

WinMain

 

위 사진은 WinMain 코드이다. 

생각보다 많은 기능이 존재하지 않는것 같고, sub_5B1370()만 분석하면 끝날 것 같다.

 

 

 

먼저

sub5b1370()함수 전체흐름을 보겠습니다.

sub_5B1370() (1/2)

Temp 폴더에 Downloads라는 폴더를 하나 생성을합니다.

[중요] 뒤에 나오겠지만, 이 경로에 키로깅 정보가 저장됩니다.

그리고 스레드 3개정도를 만들어 주는데, 이 쓰레드들이 핵심 기능을 합니다.!

 

sub_5B1370() (2/2)

이후

[중요] 'C:\Windows\Temp\TMP0389A.tmp' 경로에 특정파일이 생성됩니다. 

이 파일에는 Temp/Downloads의 절대경로가 하드코딩 되어있습니다. 

아래 사진 참고!

(뭐,,,, 키로깅 행위를하는데 있어서 중요한 역활을 하지 않는것으로 보입니다.)

 

C:\Windows\Temp\TMP0389A.tmp

 

 

 

 

이제 3개의 함수를 순차적으로 분석 해보겠습니다.

 

 

 

StartAddress()


KeyLogging Routine

 

키로깅 정보를 들고 sub_5b1a00()함수로 들어가게 됩니다.

 

 

 

sub_5b1a00() 내부

키로깅 정보가  '..../temp/Downloads/'에 저장되게 됩니다.

 

하지만 평문으로 저장되는것이 아닌!!!

Keylogging info encrypt 

[중요]

 xor을 거친후에 저장됩니다.

이 부분을 패치하여 평문으로 저장시켜 보았습니다.

그 결과는 아래의 이미지 입니다.

 

평문으로 저장된 결과

[중요] '날짜, 시간, 키, Windows 최상위 창의 title'가 로깅됩니다.

 

 

 

아래의 사진은 직접 복호화 코드를 짜서 돌려본 것입니다.

복호화 

[참고] 복호화 소스코드는 맨 아래에 있습니다.!

 

 

 

또한

[중요] CTRL+V를 눌렀을때 클립보드의 내용도 로깅합니다!

 

 

 

 

 

 

sub_5B2710


이 함수는 화면 캡쳐기능을 포함하고 있습니다.

 

먼저 위와 같은 파일형식으로 '%temp%\Downloads'에 저장되는데... 

 

'tmp_[사용자명]_년도월_시간' 형식을 가집니다.

 

 

Screen Capture (1/2)
Screen Capture (2/2)

 

사실 이 함수에 있는 API들이 직관적으로 와닿지 않아 API들에 대해 검색을 해보았습니다.

 

[중요]

GetDC, GetSystemMetrics, CreateCompatibleDC, GetDIBits... 등의 API들이 화면을 캡쳐할때 사용되는 것을 알 수 있었습니다.

 

화면을 캡쳐한후 위와 같이 저장이 되는데.. 

 

HxD.exe

[중요] 앞에 8바이트는 시간 정보를 써주고 뒤에 압축파일로 저장이 됩니다.

 

그래서 시간 정보를 지우고 파일을 열어 보았습니다.

 

뭔가 알 수 없는 파일 형태였습니다....

( 분명 화면 캡쳐 정보가 맞긴한데.. 어떻게 이걸 볼 수 있을까요.. )

 

i dont know..

sub_5B17C0


sub_5B17C0

사실 이 쓰레드의 기능은 도저히 이해를 할 수 없습니다.

 

 

 

[중요] 'c:\windows\temp\tmp1105.tmp' 파일이 있으면 무한루프로 빠집니다.

만약 이 파일을지우게 되면 다시 정상적으로 돌아가고...

 

이 함수는 그냥 넘겨도 될 부분 같습니다.!

 

결 론


키로깅(+클립보드), 화면캡쳐기능을 가지고 있다...

 

BUFFER=[0xD,0XF0,0XAD,0XBA]

def sub_3E50():
    v2 = 0
    byte_5592C=['k','e','y']
    a2 = [ i for i in range(0,256)]
    
    for i in range(0,256):
        v5 = a2[i]
        v2 = (v5+ord(byte_5592C[i%3])+v2) % 256

        a2[i], a2[v2]  = a2[v2] ,a2[i]

    
    return a2
    
    

def decrypt(input,length ):
    rndData = sub_3E50()
    v4 = 0
    v5 = 0 
    res =""

    for i in range(0,len(input)):
        v4 = (v4+1) % 256
        v7 = rndData[v4]
        v5 = (v7+v5) % 256
        rndData[v4],rndData[v5] = rndData[v5], rndData[v4]
        res += chr(input[i] ^ rndData[(v7+rndData[v4]) % 256 ])
    return res
    
    
if __name__ == "__main__":
    f = open("tmp_cluber","rb")
    data = f.read()[4:]
    dec_str = decrypt(data,0)
    
    print(dec_str)
    with open('out.txt','wb') as k:
        k.write(dec_str.encode())