學習啦 > 學習電腦 > 電腦安全 > 病毒知識 > QQ盜號木馬之逆向分析

QQ盜號木馬之逆向分析

時間: 若木635 分享

QQ盜號木馬之逆向分析

  電腦已經走進我們的生活,與我們的生活息息相關,感覺已經離不開電腦與網絡,對于電腦安全防范,今天小編在這里給大家推薦一些電腦病毒與木馬相關文章,歡迎大家圍觀參考,想了解更多,請繼續(xù)關注學習啦。

  一般來說,病毒分析不會涉及到算法問題,如果是要分析算法(如我之前對于CM4注冊機制的分析),那么我們更多地是需要關注程序的流程與邏輯,一般不深究CALL的具體內容。而病毒分析則往往需要搞清楚各個不同的CALL的意義,才能夠弄清楚病毒的行為。所以本文的第一部分著重講述對這些CALL的剖析。而第二部分則簡單討論一下進程守護技術的實現(xiàn)。

  逆向分析

  這里我們跳過程序的初始化部分,來到第一個API函數(shù)的位置:

  我們能夠直接看到的第一個API函數(shù)是GetModuleFileName,這個函數(shù)用于獲取當前進程已加載模塊的文件的完整路徑,該模塊必須由當前進程加載。而該函數(shù)的返回值則是文件路徑長度,該返回值保存在了EAX中,為2B,也就是說路徑長度為2B個字符??梢钥匆幌滤祷氐穆窂绞鞘裁?。路徑保存在“PathBuffer”中,跟蹤該地址查看:

  可見程序已正確獲取了當前文件的地址。然后繼續(xù)分析下一個API函數(shù):

  這里出現(xiàn)了ShellExecute這個函數(shù),它的功能是運行一個外部程序(或者是打開一個已注冊的文件、打開一個目錄、打印一個文件等等),并對外部程序有一定的控制。具體到本程序,ShellExecute會運行Explorer.exe程序來打開“d:\”,其實也就是使用程序管理器打開D盤根目錄。但是執(zhí)行這個API函數(shù)是有條件的,它需要根據(jù)第二行CALL語句的結果進行判定,那么有必要進入這個CALL,看看需要滿足什么條件才能夠執(zhí)行ShellExecute。

  進入oso.00403C48這個函數(shù)

  程序會對EAX和EDX中的內容進行比對,其中EAX保存的字符串就是我們之前使用GetModuleFileName所獲取的當前文件的路徑,只不過被轉化成了大寫字符。而EDX保存的是D盤根目錄下的OSO.EXE這個文件路徑。二者在這里很明顯是不同的。所以黃色高亮顯示的條件跳轉語句也就不成立,程序會繼續(xù)順序執(zhí)行:

  這里需要說明的是,由于本病毒是由Delphi編寫的,那么字符串首地址減去4后,取出的4字節(jié)內容便是此字符串的長度。因此的前兩句代碼意思就是獲取兩個路徑的字符數(shù),然后通過相減進行比較。這里很明顯當前路徑的字符數(shù)量是要大的,因此黃色高亮顯示的條件跳轉成立,來到oso.00403C6B的位置:

  這里依舊是字符的比較,由于二者不相等,所以最后一句的條件跳轉成立,來到oso.00403CD1的位置:

  這里比較的是盤符,也是不相等的,所以條件跳轉成立,本函數(shù)也就執(zhí)行完畢了。綜合上述分析,這段函數(shù)的功用是判斷當前所執(zhí)行的文件是不是位于D盤的根目錄下,如果是,則執(zhí)行中的ShellExecute這個函數(shù),反之則跳過這個函數(shù)執(zhí)行。由于我們的這個程序是位于桌面上的,因此不執(zhí)行ShellExecute函數(shù)。

  接下來程序還會繼續(xù)判斷當前程序是否位于E、F、G、H、I盤根目錄下,如果不是,那么也就不執(zhí)行相應的ShellExecute函數(shù)。

  之后程序會調用名為oso.004050F0的函數(shù),進入其內部分析:

  可見病毒程序調用了GetSystemDirectory函數(shù)用于獲取系統(tǒng)目錄。一般來說,惡意程序使用這個函數(shù)的目的就是要將自身復制到系統(tǒng)目錄中,以迷惑用戶(詳見《反病毒攻防研究第001篇:自我復制與自刪除》)。之后病毒程序會將字符“severe.exe”與上面獲得的系統(tǒng)目錄字符串進行組合,新的路徑也就是病毒程序需要隱藏的位置:

  之后可以看到CreateFile函數(shù):

  但是這個CreateFile函數(shù)的執(zhí)行是有條件的,它取決于第一行代碼中的CALL的返回值。進入這個CALL進行分析,可以找到:

  程序調用了FindFirstFile函數(shù)來查找系統(tǒng)目錄中有沒有severe.exe這個文件,如果沒有(返回值為-1)則不執(zhí)行的CreateFile函數(shù)。由此可見,CreateFile函數(shù)在這里的作用不是創(chuàng)建文件,而是打開文件。接下來就是文件的復制操作:

  之后又是一系列的文件復制,病毒會將自身改名為tfidma.exe,并復制到系統(tǒng)目錄中。還會將自身改名為conime.exe,復制到系統(tǒng)目錄的drivers文件夾中。類似的操作不再贅述。之后程序就會再次調用ShellExecute函數(shù),以執(zhí)行所創(chuàng)建出來的這些程序。因此在“資源管理器”中就會出現(xiàn)severe.exe、conime.exe與tfidma.exe等進程。可以說在這個時候,我們的計算機就已經中病毒了。接下來我們會遇到線程的創(chuàng)建函數(shù):

  CreateThread函數(shù)往往與Sleep或者WaitForSingleObject函數(shù)相配合使用。因為每個線程都有自己的CPU時間片,當主線程創(chuàng)建了新線程后,它的CPU時間片有時并沒有完,它還可以繼續(xù)執(zhí)行。有時候如果主線程的代碼非常少,那么在CPU指定的CPU時間片中主線程執(zhí)行完后就退出了。主線程結束,那么意味著程序也就結束了,所以在這種情況下,我們自己創(chuàng)建的線程根本就沒有被執(zhí)行到。所以我們需要讓主線程等待我們創(chuàng)建的線程,就需要使用Sleep或者WaitForSingleObject函數(shù)。本程序所采用的就是Sleep函數(shù)(等待1.3秒)。

  根據(jù)OD對CreateThread函數(shù)的解析可以知道,該線程所調用的是oso.00404958這個函數(shù)。分析這個函數(shù)可以知道,它主要是創(chuàng)建了名為“hx1.bat”的批處理文件并執(zhí)行,而該批處理的內容為:

  其主要作用就是修改系統(tǒng)時間,測試本地網絡系統(tǒng)并刪除自身。病毒的常規(guī)分析部分就是這些。

  三、進程守護技術原理

  進程的守護技術最早應該是源于“中國黑客病毒(worm.runouce)”,它開創(chuàng)性地采用了“三線程”結構。創(chuàng)建三線程就是為了更好地保護程序自身不被關閉和刪除。我們可以將想要執(zhí)行的代碼放在主線程里,然后再生成兩個輔助線程,它們的功能就是實現(xiàn)對程序的保護,防止程序被用戶關閉或刪除。在此,稱我們的可執(zhí)行文件的進程為主進程。兩個輔助線程相互實時監(jiān)視,如果監(jiān)視對象被關閉了,就重新創(chuàng)建線程或進程。比如病毒程序可以選擇Explorer.exe和Taskmgr.exe作為遠程進程駐體。如果用戶知道了遠程線程的駐體為資源管理器后,就會打開任務管理器來結束Explorer,這時我們再把遠程線程駐入到任務管理器中。也就是說,只要Explorer或Taskmgr有一個存在,就不可能結束主進程。如果有其它結束進程的工具,你就可以將其關閉掉,只要資源管理器和任務管理器均不存在時,就沒有駐體來維持遠程進程。不過,如果我們選擇的遠程進程為隨機的,或者就是病毒自創(chuàng)的,這就不容易發(fā)現(xiàn)了。

  這種三線程結構的程序框架大致如下(代碼來自《淺析三線程程序開發(fā)思路與實現(xiàn)》):

  // 1.主線程:main // 獲得操作系統(tǒng)的系統(tǒng)目錄

  GetSystemDirectory(syspath,MAX_PATH); // 查詢系統(tǒng)目錄下病毒是否存在

  FindFirstFile(virusname,&fdata); // 如果系統(tǒng)目錄下沒有,在將正在運行的程序復制到系統(tǒng)目錄下

  CopyFile(curname,tname,TRUE); // 在查詢完畢后,關閉相關句柄

  FindClose(ffhandle); // 打開系統(tǒng)目錄下的文件

  CreateFile(kname,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); // 修改時間

  SetFileTime(fchandle,&ftime,NULL,&ftime); // 設置屬性

  SetFileAttributes(kname,FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM ); // 創(chuàng)建駐留在主進程內的輔助監(jiān)視線程

  CreateThread(NULL,0,watch,(LPVOID)rthread,0,NULL);

  // 2.本地輔助監(jiān)視線程:watch // 以查詢方式打開注冊表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

  RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_QUERY_VALUE,&hkey); // 查詢是否存在virusname的鍵值

  RegQueryValueEx(hkey,_T("virusname"),NULL,NULL,(LPBYTE)lpdata,&dwbuflen); // 如果沒有相關鍵值,就以寫方式再次打開注冊表

  RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_WRITE,&hkey); // 寫入我們想要的東西,系統(tǒng)每次啟動都會運行我們的可執(zhí)行文件;

  RegSetValueEx(hkey,_T("virusname"),NULL,type,(const byte *)wtname,dwbuflen); // 獲得遠程線程的運行情況,看是否為STILL_ACTIVE,如果不是則創(chuàng)建遠程線程

  GetExitCodeThread(wethread,&exitcode);

  // 3.遠程線程:remote // 以所有可能的訪問方式打開主進程,以便監(jiān)視主進程的運行情況

  tOpenProcess(PROCESS_ALL_ACCESS,FALSE,erp->rpmousepid); // 等待直到主進程結束

  tWaitForSingleObject(erp->rpprocesshandle,INFINITE); // 重新啟動我們的可執(zhí)行文件

  tWinExec(erp->rpwinexecname, 0);

  // 4.獲得進程ID:processtopid // 列舉所有的進程

  EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded); // 以查詢信息和讀取的方式打開進程

  OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]); //獲得進程模塊的句柄

  EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded); // 獲得特定模塊的名字,以備比較

  GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));

  // 5.創(chuàng)建遠程線程:createremote // PROCESS_CREATE_THREAD for CreateRemoteThread

  // PROCESS_VM_OPERATION for VirtualAllocEx // PROCESS_VM_WRITE for WriteProcessMemory

  OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,remotepid); // 在遠程進程中分配空間,以備將線程代碼置入其中

  VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE); // 將遠程線程remote的代碼寫入到遠程進程的地址空間中

  WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL); // 將遠程線程所需的參數(shù)也寫入到遠程進程的地址空間中

  WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL); // 創(chuàng)建遠程監(jiān)視線程

  CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);

  畢竟本系列不是教大家編寫病毒,而是剖析病毒的大概思路,所以上述程序大家有個大概的印象即可,這樣在以后的實際分析中,就能有大概的應對思路。

  四、小結

  至此,QQ盜號木馬(oso.exe)病毒程序的分析就到這里。希望大家喜歡.

95179