病毒程序的重定位+動態獲取API+獲取kernel32.dll基地址+鈎子+駐留內存


1. 病毒程序:1)宿主:被病毒感染的程序。例如:exe dll office文檔

  2)重定位:在病毒體中使用絕對位置規定的變量或入口地址,病毒體被插入到宿主程序時,這些規定的絕對位置可以已經被宿主程序使用,從而病毒體無法使用。為保證病毒體在宿主中正常執行,需要在病毒代碼中使用重定位的技術。

3)重定位的實現:

病毒代碼重定位

call @@1

@@1:pop edx

……….

mov eax,[edx+(offset sum-offset @@1)];

……….

sum dd ? ;絕對地址

說明:

使用call指令,將@@1處地址放入堆棧,使用pop指令,取出地址到edx中,使用offset sum-offset @@1表示sum相對於@@1的RVA,加上edx,就得到sum變量在宿主中的絕對地址。

4)動態獲取API:病毒代碼實現要搜索文件、讀寫文件、進行進程枚舉等操作,需要大量的API函數。病毒體代碼在宿主進程空間中如何獲取病毒體所調用的API函數在宿主進程空間中的地址.

動態獲取API實現:首先需要獲得kernel32.dll基地址,kernel32.dll幾乎在所有的Win32 進程中都要被加載。

使用Kernel32.DLL中的LoadLibrary GetProcAddress 兩個API可以獲取任意DLL中導出的任意函數在進程空間中的位置。

三種獲取kernel32.dll基地址的技術

暴力搜索法: 通過線程初始化時, 獲得esp堆棧指針中的ExitThread函數的地址,然后通過搜索獲得kernel32.dll的基地址。

異常處理鏈表搜索法:遍歷seh異常鏈,然后獲得EXCEPTION_REGISTRATION結構prev為-1的異常處理過程地址,這個異常處理過程地址是位於kernel32.dll,通過它搜索得到kernel32.dll的基地址。

PEB: 通過TEB獲得PEB結構地址,然后再獲得PEB_LDR_DATA結構地址,然后遍歷模塊列表,查找kernel32.dll模塊的基地址。

  暴力搜索法

線程在被初始化的時,其堆棧指針指向ExitThread函數的地址,windows這樣做是為了退出線程時通過ret來調用ExitThread函數。

則:在主線程的起始位置(程序入口點)通過獲得當前堆棧指針,從而得到ExitThread函數地址。

例如:mov  edx, [esp] 

獲得堆棧指針中ExitThread地址到edx寄存器。

因為ExitThread函數是kernel32.dll的輸出函數,獲取的地址在kernel32.dll空間中,可以通過它往上搜索來獲得kernel32.dll基地址。

kernel32.dll中塊對齊值是00001000h, pe文件被裝入內存時按64k對齊 ,所以可以通過1000h  (64K) 作為跨度進行搜索,加快搜索速度。

如何確定搜索到的地址是基地址呢?

1)如果這個地址的前兩個字節是否是"MZ“

2)使用該地址定位到PE頭結構,然后判斷是否是“PE”

如果這兩個都符合,則表示這個地址就是基地址。

暴力搜索是有缺陷

代碼必須運行在進程起始地址中

如果搜索的內存為不可讀時,電腦就會藍屏

暴力搜索法

  mov  edx, [esp] 
 .Next:  
  dec  edx  ;
  xor  dx, dx  ; 減去跨度,edx的底16位置零
  cmp  word [edx], “ZM”
  jz  .IsPe
  jmp  .Next 
 .IsPe:
  mov  eax, [edx+3ch]
  cmp  word [eax+edx], ‘EP’
  jnz  .Next
  xchg  eax, edx   ; eax = kernel32 基地址

異常處理鏈表搜索法

UNhandledExceptionFilter地址保存在結構_EXCEPTION_REGISTRATION 中。當異常發生時,操作系統將調用這個結構中的hanlder所指向的回調函數。 

遍歷seh異常鏈,獲得EXCEPTION_REGISTRATION結構,如果成員prev為-1,則這個異常處理過程地址是位於kernel32.dll,通過它搜索得到kernel32.dll的基地址。

遍歷的方法: [fs:0]定位的ExceptionList 指向EXCEPTION_REGISTRATION結構,通過[fs:0]獲得EXCEPTION_REGISTRATION結構后,判斷prev成員是否是-1,如果是則取異常處理過程地址handler,然后進行搜索。

PEB

原理:在NT內核系統中fs寄存器指向TEB結構,TEB+0x30處指向PEB結構,PEB+0x0c處指向PEB_LDR_DATA結構,PEB_LDR_DATA+0x1c處是一個叫InInitialzationOrderModuleList的成員,指向LDR_MODULE雙向鏈表結構,存放一些動態鏈接庫地址:

第一個指向ntdl.dll

第二個就是kernel32.dll

PEB

;find kernel32.dll
find_kernel32:
push esi
xor eax, eax
mov eax, [fs:eax+0x30]
test eax, eax
js find_kernel32_9x ;win9x or nt
find_kernel32_nt:
mov eax, [eax + 0x0c]
mov esi, [eax + 0x1c]
lodsd
mov eax, [eax + 0x8]
jmp find_kernel32_finished
find_kernel32_9x:
mov eax, [eax + 0x34]
lea eax, [eax + 0x7c]
mov eax, [eax + 0x3c]
find_kernel32_finished:
pop esi
ret 

得到了kernel32的基地址,下一步就是定位到引出表找到GetProcAddress的地址。對於給定的API,搜索其地址可以直接通過Kernel32.dll的輸出表信息搜索,PE頭+120處就是引出表的文件地址。

一般是先搜索出GetProcAddress和LoadLibrary兩個API函數的地址,然后利用這兩個API函數得到其他所需要的API函數地址。

需要的字段:
AddressOfFunction字段:指向模塊中所有函數地址的數組
AddressOfNames字段:指向模塊中所有函數名稱的數組
AddressOfNameOrdinals字段:指向AddressOfNames數組中函數對應序數的數組 

2.病毒:

 狹義:計算機病毒是指編制或者在計算機程序中插入的破壞計算機功能或者破壞數據,影響計算機使用並且能夠自我復制的一組計算機指令或者程序代碼

  廣義:

是一種人為制造的、能夠進行自我復制的、具有對計算機資源進行破壞作用的一組程序或指令集合。

3.鈎子是Windows系統中非常重要的系統接口,它可以截獲並處理送給其他應用程序的消息,來完成普通應用程序難以實現的功能。

鈎子可以監控系統或進程中的各種事件消息,截獲發往目標窗口的消息並進行處理。

本質:處理message的一段程序

4.駐留程序是一種特殊應用程序,它在裝入內存運行退出后,其部分代碼仍然駐留在內存,當該段代碼被激活時,它又進入運行狀態。常用的駐留程序是作為某個中斷處理程序的一部分,其激活條件就是系統產生了此中斷的中斷請求。 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com