一款勒索病毒的詳細分析

Editor發表於2017-10-26

一款勒索病毒的詳細分析

原文出自看雪論壇:[原創]一款勒索病毒的詳細分析-『軟體逆向』-看雪安全論壇

0×01 程式資訊

大小:2,132,992 位元組

MD5:671ec2f2b246113f65a0afd1c53c5c3b

殼:UPX 0.89.6 - 1.02 / 1.05 - 2.90

編寫語言:易語言

0×02 程式行為

開機自啟

修改瀏覽器資訊

禁用UAC

程式檢測

加密檔案

傳送資料到指定郵箱

0×03 執行截圖

一款勒索病毒的詳細分析

0×04 脫殼去花指令

採用UPX加殼,通過ESP定律脫殼

一款勒索病毒的詳細分析

脫殼後: 從入口特徵判斷為VC++6.0編譯[易語言]

一款勒索病毒的詳細分析

程式插入了大量花指令

一款勒索病毒的詳細分析

用OD外掛E Junk Code 輕鬆去除

一款勒索病毒的詳細分析

去除花指令後

一款勒索病毒的詳細分析

0×05 分析思路

從病毒的行為判斷所呼叫的API,在所呼叫的API下斷點,然後通過棧回溯找到關鍵函式。

程式所用到的API:

病毒執行後會隱藏自身檔案(SetFileAttributes)

修改登錄檔資訊(RegOpenKey、RegSetValue)

遍歷檔案(FindFirstFile)等等

SetFileAttributes設定斷點,然後檢視呼叫堆疊,回溯到關鍵函式

一款勒索病毒的詳細分析

0×06 關鍵函式分析

函式功能:設定程式開機啟動、隱藏程式檔案、修改瀏覽器資訊、禁用UAC、生成解密KEY(30位隨機值)、建立加密執行緒.

一款勒索病毒的詳細分析

一款勒索病毒的詳細分析

加密所有檔案後,會在Temp目錄下生成Victim.tmp檔案,程式執行後會判斷Temp目錄下是否有Victim.tmp檔案,沒有則建立加密執行緒,如果已經存在Victim.tmp檔案,則直接載入勒索視窗。

一款勒索病毒的詳細分析

建立執行緒後,程式執行訊息迴圈,然後系統會呼叫執行緒回撥函式

一款勒索病毒的詳細分析

0×07 執行緒回撥函式分析

函式功能:遍歷全盤檔案,加密指定字尾檔案

*.zip.*.rar.*.7z.*.txt.*.doc.*.pptx.*.wps.*.jpg.*.jpeg.*.gif.*.bmp.*.png.*.swf.*.wav.*.mp3.*.mp4.*.avi.*.rmvb.*.xis.*.htm.*.html.*.e.*.ec.*.bak.*.docx.*.ico.*.rtf.*.xlsx.*.c.*.h.*.cpp.*.php.*.pps.*.pdf.*.fla.*.asm.*.dot.

加密後會生成對應字尾的檔案

*.zip ----- *.XiaoBa1

*.rar ----- *.XiaoBa2

……

執行緒回撥函式0x40F82B設定斷點

一款勒索病毒的詳細分析

進入執行緒主函式0x4065D8

一款勒索病毒的詳細分析

加密完成後

一款勒索病毒的詳細分析

0×08 勒索視窗事件分析

函式功能:把使用者的IP、CPU資訊、螢幕截圖、系統資訊、解密資訊傳送到指定郵箱

InternetOpen設定斷點,通過回溯找到關鍵函式

一款勒索病毒的詳細分析

一款勒索病毒的詳細分析

傳送的資料格式

一款勒索病毒的詳細分析

0×09 程式檢測函式追蹤

函式功能:程式載入時,會建立一個定時器,每隔一秒呼叫一次程式檢測的函式,通過CreateToolHelp32Snapshot建立程式快照的方式遍歷程式,檢測到指定程式後,會嘗試結束程式。

SetTimer設定斷點

一款勒索病毒的詳細分析

Timerproc為NULL,說明呼叫的是系統預設的回撥函式OnTimer(),DispatchMessage設定條件斷點[[esp+4]+4](esp+4 是MSG物件的地址 [esp+4]+4是訊息型別)

WM_TIMER == 0x113

一款勒索病毒的詳細分析

斷下時的堆疊如下:

一款勒索病毒的詳細分析

然後在程式碼段設定訪問中斷

一款勒索病毒的詳細分析

F9執行,直接到視窗回撥函式

一款勒索病毒的詳細分析

進入視窗回撥繼續分析,注意堆疊資料,

一款勒索病毒的詳細分析

跟進0x4AEDED

一款勒索病毒的詳細分析

跟進0x4AEE31

一款勒索病毒的詳細分析

繼續跟蹤分析onTimer,最終呼叫程式檢測函式

一款勒索病毒的詳細分析

函式檢測的程式列表:

taskmgr.exe

OllyDbg.exe

吾愛破解[LCG].exe

MSASCuiL.exe

RAVmon.exe

RAVtimer.exe

rav.exe

360Tray.exe

