분 석
MD5 34404a3fb9804977c6ab86cb991fb130
SHA256 : c6930e298bba86c01d0fe2c8262c46b4fce97c6c5037a193904cfc634246fbec
위 사진은 WinMain 코드이다.
생각보다 많은 기능이 존재하지 않는것 같고, sub_5B1370()만 분석하면 끝날 것 같다.
먼저
sub5b1370()함수 전체흐름을 보겠습니다.
Temp 폴더에 Downloads라는 폴더를 하나 생성을합니다.
[중요] 뒤에 나오겠지만, 이 경로에 키로깅 정보가 저장됩니다.
그리고 스레드 3개정도를 만들어 주는데, 이 쓰레드들이 핵심 기능을 합니다.!
이후
[중요] 'C:\Windows\Temp\TMP0389A.tmp' 경로에 특정파일이 생성됩니다.
이 파일에는 Temp/Downloads의 절대경로가 하드코딩 되어있습니다.
아래 사진 참고!
(뭐,,,, 키로깅 행위를하는데 있어서 중요한 역활을 하지 않는것으로 보입니다.)
이제 3개의 함수를 순차적으로 분석 해보겠습니다.
StartAddress()
키로깅 정보를 들고 sub_5b1a00()함수로 들어가게 됩니다.
키로깅 정보가 '..../temp/Downloads/'에 저장되게 됩니다.
하지만 평문으로 저장되는것이 아닌!!!
[중요]
xor을 거친후에 저장됩니다.
이 부분을 패치하여 평문으로 저장시켜 보았습니다.
그 결과는 아래의 이미지 입니다.
[중요] '날짜, 시간, 키, Windows 최상위 창의 title'가 로깅됩니다.
아래의 사진은 직접 복호화 코드를 짜서 돌려본 것입니다.
[참고] 복호화 소스코드는 맨 아래에 있습니다.!
또한
[중요] CTRL+V를 눌렀을때 클립보드의 내용도 로깅합니다!
sub_5B2710
이 함수는 화면 캡쳐기능을 포함하고 있습니다.
먼저 위와 같은 파일형식으로 '%temp%\Downloads'에 저장되는데...
'tmp_[사용자명]_년도월_시간' 형식을 가집니다.
사실 이 함수에 있는 API들이 직관적으로 와닿지 않아 API들에 대해 검색을 해보았습니다.
[중요]
GetDC, GetSystemMetrics, CreateCompatibleDC, GetDIBits... 등의 API들이 화면을 캡쳐할때 사용되는 것을 알 수 있었습니다.
화면을 캡쳐한후 위와 같이 저장이 되는데..
[중요] 앞에 8바이트는 시간 정보를 써주고 뒤에 압축파일로 저장이 됩니다.
그래서 시간 정보를 지우고 파일을 열어 보았습니다.
뭔가 알 수 없는 파일 형태였습니다....
( 분명 화면 캡쳐 정보가 맞긴한데.. 어떻게 이걸 볼 수 있을까요.. )
i dont know..
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())
'Malware' 카테고리의 다른 글
Tools and ways to bypass the AV (0) | 2022.01.06 |
---|---|
NSO의 페가수스(Pegasus) 악성코드 분석 (0) | 2021.08.07 |
불법 성매매앱으로 위장한 악성 어플리케이션 (0) | 2021.02.13 |
금융 정보 탈취 악성코드 이모텟(Emotet) (0) | 2021.01.07 |
스미싱(국민건강검진센터) 악성코드 분석 (0) | 2020.12.19 |