360Safe.exe

ZhuDongFangYu.exe

360sd.exe

KSafeSvc.exe

KSafeTray.exe

kxetray.exe

kxescore.exe

QQPCTray.exe

QQPCRTP.exe

BaiduSdSvc.exe

BaiduSdTray.exe

BaiduAnTray.exe

BaiduAnSvc.exe

avp.exe

egui.exe

ekrn.exe

MsMpEng.exe

msseces.exe

0x0A加密函式分析:

一款勒索病毒的詳細分析

用CPU序列號生成一個大小為0xFF的Key表

一款勒索病毒的詳細分析

通過計算得到一個Key表索引,取Key值異或資料

一款勒索病毒的詳細分析

IDA分析生成Key表函式

一款勒索病毒的詳細分析

IDA分析加密資料函式

一款勒索病毒的詳細分析

因為加密只採用了異或運算,所以加密演算法也是解密演算法。

檔案還原始碼

#include "stdafx.h"

#include

BYTE *__cdecl unknown_libname_467(BYTE *a1, BYTE *a2)

{

BYTE *result; // eax@1

char v3; // cl@1

result = a1;

v3 = *a1;

*a1 = *a2;

*a2 = v3;

return result;

}

int __cdecl MakeKeyTable(int a1, signed int a2, int a3)

{

signed int v3; // eax@1

int v4; // ebp@1

int result; // eax@3

int v6; // esi@4

BYTE *v7; // ebx@4

bool v8; // zf@5

signed int v9; // [sp+4h] [bp-8h]@4

unsigned __int8 v10; // [sp+18h] [bp+Ch]@4

v3 = 0;

v4 = a3;

do

{

*(BYTE *)(v3 + a3) = v3;

++v3;

} while (v3 < 256);

result = a2;

*(BYTE *)(a3 + 256) = 0;

*(BYTE *)(a3 + 257) = 0;

if (a2 > 0)

{

v10 = 0;

v6 = 0;

v7 = (BYTE *)v4;

v9 = 256;

do

{

v6 = (unsigned __int8)(*(BYTE *)(v10 + a1) + v6 + *v7);

unknown_libname_467(v7++, (BYTE *)(v6 + v4));

result = v9 - 1;

v8 = v9-- == 1;

v10 = (v10 + 1) % a2;

} while (!v8);

}

return result;

}

unsigned __int8 __cdecl Decrypt(int a1, int a2, int a3)

{

int v3; // esi@1

int v4; // ebx@1

unsigned __int8 result; // al@1

unsigned __int8 v6; // cl@1

unsigned __int8 v7; // di@2

unsigned __int8 v8; // bp@2

BYTE *v9; // ST20_4@3

BYTE *v10; // ST1C_4@3

unsigned __int8 v11; // [sp+8h] [bp-Ch]@3

unsigned __int8 v12; // [sp+20h] [bp+Ch]@1

unsigned __int8 v13; // [sp+20h] [bp+Ch]@3

v3 = a3;

v4 = 0;

result = *(BYTE *)(a3 + 256);

v6 = *(BYTE *)(a3 + 257);

v12 = *(BYTE *)(a3 + 256);

if (a2 <= 0)

{

*(BYTE *)(v3 + 256) = result;

*(BYTE *)(v3 + 257) = v6;

}

else

{

v7 = v12;

v8 = v6;

do

{

v13 = v7 + 1;

v7 = v13;

v9 = (BYTE *)(v13 + v3);

v11 = v8 + *v9;

v8 = v11;

v10 = (BYTE *)(v3 + v11);

unknown_libname_467(v9, v10);

*(BYTE *)(v4++ + a1) ^= *(BYTE *)(((*v9 + *v10) & 0xFF) + v3);

} while (v4 < a2);

result = v11;

*(BYTE *)(v3 + 256) = v13;

*(BYTE *)(v3 + 257) = v11;

}

return result;

}

int main()

{

//加密檔案

HANDLE hEntyrptFile = CreateFile(L"D:\\1.XiaoBa1", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

DWORD dwFileSize = GetFileSize(hEntyrptFile, NULL);

PBYTE pFileBuffer = new BYTE[dwFileSize];

ZeroMemory(pFileBuffer,dwFileSize);

DWORD dwRead = 0;

ReadFile(hEntyrptFile, pFileBuffer, dwFileSize, &dwRead, NULL);

//CPU序列號

char cpuid[] = "0FABFBFF000306A9";

//序列號長度

int length = 0x10;

BYTE KeyTable[257] = { 0 };

MakeKeyTable((int)cpuid, length, (int)KeyTable);

Decrypt((int)pFileBuffer, dwFileSize, (int)KeyTable);

HANDLE hDecryptFile = CreateFile(L"D:\\1.zip",GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

WriteFile(hDecryptFile, pFileBuffer, dwFileSize, &dwRead, NULL);

CloseHandle(hEntyrptFile);

CloseHandle(hDecryptFile);

delete pFileBuffer;

system("pause");

return 0;

}


本文由看雪論壇 Vamcy 原創,轉載請註明來自看雪社群

相關文章